diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e55090179e..535d691c30 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,9 +18,9 @@ apply { from("fix-profm.gradle") } -val canonicalVersionCode = 1470 -val canonicalVersionName = "7.20.2" -val currentHotfixVersion = 1 +val canonicalVersionCode = 1476 +val canonicalVersionName = "7.21.5" +val currentHotfixVersion = 0 val maxHotfixVersions = 100 val mollyRevision = 1 diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt index 6622510668..929cab9e29 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt @@ -14,7 +14,6 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.signal.core.util.Base64 -import org.signal.core.util.SqlUtil import org.signal.core.util.logging.Log import org.signal.core.util.readFully import org.signal.libsignal.messagebackup.ComparableBackup @@ -22,12 +21,9 @@ import org.signal.libsignal.messagebackup.MessageBackup import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.thoughtcrime.securesms.backup.v2.proto.Frame import org.thoughtcrime.securesms.backup.v2.stream.PlainTextBackupReader -import org.thoughtcrime.securesms.database.DistributionListTables import org.thoughtcrime.securesms.database.KeyValueDatabase -import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.recipients.RecipientId import org.whispersystems.signalservice.api.kbs.MasterKey import org.whispersystems.signalservice.api.push.ServiceId import java.io.ByteArrayInputStream @@ -263,21 +259,7 @@ class ArchiveImportExportTests { } private fun resetAllData() { - // Need to delete these first to prevent foreign key crash - SignalDatabase.rawDatabase.execSQL("DELETE FROM ${DistributionListTables.ListTable.TABLE_NAME}") - SignalDatabase.rawDatabase.execSQL("DELETE FROM ${DistributionListTables.MembershipTable.TABLE_NAME}") - - SqlUtil.getAllTables(SignalDatabase.rawDatabase) - .filterNot { it.contains("sqlite") || it.contains("fts") || it.startsWith("emoji_search_") } // If we delete these we'll corrupt the DB - .sorted() - .forEach { table -> - SignalDatabase.rawDatabase.execSQL("DELETE FROM $table") - SqlUtil.resetAutoIncrementValue(SignalDatabase.rawDatabase, table) - } - - AppDependencies.recipientCache.clear() - AppDependencies.recipientCache.clearSelf() - RecipientId.clearCache() + // All the main database stuff is reset as a normal part of importing KeyValueDatabase.getInstance(AppDependencies.application).clear() SignalStore.resetCache() diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ChatFolderTablesTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ChatFolderTablesTest.kt new file mode 100644 index 0000000000..564f612131 --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ChatFolderTablesTest.kt @@ -0,0 +1,121 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.signal.core.util.deleteAll +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.testing.SignalActivityRule + +@RunWith(AndroidJUnit4::class) +class ChatFolderTablesTest { + + @get:Rule + val harness = SignalActivityRule() + + private lateinit var alice: RecipientId + private lateinit var bob: RecipientId + private lateinit var charlie: RecipientId + + private lateinit var folder1: ChatFolderRecord + private lateinit var folder2: ChatFolderRecord + private lateinit var folder3: ChatFolderRecord + + private var aliceThread: Long = 0 + private var bobThread: Long = 0 + private var charlieThread: Long = 0 + + @Before + fun setUp() { + alice = harness.others[1] + bob = harness.others[2] + charlie = harness.others[3] + + aliceThread = SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(alice)) + bobThread = SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(bob)) + charlieThread = SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(charlie)) + + folder1 = ChatFolderRecord( + id = 2, + name = "folder1", + position = 1, + includedChats = listOf(aliceThread, bobThread), + excludedChats = listOf(charlieThread), + showUnread = true, + showMutedChats = true, + showIndividualChats = true, + folderType = ChatFolderRecord.FolderType.CUSTOM + ) + + folder2 = ChatFolderRecord( + name = "folder2", + includedChats = listOf(bobThread), + showUnread = true, + showMutedChats = true, + showIndividualChats = true, + folderType = ChatFolderRecord.FolderType.INDIVIDUAL + ) + + folder3 = ChatFolderRecord( + name = "folder3", + includedChats = listOf(bobThread), + excludedChats = listOf(aliceThread, charlieThread), + showUnread = true, + showMutedChats = true, + showGroupChats = true, + isMuted = true, + folderType = ChatFolderRecord.FolderType.GROUP + ) + + SignalDatabase.chatFolders.writableDatabase.deleteAll(ChatFolderTables.ChatFolderTable.TABLE_NAME) + SignalDatabase.chatFolders.writableDatabase.deleteAll(ChatFolderTables.ChatFolderMembershipTable.TABLE_NAME) + } + + @Test + fun givenChatFolder_whenIGetFolder_thenIExpectFolderWithChats() { + SignalDatabase.chatFolders.createFolder(folder1) + val actualFolders = SignalDatabase.chatFolders.getChatFolders() + + assertEquals(listOf(folder1), actualFolders) + } + + @Test + fun givenChatFolder_whenIUpdateFolder_thenIExpectUpdatedFolderWithChats() { + SignalDatabase.chatFolders.createFolder(folder2) + val folder = SignalDatabase.chatFolders.getChatFolders().first() + val updatedFolder = folder.copy( + name = "updatedFolder2", + position = 1, + isMuted = true, + includedChats = listOf(aliceThread, charlieThread), + excludedChats = listOf(bobThread) + ) + SignalDatabase.chatFolders.updateFolder(updatedFolder) + + val actualFolder = SignalDatabase.chatFolders.getChatFolders().first() + + assertEquals(updatedFolder, actualFolder) + } + + @Test + fun givenADeletedChatFolder_whenIGetFolders_thenIExpectAListWithoutThatFolder() { + SignalDatabase.chatFolders.createFolder(folder1) + SignalDatabase.chatFolders.createFolder(folder2) + val folders = SignalDatabase.chatFolders.getChatFolders() + SignalDatabase.chatFolders.deleteChatFolder(folders.last()) + + val actualFolders = SignalDatabase.chatFolders.getChatFolders() + + assertEquals(listOf(folder1), actualFolders) + } +} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_active.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_active.kt index 0385e39175..e20da879a7 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_active.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_active.kt @@ -6,14 +6,18 @@ package org.thoughtcrime.securesms.database import androidx.test.platform.app.InstrumentationRegistry +import io.mockk.every +import io.mockk.mockkStatic import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Rule import org.junit.Test +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.testing.SignalDatabaseRule +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.push.ServiceId.ACI import java.util.UUID @@ -25,9 +29,14 @@ class ThreadTableTest_active { val databaseRule = SignalDatabaseRule() private lateinit var recipient: Recipient + private val allChats: ChatFolderRecord = ChatFolderRecord(folderType = ChatFolderRecord.FolderType.ALL) @Before fun setUp() { + mockkStatic(RemoteConfig::class) + + every { RemoteConfig.showChatFolders } returns true + recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ACI.from(UUID.randomUUID()))) } @@ -41,7 +50,8 @@ class ThreadTableTest_active { ConversationFilter.OFF, false, 0, - 10 + 10, + allChats ).use { threads -> assertEquals(1, threads.count) @@ -63,7 +73,8 @@ class ThreadTableTest_active { ConversationFilter.OFF, false, 0, - 10 + 10, + allChats ).use { threads -> assertEquals(0, threads.count) } @@ -83,7 +94,8 @@ class ThreadTableTest_active { ConversationFilter.OFF, false, 0, - 10 + 10, + allChats ).use { threads -> assertEquals(0, threads.count) } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_pinned.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_pinned.kt index 5efcac8834..9a7cf2d356 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_pinned.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_pinned.kt @@ -1,14 +1,18 @@ package org.thoughtcrime.securesms.database +import io.mockk.every +import io.mockk.mockkStatic import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test import org.signal.core.util.CursorUtil +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.testing.SignalDatabaseRule +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.push.ServiceId.ACI import java.util.UUID @@ -20,9 +24,14 @@ class ThreadTableTest_pinned { val databaseRule = SignalDatabaseRule() private lateinit var recipient: Recipient + private val allChats: ChatFolderRecord = ChatFolderRecord(folderType = ChatFolderRecord.FolderType.ALL) @Before fun setUp() { + mockkStatic(RemoteConfig::class) + + every { RemoteConfig.showChatFolders } returns true + recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ACI.from(UUID.randomUUID()))) } @@ -52,7 +61,7 @@ class ThreadTableTest_pinned { SignalDatabase.messages.deleteMessage(messageId) // THEN - val unarchivedCount = SignalDatabase.threads.getUnarchivedConversationListCount(ConversationFilter.OFF) + val unarchivedCount = SignalDatabase.threads.getUnarchivedConversationListCount(ConversationFilter.OFF, allChats) assertEquals(1, unarchivedCount) } @@ -67,7 +76,7 @@ class ThreadTableTest_pinned { SignalDatabase.messages.deleteMessage(messageId) // THEN - SignalDatabase.threads.getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 1).use { + SignalDatabase.threads.getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 1, allChats).use { it.moveToFirst() assertEquals(threadId, CursorUtil.requireLong(it, ThreadTable.ID)) } diff --git a/app/src/main/baseline-prof.txt b/app/src/main/baseline-prof.txt index 3973606d08..be5258038f 100644 --- a/app/src/main/baseline-prof.txt +++ b/app/src/main/baseline-prof.txt @@ -1,5 +1,6 @@ HPLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z HPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V HPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V @@ -13,61 +14,24 @@ HPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid HPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; HPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleForItemView(Landroidx/appcompat/view/menu/MenuView$ItemView;)Ljava/lang/CharSequence; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem; HPLandroidx/appcompat/widget/ActionMenuPresenter;->bindItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroidx/appcompat/view/menu/MenuView$ItemView;)V HPLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z HPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; +HPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; HPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(IIII)V HPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutVertical(IIII)V HPLandroidx/appcompat/widget/LinearLayoutCompat;->measureVertical(II)V HPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V -HPLandroidx/compose/ui/geometry/MutableRect;->setBottom(F)V -HPLandroidx/compose/ui/geometry/MutableRect;->setLeft(F)V -HPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U([FJ)J -HPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V -HPLandroidx/compose/ui/graphics/Matrix;->timesAssign-58bKbWc([F[F)V -HPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1;->invoke()V HPLandroidx/compose/ui/node/LayoutNode;->detach$ui_release()V -HPLandroidx/compose/ui/node/LayoutNode;->getCollapsedSemantics$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; -HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->onCoordinatesUsed()V -HPLandroidx/compose/ui/node/NodeCoordinator;->localBoundingBoxOf(Landroidx/compose/ui/layout/LayoutCoordinates;Z)Landroidx/compose/ui/geometry/Rect; -HPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release(Landroidx/compose/ui/geometry/MutableRect;ZZ)V -HPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J -HPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->addPageActions(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsInScreen(Landroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;)Landroid/graphics/Rect; -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->createNodeInfo(I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;)Z -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoStateDescriptionOrNull(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoText(Landroidx/compose/ui/semantics/SemanticsNode;)Landroidx/compose/ui/text/AnnotatedString; -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isScreenReaderFocusable(Landroidx/compose/ui/semantics/SemanticsNode;)Z -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties(ILandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V -HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z -HPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V -HPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->updateMatrix()V -HPLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->getAllUncoveredSemanticsNodesToIntObjectMap$findAllSemanticNodesRecursive(Landroid/graphics/Region;Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/collection/MutableIntObjectMap;Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Region;)V -HPLandroidx/compose/ui/platform/accessibility/CollectionInfo_androidKt;->setCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->containsImportantForAccessibility$ui_release()Z -HPLandroidx/compose/ui/semantics/SemanticsNode;->fakeSemanticsNode-ypyhhiA(Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/semantics/SemanticsNode; -HPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; -HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->SemanticsNode(Landroidx/compose/ui/node/LayoutNode;Z)Landroidx/compose/ui/semantics/SemanticsNode; -HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterMergingSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; HPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasResolvedTargets(II)Z -HPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMaxVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V -HPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMinVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V HPLandroidx/constraintlayout/core/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V HPLandroidx/constraintlayout/core/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/core/widgets/ConstraintAnchor; HPLandroidx/constraintlayout/core/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V HPLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V -HPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -HPLandroidx/core/view/AccessibilityDelegateCompat;->getActionList(Landroid/view/View;)Ljava/util/List; HPLandroidx/core/view/TreeIterator;->hasNext()Z -HPLandroidx/core/view/ViewCompat;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; -HPLandroidx/core/view/ViewCompat;->isAccessibilityHeading(Landroid/view/View;)Z -HPLandroidx/core/view/ViewCompat;->screenReaderFocusableProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; -HPLandroidx/core/view/ViewCompat;->stateDescriptionProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; +HPLandroidx/core/view/TreeIterator;->prepareNextIterator(Ljava/lang/Object;)V HPLandroidx/core/view/ViewGroupKt$children$1;->(Landroid/view/ViewGroup;)V HPLandroidx/core/view/ViewGroupKt$children$1;->iterator()Ljava/util/Iterator; HPLandroidx/core/view/ViewGroupKt$descendants$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -77,17 +41,13 @@ HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Landroid/view/View; HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Ljava/lang/Object; HPLandroidx/core/view/ViewGroupKt;->getChildren(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; HPLandroidx/core/view/ViewGroupKt;->iterator(Landroid/view/ViewGroup;)Ljava/util/Iterator; -HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V -HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V -HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V -HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V HPLandroidx/customview/poolingcontainer/PoolingContainer;->callPoolingContainerOnRelease(Landroid/view/View;)V HPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Bundle; -HPLandroidx/fragment/app/FragmentState;->(Landroidx/fragment/app/Fragment;)V HPLandroidx/fragment/app/FragmentStateManager;->destroy()V +HPLandroidx/fragment/app/FragmentStateManager;->saveState()Landroid/os/Bundle; HPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/recyclerview/widget/AdapterHelper;->applyPendingUpdatesToPosition(I)I -HPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V +HPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areItemsTheSame(II)Z HPLandroidx/recyclerview/widget/ConcatAdapter;->findRelativeAdapterPositionIn(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I HPLandroidx/recyclerview/widget/ConcatAdapter;->getAdapters()Ljava/util/List; HPLandroidx/recyclerview/widget/ConcatAdapter;->getItemCount()I @@ -104,21 +64,13 @@ HPLandroidx/recyclerview/widget/ListAdapter;->getCurrentList()Ljava/util/List; HPLandroidx/recyclerview/widget/NestedAdapterWrapper;->getCachedItemCount()I HPLandroidx/recyclerview/widget/NestedAdapterWrapper;->getItemViewType(I)I HPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getBindingAdapterPosition()I HPLandroidx/recyclerview/widget/RecyclerView;->getAdapterPositionInRecyclerView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I HPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HPLandroidx/recyclerview/widget/RecyclerView;->viewRangeUpdate(IILjava/lang/Object;)V -HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLandroidx/recyclerview/widget/ViewInfoStore;->addToPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V -HPLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z HPLandroidx/recyclerview/widget/ViewInfoStore;->popFromLayoutStep(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; HPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage$WrapperViewTypeLookup;->localToGlobal(I)I HPLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V -HPLcom/fasterxml/jackson/databind/node/ArrayNode;->(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;)V -HPLcom/fasterxml/jackson/databind/node/ArrayNode;->_add(Lcom/fasterxml/jackson/databind/JsonNode;)Lcom/fasterxml/jackson/databind/node/ArrayNode; HPLcom/google/android/material/animation/ArgbEvaluatorCompat;->evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer; HPLcom/google/android/material/imageview/ShapeableImageView$OutlineProvider;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V HPLcom/google/common/collect/Sets;->intersection(Ljava/util/Set;Ljava/util/Set;)Lcom/google/common/collect/Sets$SetView; @@ -127,7 +79,6 @@ HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$Co HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->drain()V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->innerNext(ILjava/lang/Object;)V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver;->onNext(Ljava/lang/Object;)V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;Ljava/lang/Object;)V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onNext(Ljava/lang/Object;)V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->onNext(Ljava/lang/Object;)V @@ -140,6 +91,7 @@ HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObs HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource;->subscribe(Lio/reactivex/rxjava3/core/Observer;)V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->drain()V HPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->onNext(Ljava/lang/Object;)V +HPLio/reactivex/rxjava3/internal/schedulers/ScheduledRunnable;->dispose()V HPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; HPLj$/time/Instant;->atZone(Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; HPLj$/time/LocalDateTime;->U()Lj$/time/LocalDate; @@ -147,40 +99,36 @@ HPLj$/time/ZonedDateTime;->(Lj$/time/LocalDateTime;Lj$/time/ZoneId;Lj$/tim HPLj$/time/ZonedDateTime;->M(JILj$/time/ZoneId;)Lj$/time/ZonedDateTime; HPLj$/time/ZonedDateTime;->O(Lj$/time/Instant;Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; HPLj$/time/ZonedDateTime;->toLocalDate()Lj$/time/LocalDate; +HPLj$/util/S;->r(Lj$/util/function/Consumer;)Z +HPLj$/util/concurrent/ConcurrentHashMap;->containsKey(Ljava/lang/Object;)Z +HPLkotlin/ranges/IntProgression;->(III)V +HPLkotlin/sequences/SequencesKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->(Ljava/lang/Class;)V HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlin/sequences/SequencesKt___SequencesJvmKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; -HPLnet/zetetic/database/sqlcipher/SQLiteConnection;->finalizePreparedStatement(Lnet/zetetic/database/sqlcipher/SQLiteConnection$PreparedStatement;)V +HPLkotlinx/coroutines/channels/BufferedChannel;->cancelSuspendedReceiveRequests(Lkotlinx/coroutines/channels/ChannelSegment;J)V +HPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; +HPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +HPLkotlinx/coroutines/internal/Segment;->onSlotCleaned()V HPLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;Lorg/signal/core/util/SqlUtil$CollectionOperator;)Lorg/signal/core/util/SqlUtil$Query; +HPLorg/signal/core/util/ToolbarExtensionsKt;->setActionItemTint(Landroidx/appcompat/widget/Toolbar;I)V HPLorg/signal/core/util/concurrent/DeadlockDetector;->hasPotentialLock([Ljava/lang/StackTraceElement;)Z HPLorg/signal/core/util/concurrent/SettableFuture;->(Ljava/lang/Object;)V -HPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V -HPLorg/signal/core/util/concurrent/SignalExecutors;->$r8$lambda$PuKeoHyTOgRHxCNNBi9u3dUls_w(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V -HPLorg/signal/core/util/concurrent/SignalExecutors;->lambda$newCachedBoundedExecutor$1(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V -HPLorg/signal/libsignal/protocol/ecc/ECPublicKey;->equals(Ljava/lang/Object;)Z HPLorg/signal/paging/FixedSizePagingController;->lambda$onDataItemChanged$2(Ljava/lang/Object;)V -HPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->hashCode()I -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map; HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCornersForSizeClass2()V HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->getCells()[Lorg/thoughtcrime/securesms/components/ThumbnailView; HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCellBackgroundColor(I)V HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRadii(IIII)V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRelativeRadii(Lorg/thoughtcrime/securesms/components/ThumbnailView;IIII)V HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlide(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;IZ)V HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlides(Lcom/bumptech/glide/RequestManager;Ljava/util/List;Z)V HPLorg/thoughtcrime/securesms/components/AvatarImageView;->disableQuickContact()V HPLorg/thoughtcrime/securesms/components/ComposeText;->onDraw(Landroid/graphics/Canvas;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDate(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V HPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDeliveryStatus(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V @@ -209,21 +157,22 @@ HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;-> HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;Lorg/thoughtcrime/securesms/util/views/Stub;)V HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; +HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getAlbumViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getThumbnailViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; HPLorg/thoughtcrime/securesms/components/CornerMask;->mask(Landroid/graphics/Canvas;)V HPLorg/thoughtcrime/securesms/components/Outliner;->draw(Landroid/graphics/Canvas;IIII)V HPLorg/thoughtcrime/securesms/components/QuoteView;->applyColorTheme()V HPLorg/thoughtcrime/securesms/components/QuoteView;->dismiss()V -HPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->isListCommitted()Z HPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->hasSameContents(Lorg/thoughtcrime/securesms/mms/Slide;Lorg/thoughtcrime/securesms/mms/Slide;)Z HPLorg/thoughtcrime/securesms/components/ThumbnailView;->onMeasure(II)V HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setBounds(IIII)V +HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setClickable(Z)V HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setFocusable(Z)V HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;ZZII)Lorg/signal/core/util/concurrent/ListenableFuture; -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setRadii(IIII)V +HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->getLongestLineWidth(Ljava/lang/CharSequence;)F HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setOverflowText(Ljava/lang/CharSequence;)V HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextColor(I)V @@ -241,12 +190,10 @@ HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$se HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->deriveMode(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode; HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->isUpdateToExistingSet(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;Ljava/util/List;)Z -HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setCancelClickListener(Landroid/view/View$OnClickListener;)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setClickable(Z)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setFocusable(Z)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setShowSecondaryText(Z)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setSlides(Ljava/util/List;)V -HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setTransferClickListener(Landroid/view/View$OnClickListener;)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setVisible(Z)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->updateState(Lkotlin/jvm/functions/Function1;)V HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->(ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZ)V @@ -255,12 +202,10 @@ HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewSta HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->toString()Ljava/lang/String; HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V -HPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->draw(Landroid/graphics/Canvas;)V HPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Runnable;)Ljava/lang/String; HPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->updateOutlineVisibility()V HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lj$/util/Optional;Lj$/util/Optional;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ZZZZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getActiveFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/components/ConversationItemFooter; -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getGiftId()J HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getOpenableGiftProjection(Z)Lorg/thoughtcrime/securesms/util/Projection; HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getSnapshotProjections(Landroid/view/ViewGroup;ZZ)Lorg/thoughtcrime/securesms/util/ProjectionList; @@ -297,7 +242,6 @@ HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setQuote HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setVideoPlayerProjection(Lorg/thoughtcrime/securesms/util/Projection;)V HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getConversationTimestamp()J HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMessageRecord()Lorg/thoughtcrime/securesms/database/model/MessageRecord; -HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hashCode()I HPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V HPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->getLatestTimestamp(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;Landroidx/recyclerview/widget/LinearLayoutManager;)Lj$/util/Optional; HPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->asSingleColor()I @@ -311,10 +255,8 @@ HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;- HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateSlide(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->isRunning()Z HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->toSet()Ljava/util/Set; HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->cleanPulseAnimators()V HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->findAdapterBridge(Landroidx/recyclerview/widget/RecyclerView;)Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getDifferenceForPart(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->hasRunningPulseRequestAnimators()Z HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfEnterExitAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V @@ -323,11 +265,9 @@ HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration; HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->resolveMultiselectable(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselectable; HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateChildOffsets(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)V HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateMultiselectPartAnimator(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->hashCode()I HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->bindPayloadsIfAvailable()Z HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getBindable()Lorg/thoughtcrime/securesms/BindableConversationItem; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getNextMessage()Lj$/util/Optional; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getPreviousMessage()Lj$/util/Optional; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)V HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)V @@ -337,11 +277,9 @@ HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSelecte HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->get()Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Boolean; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke()Ljava/lang/Boolean; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->invoke()Ljava/lang/Boolean; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getBinding(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->doAfterFirstRender()V HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getBinding()Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; @@ -356,7 +294,6 @@ HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->time HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->toEpochDay(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords$lambda$12(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Single; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState$lambda$16(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)Lio/reactivex/rxjava3/core/Single; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->accept(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V @@ -364,7 +301,6 @@ HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(L HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/SingleSource; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)Lio/reactivex/rxjava3/core/SingleSource; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$special$$inlined$mapNotNull$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->(JILorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;)V HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getChatColorsSnapshot()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; @@ -372,23 +308,20 @@ HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZZZ)V HPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->equals(Ljava/lang/Object;)Z -HPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->load(IIILorg/signal/paging/PagedDataSource$CancellationSignal;)Ljava/util/List; +HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch(Ljava/util/List;)Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData; HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->draw(Landroid/graphics/Canvas;)V HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOutline(Landroid/graphics/Outline;)V -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->isSolidColor()Z HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setCorners([F)V HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->onMeasure(II)V -HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->setMessageShape(Lorg/thoughtcrime/securesms/database/model/MessageRecord;ZI)Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$footerDrawable$1;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;)V @@ -396,16 +329,12 @@ HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyVi HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateBodyBubbleDrawable(Landroid/view/ViewGroup;)V HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateChatColorsDrawable(Landroid/view/ViewGroup;)V -HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateFooterDrawable(Landroid/view/ViewGroup;)V HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->linkifyMessageBody(Landroid/text/Spannable;)V HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentBody()V HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentSender()V -HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyTextColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I -HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)I HPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPostMeasure()Z -HPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->getIdentityRecords(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList; -HPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$19(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$20(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HPLorg/thoughtcrime/securesms/database/GroupTable;->getGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZ)Ljava/util/List; HPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->(Ljava/util/Collection;)V HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isChangeNumber()Z @@ -442,20 +371,16 @@ HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSessionSwitchover HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSmsExportType()Z HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isThreadMergeEventType()Z HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isUpdate()Z -HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLinkPreviews()Ljava/util/List; HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getQuote()Lorg/thoughtcrime/securesms/database/model/Quote; HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription; HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isMediaPending()Z HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->withAttachments(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord; -HPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/fonts/SignalSymbols$CustomTypefaceSpan;->update(Landroid/text/TextPaint;)V HPLorg/thoughtcrime/securesms/fonts/SignalSymbols;->getSpannedString(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/SignalSymbols$Weight;Lorg/thoughtcrime/securesms/fonts/SignalSymbols$Glyph;)Ljava/lang/CharSequence; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->setParentRecyclerTranslationY(Landroidx/recyclerview/widget/RecyclerView;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSet(Ljava/util/Set;II)Ljava/util/Set; HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->performPlaybackUpdate(Landroidx/recyclerview/widget/RecyclerView;)V HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->injectVideoViews(Landroid/content/Context;Landroidx/lifecycle/Lifecycle;Landroid/view/ViewGroup;I)Ljava/util/List; @@ -463,33 +388,29 @@ HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->getCurrentHo HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->stopAndReleaseAssignedVideos(Ljava/util/Set;)V HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->update(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;Ljava/util/Set;)V HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->updateVideoDisplayPositionAndSize(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable;)V -HPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageFontSize()I -HPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->hasWallpaperSet()Z +HPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->insertJobs(Ljava/util/List;)V HPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getMessageRequestState(Lorg/thoughtcrime/securesms/recipients/Recipient;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; -HPLorg/thoughtcrime/securesms/mms/Slide;->asAttachment()Lorg/thoughtcrime/securesms/attachments/Attachment; HPLorg/thoughtcrime/securesms/mms/Slide;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/mms/Slide;->getTransferState()I HPLorg/thoughtcrime/securesms/mms/Slide;->hashCode()I -HPLorg/thoughtcrime/securesms/mms/Slide;->isInProgress()Z HPLorg/thoughtcrime/securesms/mms/Slide;->isPendingDownload()Z HPLorg/thoughtcrime/securesms/mms/SlideDeck;->getTextSlide()Lorg/thoughtcrime/securesms/mms/TextSlide; HPLorg/thoughtcrime/securesms/mms/SlideDeck;->getThumbnailSlides()Ljava/util/List; HPLorg/thoughtcrime/securesms/profiles/ProfileName;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->clear()V +HPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->live(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/LiveRecipient; HPLorg/thoughtcrime/securesms/recipients/Recipient$combinedAboutAndEmoji$2;->invoke()Ljava/lang/String; HPLorg/thoughtcrime/securesms/recipients/Recipient;->getHasWallpaper()Z HPLorg/thoughtcrime/securesms/recipients/Recipient;->hasSameContent(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z +HPLorg/thoughtcrime/securesms/recipients/RecipientId;->equals(Ljava/lang/Object;)Z HPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isMessageRequestAccepted(Landroid/content/Context;J)Z HPLorg/thoughtcrime/securesms/util/BubbleUtil;->canBubble(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Long;)Z -HPLorg/thoughtcrime/securesms/util/DateUtils;->getDatelessRelativeTimeSpanFormattedDate(Landroid/content/Context;Ljava/util/Locale;J)Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate; HPLorg/thoughtcrime/securesms/util/DateUtils;->getSameDayDateFormat()Ljava/text/SimpleDateFormat; HPLorg/thoughtcrime/securesms/util/DateUtils;->isSameDay(JJ)Z HPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate$default(JLj$/time/ZoneId;ILjava/lang/Object;)Lj$/time/LocalDate; HPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate(JLj$/time/ZoneId;)Lj$/time/LocalDate; HPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState$lambda$7$lambda$6(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V -HPLorg/thoughtcrime/securesms/util/MediaUtil;->isInstantVideoSupported(Lorg/thoughtcrime/securesms/mms/Slide;)Z HPLorg/thoughtcrime/securesms/util/MediaUtil;->isLongTextType(Ljava/lang/String;)Z -HPLorg/thoughtcrime/securesms/util/MediaUtil;->isVideoType(Ljava/lang/String;)Z HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z @@ -507,13 +428,11 @@ HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isViewOnceMessage(Lorg/th HPLorg/thoughtcrime/securesms/util/Projection$Corners;->(FFFF)V HPLorg/thoughtcrime/securesms/util/Projection$Corners;->toRadii()[F HPLorg/thoughtcrime/securesms/util/ProjectionList;->close()V -HPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMessageBodyTextSize(Landroid/content/Context;)I HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->drawAsTopItemDecoration(Landroid/view/View;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;I)V HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->layoutIn(Landroid/view/View;Landroid/view/View;)V HPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/content/Context;)Z HPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/view/View;)Z HPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/view/View;)Z HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingEnd(Landroid/view/View;I)V HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingStart(Landroid/view/View;I)V HPLorg/thoughtcrime/securesms/util/ViewUtil;->setTopMargin(Landroid/view/View;IZ)V @@ -978,7 +897,6 @@ HSPLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V HSPLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V -HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V @@ -1036,6 +954,7 @@ HSPLandroidx/appcompat/widget/AppCompatImageHelper;->(Landroid/widget/Imag HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applyImageLevel()V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->hasOverlappingRendering()Z +HSPLandroidx/appcompat/widget/AppCompatImageHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->obtainLevelFromDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->setImageResource(I)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->shouldApplyFrameworkTintUsingColorFilter()Z @@ -1055,6 +974,7 @@ HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetCompoundDrawables()V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -1119,6 +1039,7 @@ HSPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutHorizontal(IIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureChildBeforeLayout(Landroid/view/View;IIIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureHorizontal(II)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onDraw(Landroid/graphics/Canvas;)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onMeasure(II)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->setBaselineAligned(Z)V @@ -1426,7 +1347,9 @@ HSPLandroidx/collection/IndexBasedArrayIterator;->next()Ljava/lang/Object; HSPLandroidx/collection/IndexBasedArrayIterator;->remove()V HSPLandroidx/collection/IntIntMap;->()V HSPLandroidx/collection/IntIntMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/collection/IntIntMap;->findKeyIndex(I)I HSPLandroidx/collection/IntIntMap;->getCapacity()I +HSPLandroidx/collection/IntIntMap;->getOrDefault(II)I HSPLandroidx/collection/IntList;->(I)V HSPLandroidx/collection/IntList;->(ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/collection/IntList;->get(I)I @@ -1435,6 +1358,7 @@ HSPLandroidx/collection/IntListKt;->()V HSPLandroidx/collection/IntListKt;->intListOf([I)Landroidx/collection/IntList; HSPLandroidx/collection/IntObjectMap;->()V HSPLandroidx/collection/IntObjectMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/collection/IntObjectMap;->contains(I)Z HSPLandroidx/collection/IntObjectMap;->get(I)Ljava/lang/Object; HSPLandroidx/collection/IntObjectMap;->getCapacity()I HSPLandroidx/collection/IntObjectMapKt;->()V @@ -1490,12 +1414,14 @@ HSPLandroidx/collection/MutableIntList;->plusAssign([I)V HSPLandroidx/collection/MutableIntList;->removeAt(I)I HSPLandroidx/collection/MutableIntObjectMap;->(I)V HSPLandroidx/collection/MutableIntObjectMap;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/collection/MutableIntObjectMap;->adjustStorage()V HSPLandroidx/collection/MutableIntObjectMap;->findAbsoluteInsertIndex(I)I HSPLandroidx/collection/MutableIntObjectMap;->findFirstAvailableSlot(I)I HSPLandroidx/collection/MutableIntObjectMap;->initializeGrowth()V HSPLandroidx/collection/MutableIntObjectMap;->initializeMetadata(I)V HSPLandroidx/collection/MutableIntObjectMap;->initializeStorage(I)V HSPLandroidx/collection/MutableIntObjectMap;->put(ILjava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/collection/MutableIntObjectMap;->resizeStorage(I)V HSPLandroidx/collection/MutableIntObjectMap;->set(ILjava/lang/Object;)V HSPLandroidx/collection/MutableIntSet;->(I)V HSPLandroidx/collection/MutableIntSet;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -1640,9 +1566,14 @@ HSPLandroidx/compose/animation/core/TweenSpec;->(IILandroidx/compose/anima HSPLandroidx/compose/animation/core/TweenSpec;->(IILandroidx/compose/animation/core/Easing;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/foundation/AbstractClickableNode$TraverseKey;->()V HSPLandroidx/compose/foundation/AbstractClickableNode$TraverseKey;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/compose/foundation/AbstractClickableNode$applySemantics$1;->(Landroidx/compose/foundation/AbstractClickableNode;)V HSPLandroidx/compose/foundation/AbstractClickableNode;->()V HSPLandroidx/compose/foundation/AbstractClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/IndicationNodeFactory;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/AbstractClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/IndicationNodeFactory;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/compose/foundation/AbstractClickableNode;->applyAdditionalSemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/foundation/AbstractClickableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/foundation/AbstractClickableNode;->getShouldClearDescendantSemantics()Z +HSPLandroidx/compose/foundation/AbstractClickableNode;->getShouldMergeDescendantSemantics()Z HSPLandroidx/compose/foundation/AbstractClickableNode;->initializeIndicationAndInteractionSourceIfNeeded()V HSPLandroidx/compose/foundation/AbstractClickableNode;->onAttach()V HSPLandroidx/compose/foundation/AbstractClickableNode;->onFocusEvent(Landroidx/compose/ui/focus/FocusState;)V @@ -1709,8 +1640,10 @@ HSPLandroidx/compose/foundation/FocusableInNonTouchMode;->getInputModeManager()L HSPLandroidx/compose/foundation/FocusableInteractionNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/FocusableInteractionNode;->setFocus(Z)V HSPLandroidx/compose/foundation/FocusableInteractionNode;->update(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V +HSPLandroidx/compose/foundation/FocusableNode$applySemantics$1;->(Landroidx/compose/foundation/FocusableNode;)V HSPLandroidx/compose/foundation/FocusableNode;->()V HSPLandroidx/compose/foundation/FocusableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V +HSPLandroidx/compose/foundation/FocusableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/foundation/FocusableNode;->onFocusEvent(Landroidx/compose/ui/focus/FocusState;)V HSPLandroidx/compose/foundation/FocusableNode;->onGloballyPositioned(Landroidx/compose/ui/layout/LayoutCoordinates;)V HSPLandroidx/compose/foundation/FocusableNode;->update(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V @@ -1997,15 +1930,22 @@ HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->( HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily$Resolver;IZIILandroidx/compose/ui/graphics/ColorProducer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->create()Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->create()Landroidx/compose/ui/Modifier$Node; +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$1;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$2;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$3;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$4;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->()V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily$Resolver;IZIILandroidx/compose/ui/graphics/ColorProducer;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily$Resolver;IZIILandroidx/compose/ui/graphics/ColorProducer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache()Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache(Landroidx/compose/ui/unit/Density;)Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getShouldClearDescendantSemantics()Z +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getShouldMergeDescendantSemantics()Z HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->onMeasureResultChanged()V HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->()V @@ -2065,6 +2005,8 @@ HSPLandroidx/compose/material3/ButtonDefaults;->getTextShape(Landroidx/compose/r HSPLandroidx/compose/material3/ButtonDefaults;->textButtonColors(Landroidx/compose/runtime/Composer;I)Landroidx/compose/material3/ButtonColors; HSPLandroidx/compose/material3/ButtonKt$Button$1;->()V HSPLandroidx/compose/material3/ButtonKt$Button$1;->()V +HSPLandroidx/compose/material3/ButtonKt$Button$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/material3/ButtonKt$Button$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/material3/ButtonKt$Button$2$1;->(Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;)V HSPLandroidx/compose/material3/ButtonKt$Button$2$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/ButtonKt$Button$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -2133,6 +2075,8 @@ HSPLandroidx/compose/material3/IconButtonDefaults;->iconButtonColors(Landroidx/c HSPLandroidx/compose/material3/IconButtonKt;->IconButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/IconKt$Icon$3;->(Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;JII)V HSPLandroidx/compose/material3/IconKt$Icon$semantics$1$1;->(Ljava/lang/String;)V +HSPLandroidx/compose/material3/IconKt$Icon$semantics$1$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/material3/IconKt$Icon$semantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/material3/IconKt;->()V HSPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/IconKt;->defaultSizeFor(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;)Landroidx/compose/ui/Modifier; @@ -4051,6 +3995,19 @@ HSPLandroidx/compose/ui/geometry/CornerRadius;->getX-impl(J)F HSPLandroidx/compose/ui/geometry/CornerRadius;->getY-impl(J)F HSPLandroidx/compose/ui/geometry/CornerRadiusKt;->CornerRadius$default(FFILjava/lang/Object;)J HSPLandroidx/compose/ui/geometry/CornerRadiusKt;->CornerRadius(FF)J +HSPLandroidx/compose/ui/geometry/MutableRect;->()V +HSPLandroidx/compose/ui/geometry/MutableRect;->(FFFF)V +HSPLandroidx/compose/ui/geometry/MutableRect;->getBottom()F +HSPLandroidx/compose/ui/geometry/MutableRect;->getLeft()F +HSPLandroidx/compose/ui/geometry/MutableRect;->getRight()F +HSPLandroidx/compose/ui/geometry/MutableRect;->getTop()F +HSPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V +HSPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z +HSPLandroidx/compose/ui/geometry/MutableRect;->setBottom(F)V +HSPLandroidx/compose/ui/geometry/MutableRect;->setLeft(F)V +HSPLandroidx/compose/ui/geometry/MutableRect;->setRight(F)V +HSPLandroidx/compose/ui/geometry/MutableRect;->setTop(F)V +HSPLandroidx/compose/ui/geometry/MutableRectKt;->toRect(Landroidx/compose/ui/geometry/MutableRect;)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/geometry/Offset$Companion;->()V HSPLandroidx/compose/ui/geometry/Offset$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/geometry/Offset$Companion;->getInfinite-F1C5BW0()J @@ -4066,6 +4023,7 @@ HSPLandroidx/compose/ui/geometry/Offset;->getDistance-impl(J)F HSPLandroidx/compose/ui/geometry/Offset;->getX-impl(J)F HSPLandroidx/compose/ui/geometry/Offset;->getY-impl(J)F HSPLandroidx/compose/ui/geometry/OffsetKt;->Offset(FF)J +HSPLandroidx/compose/ui/geometry/OffsetKt;->isUnspecified-k-4lQ0M(J)Z HSPLandroidx/compose/ui/geometry/Rect$Companion;->()V HSPLandroidx/compose/ui/geometry/Rect$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/geometry/Rect$Companion;->getZero()Landroidx/compose/ui/geometry/Rect; @@ -4114,6 +4072,7 @@ HSPLandroidx/compose/ui/geometry/Size;->getMinDimension-impl(J)F HSPLandroidx/compose/ui/geometry/Size;->getWidth-impl(J)F HSPLandroidx/compose/ui/geometry/Size;->unbox-impl()J HSPLandroidx/compose/ui/geometry/SizeKt;->Size(FF)J +HSPLandroidx/compose/ui/geometry/SizeKt;->getCenter-uvyYCjk(J)J HSPLandroidx/compose/ui/geometry/SizeKt;->toRect-uvyYCjk(J)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/graphics/AndroidBlendMode_androidKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/AndroidBlendMode_androidKt$$ExternalSyntheticApiModelOutline21;->m()Landroid/graphics/BlendMode; @@ -4157,6 +4116,7 @@ HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSynthetic HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt;->ActualImageBitmap-x__-hDU(IIIZLandroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroidx/compose/ui/graphics/ImageBitmap; HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt;->asAndroidBitmap(Landroidx/compose/ui/graphics/ImageBitmap;)Landroid/graphics/Bitmap; HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt;->toBitmapConfig-1JJdX4A(I)Landroid/graphics/Bitmap$Config; +HSPLandroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt;->setFrom-tU-YjHk([FLandroid/graphics/Matrix;)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->()V HSPLandroidx/compose/ui/graphics/AndroidPaint;->(Landroid/graphics/Paint;)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->asFrameworkPaint()Landroid/graphics/Paint; @@ -4335,11 +4295,20 @@ HSPLandroidx/compose/ui/graphics/Matrix;->([F)V HSPLandroidx/compose/ui/graphics/Matrix;->box-impl([F)Landroidx/compose/ui/graphics/Matrix; HSPLandroidx/compose/ui/graphics/Matrix;->constructor-impl$default([FILkotlin/jvm/internal/DefaultConstructorMarker;)[F HSPLandroidx/compose/ui/graphics/Matrix;->constructor-impl([F)[F +HSPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U([FJ)J +HSPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V +HSPLandroidx/compose/ui/graphics/Matrix;->reset-impl([F)V +HSPLandroidx/compose/ui/graphics/Matrix;->rotateX-impl([FF)V +HSPLandroidx/compose/ui/graphics/Matrix;->rotateY-impl([FF)V HSPLandroidx/compose/ui/graphics/Matrix;->rotateZ-impl([FF)V +HSPLandroidx/compose/ui/graphics/Matrix;->scale-impl$default([FFFFILjava/lang/Object;)V HSPLandroidx/compose/ui/graphics/Matrix;->scale-impl([FFFF)V +HSPLandroidx/compose/ui/graphics/Matrix;->timesAssign-58bKbWc([F[F)V HSPLandroidx/compose/ui/graphics/Matrix;->translate-impl$default([FFFFILjava/lang/Object;)V HSPLandroidx/compose/ui/graphics/Matrix;->translate-impl([FFFF)V HSPLandroidx/compose/ui/graphics/Matrix;->unbox-impl()[F +HSPLandroidx/compose/ui/graphics/MatrixKt;->access$dot-p89u6pk([FI[FI)F +HSPLandroidx/compose/ui/graphics/MatrixKt;->dot-p89u6pk([FI[FI)F HSPLandroidx/compose/ui/graphics/MatrixKt;->isIdentity-58bKbWc([F)Z HSPLandroidx/compose/ui/graphics/Outline$Rectangle;->(Landroidx/compose/ui/geometry/Rect;)V HSPLandroidx/compose/ui/graphics/Outline$Rectangle;->getRect()Landroidx/compose/ui/geometry/Rect; @@ -4753,7 +4722,15 @@ HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->configureOutline()V HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->draw$ui_graphics_release(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getAlpha()F HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getClip()Z +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getPivotOffset-F1C5BW0()J +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getRotationX()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getRotationY()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getRotationZ()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getScaleX()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getScaleY()F HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getShadowElevation()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getTranslationX()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getTranslationY()F HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->obtainAndroidOutline()Landroid/graphics/Outline; HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->onAddedToParentLayer()V HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->record-mL-hObY(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;JLkotlin/jvm/functions/Function1;)V @@ -4782,7 +4759,14 @@ HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->draw(Landroidx/compose HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getAlpha()F HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getClip()Z HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getHasDisplayList()Z +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getRotationX()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getRotationY()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getRotationZ()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getScaleX()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getScaleY()F HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getShadowElevation()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getTranslationX()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getTranslationY()F HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->record(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/graphics/layer/GraphicsLayer;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setClip(Z)V HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setInvalidated(Z)V @@ -5133,6 +5117,9 @@ HSPLandroidx/compose/ui/layout/FixedScale;->()V HSPLandroidx/compose/ui/layout/FixedScale;->(F)V HSPLandroidx/compose/ui/layout/HorizontalAlignmentLine;->()V HSPLandroidx/compose/ui/layout/HorizontalAlignmentLine;->(Lkotlin/jvm/functions/Function2;)V +HSPLandroidx/compose/ui/layout/LayoutCoordinates$-CC;->localBoundingBoxOf$default(Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/layout/LayoutCoordinates;ZILjava/lang/Object;)Landroidx/compose/ui/geometry/Rect; +HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->boundsInRoot(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/geometry/Rect; +HSPLandroidx/compose/ui/layout/LayoutCoordinatesKt;->findRootCoordinates(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/layout/LookaheadCapablePlacementScope;->(Landroidx/compose/ui/node/LookaheadCapablePlaceable;)V HSPLandroidx/compose/ui/layout/LookaheadCapablePlacementScope;->getParentLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/layout/MeasureScope$-CC;->$default$layout(Landroidx/compose/ui/layout/MeasureScope;IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; @@ -5160,7 +5147,9 @@ HSPLandroidx/compose/ui/layout/Placeable;->()V HSPLandroidx/compose/ui/layout/Placeable;->access$getApparentToRealOffset-nOcc-ac(Landroidx/compose/ui/layout/Placeable;)J HSPLandroidx/compose/ui/layout/Placeable;->access$placeAt-f8xVGno(Landroidx/compose/ui/layout/Placeable;JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/layout/Placeable;->getHeight()I +HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredHeight()I HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredSize-YbymL2g()J +HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredWidth()I HSPLandroidx/compose/ui/layout/Placeable;->getMeasurementConstraints-msEJaDk()J HSPLandroidx/compose/ui/layout/Placeable;->getWidth()I HSPLandroidx/compose/ui/layout/Placeable;->onMeasuredSizeChanged()V @@ -5345,6 +5334,9 @@ HSPLandroidx/compose/ui/node/LayoutNode$UsageByParent;->values()[Landroidx/compo HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()V +HSPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1;->(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/internal/Ref$ObjectRef;)V +HSPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1;->invoke()Ljava/lang/Object; +HSPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1;->invoke()V HSPLandroidx/compose/ui/node/LayoutNode;->$r8$lambda$kGNqy0QTItq0x6QPwXgEjPtPG3w(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutNode;)I HSPLandroidx/compose/ui/node/LayoutNode;->()V HSPLandroidx/compose/ui/node/LayoutNode;->(ZI)V @@ -5361,6 +5353,7 @@ HSPLandroidx/compose/ui/node/LayoutNode;->getApplyingModifierOnAttach$ui_release HSPLandroidx/compose/ui/node/LayoutNode;->getCanMultiMeasure$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getChildMeasurables$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNode;->getChildren$ui_release()Ljava/util/List; +HSPLandroidx/compose/ui/node/LayoutNode;->getCollapsedSemantics$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; HSPLandroidx/compose/ui/node/LayoutNode;->getCompositionLocalMap()Landroidx/compose/runtime/CompositionLocalMap; HSPLandroidx/compose/ui/node/LayoutNode;->getCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/node/LayoutNode;->getDensity()Landroidx/compose/ui/unit/Density; @@ -5388,6 +5381,7 @@ HSPLandroidx/compose/ui/node/LayoutNode;->getOwner$ui_release()Landroidx/compose HSPLandroidx/compose/ui/node/LayoutNode;->getParent$ui_release()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/LayoutNode;->getPlaceOrder$ui_release()I HSPLandroidx/compose/ui/node/LayoutNode;->getSemanticsId()I +HSPLandroidx/compose/ui/node/LayoutNode;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; HSPLandroidx/compose/ui/node/LayoutNode;->getWidth()I HSPLandroidx/compose/ui/node/LayoutNode;->getZIndex()F HSPLandroidx/compose/ui/node/LayoutNode;->getZSortedChildren()Landroidx/compose/runtime/collection/MutableVector; @@ -5534,6 +5528,7 @@ HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->invalidateParentData()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markChildrenDirty()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markLayoutPending$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markMeasurePending$ui_release()V +HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->onCoordinatesUsed()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->performMeasure-BRTryo0(J)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringModifierPlacement(Z)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringPlacement(Z)V @@ -5651,8 +5646,11 @@ HSPLandroidx/compose/ui/node/NodeCoordinator;->access$getSnapshotObserver(Landro HSPLandroidx/compose/ui/node/NodeCoordinator;->access$headNode(Landroidx/compose/ui/node/NodeCoordinator;Z)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeCoordinator;->access$setLastLayerDrawingWasSkipped$p(Landroidx/compose/ui/node/NodeCoordinator;Z)V HSPLandroidx/compose/ui/node/NodeCoordinator;->access$setMeasurementConstraints-BRTryo0(Landroidx/compose/ui/node/NodeCoordinator;J)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->calculateMinimumTouchTargetPadding-E7KxVPU(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->draw(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->drawContainedDrawModifiers(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->getAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; HSPLandroidx/compose/ui/node/NodeCoordinator;->getDensity()F HSPLandroidx/compose/ui/node/NodeCoordinator;->getFontScale()F @@ -5662,8 +5660,11 @@ HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayer()Landroidx/compose/ui/no HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/NodeCoordinator;->getMeasureResult$ui_release()Landroidx/compose/ui/layout/MeasureResult; +HSPLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentData()Ljava/lang/Object; +HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/node/NodeCoordinator;->getPosition-nOcc-ac()J +HSPLandroidx/compose/ui/node/NodeCoordinator;->getRectCache()Landroidx/compose/ui/geometry/MutableRect; HSPLandroidx/compose/ui/node/NodeCoordinator;->getSize-YbymL2g()J HSPLandroidx/compose/ui/node/NodeCoordinator;->getSnapshotObserver()Landroidx/compose/ui/node/OwnerSnapshotObserver; HSPLandroidx/compose/ui/node/NodeCoordinator;->getWrapped$ui_release()Landroidx/compose/ui/node/NodeCoordinator; @@ -5673,17 +5674,25 @@ HSPLandroidx/compose/ui/node/NodeCoordinator;->hasNode-H91voCI(I)Z HSPLandroidx/compose/ui/node/NodeCoordinator;->head-H91voCI(I)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeCoordinator;->headNode(Z)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeCoordinator;->invalidateLayer()V +HSPLandroidx/compose/ui/node/NodeCoordinator;->isAttached()Z +HSPLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z +HSPLandroidx/compose/ui/node/NodeCoordinator;->localBoundingBoxOf(Landroidx/compose/ui/layout/LayoutCoordinates;Z)Landroidx/compose/ui/geometry/Rect; +HSPLandroidx/compose/ui/node/NodeCoordinator;->onCoordinatesUsed$ui_release()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayoutNodeAttach()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onMeasureResultChanged(II)V HSPLandroidx/compose/ui/node/NodeCoordinator;->onMeasured()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onPlaced()V HSPLandroidx/compose/ui/node/NodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->placeSelf-MLgxB_4(JFLkotlin/jvm/functions/Function1;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release$default(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;ZZILjava/lang/Object;)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release(Landroidx/compose/ui/geometry/MutableRect;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setForcePlaceWithLookaheadOffset$ui_release(Z)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setMeasureResult$ui_release(Landroidx/compose/ui/layout/MeasureResult;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setPosition--gyyYBs(J)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setWrapped$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setWrappedBy$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->toCoordinator(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/node/NodeCoordinator; +HSPLandroidx/compose/ui/node/NodeCoordinator;->touchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerBlock$default(Landroidx/compose/ui/node/NodeCoordinator;Lkotlin/jvm/functions/Function1;ZILjava/lang/Object;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerBlock(Lkotlin/jvm/functions/Function1;Z)V HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters$default(Landroidx/compose/ui/node/NodeCoordinator;ZILjava/lang/Object;)V @@ -5745,11 +5754,16 @@ HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeLayoutModifierSnapsh HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeLayoutSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeMeasureSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeReads$ui_release(Landroidx/compose/ui/node/OwnerScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V +HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeSemanticsReads$ui_release(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->startObserving$ui_release()V HSPLandroidx/compose/ui/node/ParentDataModifierNodeKt;->invalidateParentData(Landroidx/compose/ui/node/ParentDataModifierNode;)V HSPLandroidx/compose/ui/node/PlaceableResult;->(Landroidx/compose/ui/layout/MeasureResult;Landroidx/compose/ui/node/LookaheadCapablePlaceable;)V HSPLandroidx/compose/ui/node/PlaceableResult;->getResult()Landroidx/compose/ui/layout/MeasureResult; +HSPLandroidx/compose/ui/node/SemanticsModifierNode$-CC;->$default$getShouldClearDescendantSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)Z +HSPLandroidx/compose/ui/node/SemanticsModifierNode$-CC;->$default$getShouldMergeDescendantSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)Z +HSPLandroidx/compose/ui/node/SemanticsModifierNodeKt;->getUseMinimumTouchTarget(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Z HSPLandroidx/compose/ui/node/SemanticsModifierNodeKt;->invalidateSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)V +HSPLandroidx/compose/ui/node/SemanticsModifierNodeKt;->touchBoundsInRoot(Landroidx/compose/ui/Modifier$Node;Z)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/node/TailModifierNode;->()V HSPLandroidx/compose/ui/node/TailModifierNode;->()V HSPLandroidx/compose/ui/node/TailModifierNode;->onAttach()V @@ -5846,6 +5860,9 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$get_viewTreeOwners( HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$onClearFocusForOwner(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$setGetBooleanMethod$cp(Ljava/lang/reflect/Method;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$setSystemPropertiesClass$cp(Ljava/lang/Class;)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;I)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->autofillSupported()Z HSPLandroidx/compose/ui/platform/AndroidComposeView;->boundsUpdatesAccessibilityEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidComposeView;->boundsUpdatesContentCaptureEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -5855,6 +5872,7 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchDraw(Landroid/grap HSPLandroidx/compose/ui/platform/AndroidComposeView;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AccessibilityManager; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AndroidAccessibilityManager; +HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui_release()Landroidx/compose/ui/platform/AndroidViewsHandler; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofill()Landroidx/compose/ui/autofill/Autofill; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillTree()Landroidx/compose/ui/autofill/AutofillTree; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/AndroidClipboardManager; @@ -5888,6 +5906,7 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->get_viewTreeOwners()Landro HSPLandroidx/compose/ui/platform/AndroidComposeView;->globalLayoutListener$lambda$4(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayers(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayoutNodeMeasurement(Landroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J HSPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout(Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->notifyLayerIsDirty$ui_release(Landroidx/compose/ui/node/OwnedLayer;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onAttach(Landroidx/compose/ui/node/LayoutNode;)V @@ -5906,6 +5925,8 @@ HSPLandroidx/compose/ui/platform/AndroidComposeView;->onSemanticsChange()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onStart(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onWindowFocusChanged(Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->pack-ZIaKswc(II)J +HSPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowViewTransforms()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->registerOnEndApplyChangesListener(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->scheduleMeasureAndLayout(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->scrollChangedListener$lambda$5(Landroidx/compose/ui/platform/AndroidComposeView;)V @@ -5921,21 +5942,59 @@ HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda3;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewAttachedToWindow(Landroid/view/View;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->addSetProgressAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->addPageActions(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Companion;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$ComposeAccessibilityNodeProvider;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$ComposeAccessibilityNodeProvider;->createAccessibilityNodeInfo(I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$onSendAccessibilityEvent$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$scheduleScrollEventIfNeededLambda$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->(Landroidx/compose/ui/platform/AndroidComposeView;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$createNodeInfo(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getAccessibilityManager$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Landroid/view/accessibility/AccessibilityManager; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getEnabledStateListener$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getSendingFocusAffectingEvent$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getTouchExplorationStateListener$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsInScreen(Landroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;)Landroid/graphics/Rect; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsUpdatesEventLoop$ui_release(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->createNodeInfo(I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionEnd(Landroidx/compose/ui/semantics/SemanticsNode;)I +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionStart(Landroidx/compose/ui/semantics/SemanticsNode;)I +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes()Landroidx/collection/IntObjectMap; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoStateDescriptionOrNull(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoText(Landroidx/compose/ui/semantics/SemanticsNode;)Landroidx/compose/ui/text/AnnotatedString; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTextForTextField(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/AnnotatedString; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isEnabled$ui_release()Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isScreenReaderFocusable(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onLayoutChange$ui_release(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onSemanticsChange$ui_release()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setContentInvalid(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setStateDescription(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setText(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->toSpannableString(Landroidx/compose/ui/text/AnnotatedString;)Landroid/text/SpannableString; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->()V +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$isVisible(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->findClosestParentNode(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->isVisible(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V @@ -6027,6 +6086,7 @@ HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getMain$delegate$c HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getToRunOnFrame$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Ljava/util/List; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performFrameDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;J)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performTrampolineDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V +HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$setScheduledFrameDispatch$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;Z)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->getChoreographer()Landroid/view/Choreographer; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->getFrameClock()Landroidx/compose/runtime/MonotonicFrameClock; @@ -6051,7 +6111,16 @@ HSPLandroidx/compose/ui/platform/AndroidUriHandler;->()V HSPLandroidx/compose/ui/platform/AndroidUriHandler;->(Landroid/content/Context;)V HSPLandroidx/compose/ui/platform/AndroidViewConfiguration;->()V HSPLandroidx/compose/ui/platform/AndroidViewConfiguration;->(Landroid/view/ViewConfiguration;)V +HSPLandroidx/compose/ui/platform/AndroidViewConfiguration;->getMinimumTouchTargetSize-MYxV2XQ()J +HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->()V +HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V +HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; +HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V +HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V +HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V +HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->()V +HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;->()V HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;->()V HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;->()V @@ -6063,6 +6132,7 @@ HSPLandroidx/compose/ui/platform/ComposeView;->(Landroid/content/Context;L HSPLandroidx/compose/ui/platform/ComposeView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/compose/ui/platform/ComposeView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/platform/ComposeView;->Content(Landroidx/compose/runtime/Composer;I)V +HSPLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; HSPLandroidx/compose/ui/platform/ComposeView;->getShouldCreateCompositionOnAttachedToWindow()Z HSPLandroidx/compose/ui/platform/ComposeView;->setContent(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAccessibilityManager$1;->()V @@ -6153,19 +6223,23 @@ HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->()V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->(Landroidx/compose/ui/graphics/layer/GraphicsLayer;Landroidx/compose/ui/graphics/GraphicsContext;Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->access$getDrawBlock$p(Landroidx/compose/ui/platform/GraphicsLayerOwnerLayer;)Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->drawLayer(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->getMatrix-sQKQjiQ()[F HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->invalidate()V +HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->move--gyyYBs(J)V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->resize-ozmzZPI(J)V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->setDirty(Z)V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->triggerRepaint()V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->updateDisplayList()V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->updateLayerProperties(Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope;)V +HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->updateMatrix()V HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->updateOutline()V HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->()V HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->()V HSPLandroidx/compose/ui/platform/InspectableValueKt;->()V HSPLandroidx/compose/ui/platform/InspectableValueKt;->getNoInspectorInfo()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/ui/platform/InspectableValueKt;->isDebugInspectorInfoEnabled()Z +HSPLandroidx/compose/ui/platform/InvertMatrixKt;->invertTo-JiSxe2E([F[F)Z HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->()V HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; @@ -6174,6 +6248,15 @@ HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->minusKey(Lkotlin/coro HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->setScaleFactor(F)V HSPLandroidx/compose/ui/platform/SemanticsNodeCopy;->()V HSPLandroidx/compose/ui/platform/SemanticsNodeCopy;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/collection/IntObjectMap;)V +HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->()V +HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Rect;)V +HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getAdjustedBounds()Landroid/graphics/Rect; +HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; +HSPLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->()V +HSPLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->getAllUncoveredSemanticsNodesToIntObjectMap$findAllSemanticNodesRecursive(Landroid/graphics/Region;Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/collection/MutableIntObjectMap;Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Region;)V +HSPLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->getAllUncoveredSemanticsNodesToIntObjectMap(Landroidx/compose/ui/semantics/SemanticsOwner;)Landroidx/collection/IntObjectMap; +HSPLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->isImportantForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->toLegacyClassName-V4PA4sw(I)Ljava/lang/String; HSPLandroidx/compose/ui/platform/TextToolbarStatus;->$values()[Landroidx/compose/ui/platform/TextToolbarStatus; HSPLandroidx/compose/ui/platform/TextToolbarStatus;->()V HSPLandroidx/compose/ui/platform/TextToolbarStatus;->(Ljava/lang/String;I)V @@ -6207,6 +6290,7 @@ HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->$r8$lambda$ HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$installForLifecycle(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/lifecycle/Lifecycle;)Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->installForLifecycle$lambda$1(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->installForLifecycle(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/lifecycle/Lifecycle;)Lkotlin/jvm/functions/Function0; +HSPLandroidx/compose/ui/platform/ViewConfiguration$-CC;->$default$getMinimumTouchTargetSize-MYxV2XQ(Landroidx/compose/ui/platform/ViewConfiguration;)J HSPLandroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1;->()V HSPLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->()V HSPLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->()V @@ -6305,6 +6389,8 @@ HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->onDescend HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->()V HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->doSetContent(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/runtime/CompositionContext;Lkotlin/jvm/functions/Function2;)Landroidx/compose/runtime/Composition; HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->setContent(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/runtime/CompositionContext;Lkotlin/jvm/functions/Function2;)Landroidx/compose/runtime/Composition; +HSPLandroidx/compose/ui/platform/accessibility/CollectionInfo_androidKt;->setCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/compose/ui/platform/accessibility/CollectionInfo_androidKt;->setCollectionItemInfo(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback;->()V HSPLandroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/geometry/Rect;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/geometry/Rect;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -6338,34 +6424,83 @@ HSPLandroidx/compose/ui/res/VectorResources_androidKt;->loadVectorResourceInner( HSPLandroidx/compose/ui/scrollcapture/ScrollCapture;->()V HSPLandroidx/compose/ui/scrollcapture/ScrollCapture;->()V HSPLandroidx/compose/ui/scrollcapture/ScrollCapture;->getScrollCaptureInProgress()Z +HSPLandroidx/compose/ui/semantics/AccessibilityAction;->()V +HSPLandroidx/compose/ui/semantics/AccessibilityAction;->(Ljava/lang/String;Lkotlin/Function;)V +HSPLandroidx/compose/ui/semantics/AccessibilityAction;->getLabel()Ljava/lang/String; HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->()V HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->(ZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->create()Landroidx/compose/ui/semantics/CoreSemanticsModifierNode; HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->()V HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->(ZZLkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldClearDescendantSemantics()Z +HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldMergeDescendantSemantics()Z HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->()V HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->(Landroidx/compose/ui/semantics/EmptySemanticsModifier;)V HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->create()Landroidx/compose/ui/semantics/EmptySemanticsModifier; HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->()V HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->()V +HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->getShouldClearDescendantSemantics()Z +HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->getShouldMergeDescendantSemantics()Z HSPLandroidx/compose/ui/semantics/Role$Companion;->()V HSPLandroidx/compose/ui/semantics/Role$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/semantics/Role$Companion;->getButton-o7Vup1c()I +HSPLandroidx/compose/ui/semantics/Role$Companion;->getCheckbox-o7Vup1c()I +HSPLandroidx/compose/ui/semantics/Role$Companion;->getImage-o7Vup1c()I +HSPLandroidx/compose/ui/semantics/Role$Companion;->getRadioButton-o7Vup1c()I +HSPLandroidx/compose/ui/semantics/Role$Companion;->getSwitch-o7Vup1c()I +HSPLandroidx/compose/ui/semantics/Role$Companion;->getTab-o7Vup1c()I HSPLandroidx/compose/ui/semantics/Role;->()V HSPLandroidx/compose/ui/semantics/Role;->(I)V HSPLandroidx/compose/ui/semantics/Role;->access$getButton$cp()I +HSPLandroidx/compose/ui/semantics/Role;->access$getCheckbox$cp()I +HSPLandroidx/compose/ui/semantics/Role;->access$getImage$cp()I +HSPLandroidx/compose/ui/semantics/Role;->access$getRadioButton$cp()I +HSPLandroidx/compose/ui/semantics/Role;->access$getSwitch$cp()I +HSPLandroidx/compose/ui/semantics/Role;->access$getTab$cp()I HSPLandroidx/compose/ui/semantics/Role;->box-impl(I)Landroidx/compose/ui/semantics/Role; HSPLandroidx/compose/ui/semantics/Role;->constructor-impl(I)I +HSPLandroidx/compose/ui/semantics/Role;->equals-impl0(II)Z +HSPLandroidx/compose/ui/semantics/Role;->unbox-impl()I HSPLandroidx/compose/ui/semantics/SemanticsActions;->()V HSPLandroidx/compose/ui/semantics/SemanticsActions;->()V +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getClearTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCollapse()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCopyText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCustomActions()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCutText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getDismiss()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getExpand()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getGetTextLayoutResult()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getOnClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getOnImeAction()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getOnLongClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageDown()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageLeft()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageRight()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageUp()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPasteText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getRequestFocus()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getScrollBy()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetProgress()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetSelection()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsActions;->getShowTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->contains(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Z +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->containsImportantForAccessibility$ui_release()Z +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->get(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->getOrElseNullable(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->isClearingSemantics()Z +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->isMergingSemanticsOfDescendants()Z +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->setClearingSemantics(Z)V +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->setMergingSemanticsOfDescendants(Z)V HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->invoke()Ljava/lang/Object; @@ -6374,18 +6509,47 @@ HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->()V HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->generateSemanticsId()I HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics$default(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(Landroidx/compose/ui/semantics/Role;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->()V +HSPLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->()V +HSPLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; +HSPLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->()V +HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->()V +HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; +HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsNode;->()V HSPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/Modifier$Node;ZLandroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/ui/semantics/SemanticsNode;->emitFakeNodes(Ljava/util/List;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode;->fakeSemanticsNode-ypyhhiA(Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->fillOneLayerOfSemanticsWrappers(Landroidx/compose/ui/node/LayoutNode;Ljava/util/List;Z)V +HSPLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui_release()Landroidx/compose/ui/node/NodeCoordinator; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren$ui_release$default(Landroidx/compose/ui/semantics/SemanticsNode;ZZZILjava/lang/Object;)Ljava/util/List; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren$ui_release(ZZZ)Ljava/util/List; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getId()I +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutInfo()Landroidx/compose/ui/layout/LayoutInfo; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutNode$ui_release()Landroidx/compose/ui/node/LayoutNode; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getReplacedChildren$ui_release()Ljava/util/List; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getTouchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getUnmergedConfig$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->isFake$ui_release()Z HSPLandroidx/compose/ui/semantics/SemanticsNode;->isMergingSemanticsOfDescendants()Z +HSPLandroidx/compose/ui/semantics/SemanticsNode;->isTransparent$ui_release()Z +HSPLandroidx/compose/ui/semantics/SemanticsNode;->isUnmergedLeafNode$ui_release()Z HSPLandroidx/compose/ui/semantics/SemanticsNode;->unmergedChildren$ui_release(ZZ)Ljava/util/List; +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->SemanticsNode(Landroidx/compose/ui/node/LayoutNode;Z)Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->access$getRole(Landroidx/compose/ui/semantics/SemanticsNode;)Landroidx/compose/ui/semantics/Role; +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->access$roleFakeNodeId(Landroidx/compose/ui/semantics/SemanticsNode;)I +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->findClosestParentNode(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterMergingSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getRole(Landroidx/compose/ui/semantics/SemanticsNode;)Landroidx/compose/ui/semantics/Role; +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->roleFakeNodeId(Landroidx/compose/ui/semantics/SemanticsNode;)I HSPLandroidx/compose/ui/semantics/SemanticsOwner;->()V HSPLandroidx/compose/ui/semantics/SemanticsOwner;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/EmptySemanticsModifier;)V HSPLandroidx/compose/ui/semantics/SemanticsOwner;->getUnmergedRootSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; @@ -6418,21 +6582,28 @@ HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getCollectionItemInfo()L HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getContentDataType$ui_release()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getContentDescription()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getContentType$ui_release()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getDisabled()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getEditableText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getError()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getFocused()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getHeading()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getHorizontalScrollAxisRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getImeAction()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getInvisibleToUser()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getIsEditable()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getIsShowingTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getIsTraversalGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getLiveRegion()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getMaxTextLength()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getPaneTitle()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getPassword()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getProgressBarRangeInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getRole()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getSelectableGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getSelected()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getStateDescription()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getTestTag()Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getTextSelectionRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getToggleableState()Landroidx/compose/ui/semantics/SemanticsPropertyKey; @@ -6443,6 +6614,21 @@ HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->AccessibilityKey(Ljava/lang/String;)Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->AccessibilityKey(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/semantics/SemanticsPropertyKey; +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->clearTextSubstitution$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->clearTextSubstitution(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->onClick(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->requestFocus$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->requestFocus(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContentDescription(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setFocused(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Z)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setRole-kuIjeqM(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;I)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setText(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/text/AnnotatedString;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTextSubstitution$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTextSubstitution(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->showTextSubstitution$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->showTextSubstitution(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->()V @@ -6450,6 +6636,8 @@ HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/Strin HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;Z)V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;ZLkotlin/jvm/functions/Function2;)V +HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->isImportantForAccessibility$ui_release()Z +HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->setValue(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V HSPLandroidx/compose/ui/text/AndroidParagraph;->()V HSPLandroidx/compose/ui/text/AndroidParagraph;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;IZJ)V HSPLandroidx/compose/ui/text/AndroidParagraph;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;IZJLkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -6485,7 +6673,13 @@ HSPLandroidx/compose/ui/text/AnnotatedString;->()V HSPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V HSPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V +HSPLandroidx/compose/ui/text/AnnotatedString;->getLength()I +HSPLandroidx/compose/ui/text/AnnotatedString;->getLinkAnnotations(II)Ljava/util/List; +HSPLandroidx/compose/ui/text/AnnotatedString;->getSpanStylesOrNull$ui_text_release()Ljava/util/List; HSPLandroidx/compose/ui/text/AnnotatedString;->getText()Ljava/lang/String; +HSPLandroidx/compose/ui/text/AnnotatedString;->getTtsAnnotations(II)Ljava/util/List; +HSPLandroidx/compose/ui/text/AnnotatedString;->getUrlAnnotations(II)Ljava/util/List; +HSPLandroidx/compose/ui/text/AnnotatedString;->length()I HSPLandroidx/compose/ui/text/EmojiSupportMatch$Companion;->()V HSPLandroidx/compose/ui/text/EmojiSupportMatch$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/text/EmojiSupportMatch$Companion;->getDefault-_3YsG6Y()I @@ -7055,6 +7249,7 @@ HSPLandroidx/compose/ui/text/intl/LocaleList;->access$getEmpty$cp()Landroidx/com HSPLandroidx/compose/ui/text/intl/LocaleList;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/intl/PlatformLocaleKt;->()V HSPLandroidx/compose/ui/text/intl/PlatformLocaleKt;->getPlatformLocaleDelegate()Landroidx/compose/ui/text/intl/PlatformLocaleDelegate; +HSPLandroidx/compose/ui/text/platform/AndroidAccessibilitySpannableString_androidKt;->toAccessibilitySpannableString(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamily$Resolver;Landroidx/compose/ui/text/platform/URLSpanCache;)Landroid/text/SpannableString; HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1;->()V HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->()V HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->createCharSequence(Ljava/lang/String;FLandroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function4;Z)Ljava/lang/CharSequence; @@ -7366,6 +7561,7 @@ HSPLandroidx/compose/ui/unit/ConstraintsKt;->offset-NN6Ew-U(JII)J HSPLandroidx/compose/ui/unit/Density$-CC;->$default$roundToPx-0680j_4(Landroidx/compose/ui/unit/Density;F)I HSPLandroidx/compose/ui/unit/Density$-CC;->$default$toPx--R2X_6o(Landroidx/compose/ui/unit/Density;J)F HSPLandroidx/compose/ui/unit/Density$-CC;->$default$toPx-0680j_4(Landroidx/compose/ui/unit/Density;F)F +HSPLandroidx/compose/ui/unit/Density$-CC;->$default$toSize-XkaWNTQ(Landroidx/compose/ui/unit/Density;J)J HSPLandroidx/compose/ui/unit/DensityImpl;->(FF)V HSPLandroidx/compose/ui/unit/DensityImpl;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/DensityKt;->Density$default(FFILjava/lang/Object;)Landroidx/compose/ui/unit/Density; @@ -7375,6 +7571,7 @@ HSPLandroidx/compose/ui/unit/DensityWithConverter;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/DensityWithConverter;->getDensity()F HSPLandroidx/compose/ui/unit/DensityWithConverter;->getFontScale()F HSPLandroidx/compose/ui/unit/DensityWithConverter;->toPx-0680j_4(F)F +HSPLandroidx/compose/ui/unit/DensityWithConverter;->toSize-XkaWNTQ(J)J HSPLandroidx/compose/ui/unit/Dp$Companion;->()V HSPLandroidx/compose/ui/unit/Dp$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/unit/Dp$Companion;->getHairline-D9Ej5fM()F @@ -7388,6 +7585,13 @@ HSPLandroidx/compose/ui/unit/Dp;->compareTo-0680j_4(FF)I HSPLandroidx/compose/ui/unit/Dp;->constructor-impl(F)F HSPLandroidx/compose/ui/unit/Dp;->equals-impl0(FF)Z HSPLandroidx/compose/ui/unit/Dp;->unbox-impl()F +HSPLandroidx/compose/ui/unit/DpKt;->DpSize-YgX7TsA(FF)J +HSPLandroidx/compose/ui/unit/DpSize$Companion;->()V +HSPLandroidx/compose/ui/unit/DpSize$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/compose/ui/unit/DpSize;->()V +HSPLandroidx/compose/ui/unit/DpSize;->constructor-impl(J)J +HSPLandroidx/compose/ui/unit/DpSize;->getHeight-D9Ej5fM(J)F +HSPLandroidx/compose/ui/unit/DpSize;->getWidth-D9Ej5fM(J)F HSPLandroidx/compose/ui/unit/FontScaling$-CC;->$default$toDp-GaN1DYA(Landroidx/compose/ui/unit/FontScaling;J)F HSPLandroidx/compose/ui/unit/IntOffset$Companion;->()V HSPLandroidx/compose/ui/unit/IntOffset$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -7456,6 +7660,10 @@ HSPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterTable;->()V HSPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterTable;->([F[F)V +HSPLandroidx/compose/ui/util/ListUtilsKt;->appendElement(Ljava/lang/Appendable;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/util/ListUtilsKt;->fastJoinTo(Ljava/util/List;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; +HSPLandroidx/compose/ui/util/ListUtilsKt;->fastJoinToString$default(Ljava/util/List;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; +HSPLandroidx/compose/ui/util/ListUtilsKt;->fastJoinToString(Ljava/util/List;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->()V HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->(Landroidx/constraintlayout/core/ArrayRow;Landroidx/constraintlayout/core/Cache;)V @@ -7467,7 +7675,6 @@ HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getCurrentSize()I HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getVariable(I)Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getVariableValue(I)F HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->invert()V -HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->use(Landroidx/constraintlayout/core/ArrayRow;Z)F HSPLandroidx/constraintlayout/core/ArrayRow;->(Landroidx/constraintlayout/core/Cache;)V HSPLandroidx/constraintlayout/core/ArrayRow;->addError(Landroidx/constraintlayout/core/LinearSystem;I)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/ArrayRow;->addSingleError(Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; @@ -7501,7 +7708,6 @@ HSPLandroidx/constraintlayout/core/LinearSystem;->addLowerThan(Landroidx/constra HSPLandroidx/constraintlayout/core/LinearSystem;->addRow(Landroidx/constraintlayout/core/ArrayRow;)V HSPLandroidx/constraintlayout/core/LinearSystem;->addSingleError(Landroidx/constraintlayout/core/ArrayRow;II)V HSPLandroidx/constraintlayout/core/LinearSystem;->computeValues()V -HSPLandroidx/constraintlayout/core/LinearSystem;->createObjectVariable(Ljava/lang/Object;)Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/LinearSystem;->createRow()Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/LinearSystem;->createSlackVariable()Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/LinearSystem;->enforceBFS(Landroidx/constraintlayout/core/LinearSystem$Row;)I @@ -7543,7 +7749,6 @@ HSPLandroidx/constraintlayout/core/SolverVariable;->removeFromRow(Landroidx/cons HSPLandroidx/constraintlayout/core/SolverVariable;->reset()V HSPLandroidx/constraintlayout/core/SolverVariable;->setFinalValue(Landroidx/constraintlayout/core/LinearSystem;F)V HSPLandroidx/constraintlayout/core/SolverVariable;->setType(Landroidx/constraintlayout/core/SolverVariable$Type;Ljava/lang/String;)V -HSPLandroidx/constraintlayout/core/SolverVariable;->updateReferencesWithNewDefinition(Landroidx/constraintlayout/core/LinearSystem;Landroidx/constraintlayout/core/ArrayRow;)V HSPLandroidx/constraintlayout/core/state/WidgetFrame;->()V HSPLandroidx/constraintlayout/core/state/WidgetFrame;->(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/Barrier;->()V @@ -7679,6 +7884,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->invalidat HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isHeightMeasuredTooSmall()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isRtl()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isWidthMeasuredTooSmall()Z +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->layout()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->measure(IIIIIIIII)J HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->measure(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;I)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->optimizeFor(I)Z @@ -7705,7 +7911,6 @@ HSPLandroidx/constraintlayout/core/widgets/WidgetContainer;->resetSolverVariable HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;)V -HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->measure(Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)Z HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->measureChildren(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->solveLinearSystem(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;Ljava/lang/String;III)V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->solverMeasure(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;IIIIIIIII)J @@ -7747,6 +7952,7 @@ HSPLandroidx/constraintlayout/widget/ConstraintHelper;->validateParams()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$1;->()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table;->()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->resolveLayoutDirection(I)V +HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->validate()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->(Landroidx/constraintlayout/widget/ConstraintLayout;Landroidx/constraintlayout/widget/ConstraintLayout;)V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->captureLayoutInfo(IIIIII)V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->didMeasures()V @@ -8065,14 +8271,19 @@ HSPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lan HSPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/core/util/Preconditions;->checkState(ZLjava/lang/String;)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->(Landroid/view/View$AccessibilityDelegate;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +HSPLandroidx/core/view/AccessibilityDelegateCompat;->getActionList(Landroid/view/View;)Ljava/util/List; HSPLandroidx/core/view/AccessibilityDelegateCompat;->getBridge()Landroid/view/View$AccessibilityDelegate; HSPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z HSPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/GestureDetectorCompat;->(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;)V @@ -8104,10 +8315,20 @@ HSPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl30;->(Landroid HSPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl;->()V HSPLandroidx/core/view/SoftwareKeyboardControllerCompat;->(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda1;->()V +HSPLandroidx/core/view/ViewCompat$1;->(ILjava/lang/Class;I)V +HSPLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; +HSPLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; HSPLandroidx/core/view/ViewCompat$2;->(ILjava/lang/Class;II)V HSPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; HSPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +HSPLandroidx/core/view/ViewCompat$3;->(ILjava/lang/Class;II)V +HSPLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; +HSPLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +HSPLandroidx/core/view/ViewCompat$4;->(ILjava/lang/Class;I)V +HSPLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; +HSPLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; HSPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->()V +HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;I)V HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;II)V HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->frameworkAvailable()Z HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object; @@ -8119,9 +8340,13 @@ HSPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Lan HSPLandroidx/core/view/ViewCompat$Api26Impl;->getImportantForAutofill(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat$Api26Impl;->setImportantForAutofill(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat$Api28Impl;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence; +HSPLandroidx/core/view/ViewCompat$Api28Impl;->isAccessibilityHeading(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat$Api28Impl;->isScreenReaderFocusable(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat$Api29Impl;->getAccessibilityDelegate(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; HSPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +HSPLandroidx/core/view/ViewCompat$Api30Impl;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; HSPLandroidx/core/view/ViewCompat;->()V +HSPLandroidx/core/view/ViewCompat;->accessibilityHeadingProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewCompat;->addAccessibilityAction(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V HSPLandroidx/core/view/ViewCompat;->ensureAccessibilityDelegateCompat(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->getAccessibilityDelegate(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; @@ -8138,9 +8363,12 @@ HSPLandroidx/core/view/ViewCompat;->getMinimumHeight(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat;->getMinimumWidth(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat;->getPaddingEnd(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat;->getPaddingStart(Landroid/view/View;)I +HSPLandroidx/core/view/ViewCompat;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; HSPLandroidx/core/view/ViewCompat;->hasAccessibilityDelegate(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->hasOnClickListeners(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat;->isAccessibilityHeading(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->isLaidOut(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat;->isScreenReaderFocusable(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->notifyViewAccessibilityStateChangedIfNeeded(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat;->offsetLeftAndRight(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat;->offsetTopAndBottom(Landroid/view/View;I)V @@ -8152,6 +8380,7 @@ HSPLandroidx/core/view/ViewCompat;->removeActionWithId(ILandroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->replaceAccessibilityAction(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;Ljava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;)V HSPLandroidx/core/view/ViewCompat;->requestApplyInsets(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +HSPLandroidx/core/view/ViewCompat;->screenReaderFocusableProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V HSPLandroidx/core/view/ViewCompat;->setBackground(Landroid/view/View;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/core/view/ViewCompat;->setBackgroundTintList(Landroid/view/View;Landroid/content/res/ColorStateList;)V @@ -8161,6 +8390,7 @@ HSPLandroidx/core/view/ViewCompat;->setImportantForAccessibilityIfNeeded(Landroi HSPLandroidx/core/view/ViewCompat;->setImportantForAutofill(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V HSPLandroidx/core/view/ViewCompat;->setPaddingRelative(Landroid/view/View;IIII)V +HSPLandroidx/core/view/ViewCompat;->stateDescriptionProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;)F HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;)F HSPLandroidx/core/view/ViewConfigurationCompat$Api28Impl;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;)Z @@ -8171,6 +8401,11 @@ HSPLandroidx/core/view/ViewConfigurationCompat;->shouldShowMenuShortcutsWhenKeyb HSPLandroidx/core/view/ViewKt$doOnPreDraw$1;->(Lkotlin/jvm/functions/Function1;Landroid/view/View;)V HSPLandroidx/core/view/ViewKt$doOnPreDraw$1;->run()V HSPLandroidx/core/view/ViewKt;->doOnPreDraw(Landroid/view/View;Lkotlin/jvm/functions/Function1;)Landroidx/core/view/OneShotPreDrawListener; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline13;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline14;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline4;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline11;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline13;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; @@ -8194,9 +8429,59 @@ HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityAc HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->createReplacementAction(Ljava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->getId()I +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->()V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addChild(Landroid/view/View;I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addSpansToExtras(Ljava/lang/CharSequence;Landroid/view/View;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/List; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getMovementGranularities()I +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->hasSpans()Z +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isClickable()Z +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocusable()Z +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocused()Z +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->obtain()Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setAccessibilityFocused(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setAvailableExtraData(Ljava/util/List;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setBoundsInScreen(Landroid/graphics/Rect;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCheckable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClickable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setContentDescription(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEditable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEnabled(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocusable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocused(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHeading(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setImportantForAccessibility(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setLongClickable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setMaxTextLength(I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setMovementGranularities(I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPackageName(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPassword(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScrollable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setSource(Landroid/view/View;I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setText(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setTextSelection(II)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setVisibleToUser(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->wrap(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;->(Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi26;->(Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->()V +HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->getProvider()Ljava/lang/Object; HSPLandroidx/core/view/animation/PathInterpolatorCompat$Api21Impl;->createPathInterpolator(FFFF)Landroid/view/animation/Interpolator; HSPLandroidx/core/view/animation/PathInterpolatorCompat;->create(FFFF)Landroid/view/animation/Interpolator; HSPLandroidx/core/widget/ImageViewCompat$Api21Impl;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V @@ -9031,9 +9316,12 @@ HSPLandroidx/lifecycle/Transformations$switchMap$1;->invoke(Ljava/lang/Object;)V HSPLandroidx/lifecycle/Transformations;->map(Landroidx/lifecycle/LiveData;Lkotlin/jvm/functions/Function1;)Landroidx/lifecycle/LiveData; HSPLandroidx/lifecycle/Transformations;->switchMap(Landroidx/lifecycle/LiveData;Lkotlin/jvm/functions/Function1;)Landroidx/lifecycle/LiveData; HSPLandroidx/lifecycle/ViewModel;->()V +HSPLandroidx/lifecycle/ViewModel;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V HSPLandroidx/lifecycle/ViewModel;->clear$lifecycle_viewmodel_release()V HSPLandroidx/lifecycle/ViewModel;->getCloseable(Ljava/lang/String;)Ljava/lang/AutoCloseable; HSPLandroidx/lifecycle/ViewModel;->onCleared()V +HSPLandroidx/lifecycle/ViewModelKt;->()V +HSPLandroidx/lifecycle/ViewModelKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Lkotlinx/coroutines/CoroutineScope; HSPLandroidx/lifecycle/ViewModelLazy;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object; @@ -9128,11 +9416,16 @@ HSPLandroidx/lifecycle/viewmodel/ViewModelProviderImpl;->(Landroidx/lifecy HSPLandroidx/lifecycle/viewmodel/ViewModelProviderImpl;->getViewModel$lifecycle_viewmodel_release$default(Landroidx/lifecycle/viewmodel/ViewModelProviderImpl;Lkotlin/reflect/KClass;Ljava/lang/String;ILjava/lang/Object;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/viewmodel/ViewModelProviderImpl;->getViewModel$lifecycle_viewmodel_release(Lkotlin/reflect/KClass;Ljava/lang/String;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/viewmodel/ViewModelProviderImpl_androidKt;->createViewModel(Landroidx/lifecycle/ViewModelProvider$Factory;Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +HSPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->(Lkotlin/coroutines/CoroutineContext;)V +HSPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +HSPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScopeKt;->createViewModelScope()Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; HSPLandroidx/lifecycle/viewmodel/internal/SynchronizedObject;->()V HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->()V HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->access$getCloseables$p(Landroidx/lifecycle/viewmodel/internal/ViewModelImpl;)Ljava/util/Set; HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->access$getKeyToCloseables$p(Landroidx/lifecycle/viewmodel/internal/ViewModelImpl;)Ljava/util/Map; +HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->clear()V +HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->closeWithRuntimeException(Ljava/lang/AutoCloseable;)V HSPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->getCloseable(Ljava/lang/String;)Ljava/lang/AutoCloseable; HSPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders$ViewModelKey;->()V HSPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders$ViewModelKey;->()V @@ -11058,6 +11351,7 @@ HSPLandroidx/recyclerview/widget/AsyncListDiffer;->addListListener(Landroidx/rec HSPLandroidx/recyclerview/widget/AsyncListDiffer;->getCurrentList()Ljava/util/List; HSPLandroidx/recyclerview/widget/AsyncListDiffer;->latchList(Ljava/util/List;Landroidx/recyclerview/widget/DiffUtil$DiffResult;Ljava/lang/Runnable;)V HSPLandroidx/recyclerview/widget/AsyncListDiffer;->onCurrentListChanged(Ljava/util/List;Ljava/lang/Runnable;)V +HSPLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;)V HSPLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;Ljava/lang/Runnable;)V HSPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->(Landroidx/recyclerview/widget/ListUpdateCallback;)V HSPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->dispatchLastEvent()V @@ -11079,6 +11373,7 @@ HSPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I HSPLandroidx/recyclerview/widget/ChildHelper;->getOffset(I)I HSPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildAt(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I +HSPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z HSPLandroidx/recyclerview/widget/ChildHelper;->removeAllViewsUnfiltered()V HSPLandroidx/recyclerview/widget/ChildHelper;->removeViewIfHidden(Landroid/view/View;)Z HSPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Ljava/util/ArrayList;)V @@ -11155,6 +11450,9 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll HSPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z HSPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollVertically()Z +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I @@ -11203,13 +11501,16 @@ HSPLandroidx/recyclerview/widget/ListAdapter;->(Landroidx/recyclerview/wid HSPLandroidx/recyclerview/widget/ListAdapter;->getItem(I)Ljava/lang/Object; HSPLandroidx/recyclerview/widget/ListAdapter;->getItemCount()I HSPLandroidx/recyclerview/widget/ListAdapter;->onCurrentListChanged(Ljava/util/List;Ljava/util/List;)V +HSPLandroidx/recyclerview/widget/ListAdapter;->submitList(Ljava/util/List;)V HSPLandroidx/recyclerview/widget/ListAdapter;->submitList(Ljava/util/List;Ljava/lang/Runnable;)V HSPLandroidx/recyclerview/widget/OpReorderer;->(Landroidx/recyclerview/widget/OpReorderer$Callback;)V HSPLandroidx/recyclerview/widget/OpReorderer;->getLastMoveOutOfOrder(Ljava/util/List;)I HSPLandroidx/recyclerview/widget/OpReorderer;->reorderOps(Ljava/util/List;)V HSPLandroidx/recyclerview/widget/OrientationHelper$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedEnd(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurement(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurementInOther(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndAfterPadding()I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndPadding()I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getMode()I @@ -11293,6 +11594,11 @@ HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->getItemOffsets(La HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildAt(I)Landroid/view/View; +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildEnd(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildStart(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentEnd()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentStart()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildAt(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildEnd(Landroid/view/View;)I @@ -11317,15 +11623,19 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBottomDecoratio HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildAt(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBoundsWithMargins(Landroid/view/View;Landroid/graphics/Rect;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedRight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getFocusedChild()Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeightMode()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumHeight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumWidth()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingBottom()I @@ -11334,9 +11644,13 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getProperties(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties; +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRightDecorationWidth(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidth()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidthMode()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isLayoutHierarchical(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToDate(III)Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->measureChildWithMargins(Landroid/view/View;II)V @@ -11344,6 +11658,10 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(L HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsAdded(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onMeasure(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V @@ -11454,6 +11772,9 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->animateAppearance(Landroidx/recy HSPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V HSPLandroidx/recyclerview/widget/RecyclerView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V +HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I +HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I +HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I HSPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollExtent()I HSPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollOffset()I HSPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollRange()I @@ -11481,6 +11802,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/re HSPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView;->getDecoratedBoundsWithMarginsInt(Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroidx/recyclerview/widget/RecyclerView;->getFullClassName(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String; +HSPLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; HSPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect; HSPLandroidx/recyclerview/widget/RecyclerView;->getLayoutManager()Landroidx/recyclerview/widget/RecyclerView$LayoutManager; HSPLandroidx/recyclerview/widget/RecyclerView;->getNanoTime()J @@ -11535,10 +11857,13 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->stopScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->stopScrollersInternal()V HSPLandroidx/recyclerview/widget/RecyclerView;->suppressLayout(Z)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->saveOriginalDelegate(Landroid/view/View;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->getItemDelegate()Landroidx/core/view/AccessibilityDelegateCompat; HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->shouldIgnore()Z HSPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I HSPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;ZZ)I @@ -11608,6 +11933,7 @@ HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRe HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->get(Landroid/view/View;)Landroidx/savedstate/SavedStateRegistryOwner; HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->(Ljava/lang/String;[Ljava/lang/Object;)V +HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->bind(Landroidx/sqlite/db/SupportSQLiteProgram;ILjava/lang/Object;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->bind(Landroidx/sqlite/db/SupportSQLiteProgram;[Ljava/lang/Object;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->getSql()Ljava/lang/String; @@ -11874,7 +12200,6 @@ HSPLcom/airbnb/lottie/animation/keyframe/ShapeKeyframeAnimation;->(Ljava/u HSPLcom/airbnb/lottie/animation/keyframe/ShapeKeyframeAnimation;->getValue(Lcom/airbnb/lottie/value/Keyframe;F)Landroid/graphics/Path; HSPLcom/airbnb/lottie/animation/keyframe/ShapeKeyframeAnimation;->getValue(Lcom/airbnb/lottie/value/Keyframe;F)Ljava/lang/Object; HSPLcom/airbnb/lottie/animation/keyframe/ShapeKeyframeAnimation;->setShapeModifiers(Ljava/util/List;)V -HSPLcom/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation;->(Lcom/airbnb/lottie/model/animatable/AnimatableTransform;)V HSPLcom/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation;->addAnimationsToLayer(Lcom/airbnb/lottie/model/layer/BaseLayer;)V HSPLcom/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation;->addListener(Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation$AnimationListener;)V HSPLcom/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation;->applyValueCallback(Ljava/lang/Object;Lcom/airbnb/lottie/value/LottieValueCallback;)Z @@ -11988,6 +12313,7 @@ HSPLcom/airbnb/lottie/model/layer/BaseLayer$$ExternalSyntheticLambda0;->(L HSPLcom/airbnb/lottie/model/layer/BaseLayer$$ExternalSyntheticLambda0;->onValueChanged()V HSPLcom/airbnb/lottie/model/layer/BaseLayer$1;->()V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->$r8$lambda$Sex8aFGiTOtvDrIkDy-hn-ODWJE(Lcom/airbnb/lottie/model/layer/BaseLayer;)V +HSPLcom/airbnb/lottie/model/layer/BaseLayer;->(Lcom/airbnb/lottie/LottieDrawable;Lcom/airbnb/lottie/model/layer/Layer;)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->addAnimation(Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation;)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->addValueCallback(Ljava/lang/Object;Lcom/airbnb/lottie/value/LottieValueCallback;)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->buildParentLayerListIfNeeded()V @@ -12146,6 +12472,7 @@ HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->(Lokio/BufferedSource; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->beginArray()V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->beginObject()V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->close()V +HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->doPeek()I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->endArray()V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->endObject()V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->findName(Ljava/lang/String;Lcom/airbnb/lottie/parser/moshi/JsonReader$Options;)I @@ -12161,6 +12488,7 @@ HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextString()Ljava/lang/Strin HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peek()Lcom/airbnb/lottie/parser/moshi/JsonReader$Token; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peekKeyword()I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peekNumber()I +HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->selectName(Lcom/airbnb/lottie/parser/moshi/JsonReader$Options;)I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->skipName()V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->skipQuotedValue(Lokio/ByteString;)V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->skipValue()V @@ -12313,7 +12641,6 @@ HSPLcom/annimon/stream/iterator/IndexedIterator;->hasNext()Z HSPLcom/annimon/stream/iterator/IndexedIterator;->next()Ljava/lang/Object; HSPLcom/annimon/stream/iterator/LazyIterator;->(Ljava/lang/Iterable;)V HSPLcom/annimon/stream/iterator/LazyIterator;->ensureIterator()V -HSPLcom/annimon/stream/iterator/LazyIterator;->hasNext()Z HSPLcom/annimon/stream/iterator/LazyIterator;->next()Ljava/lang/Object; HSPLcom/annimon/stream/iterator/LsaExtIterator;->()V HSPLcom/annimon/stream/iterator/LsaExtIterator;->hasNext()Z @@ -13394,11 +13721,8 @@ HSPLcom/fasterxml/jackson/core/base/ParserBase;->_handleEOF()V HSPLcom/fasterxml/jackson/core/base/ParserBase;->_parseIntValue()I HSPLcom/fasterxml/jackson/core/base/ParserBase;->_parseNumericValue(I)V HSPLcom/fasterxml/jackson/core/base/ParserBase;->_releaseBuffers()V -HSPLcom/fasterxml/jackson/core/base/ParserBase;->_validJsonTokenList()Ljava/lang/String; -HSPLcom/fasterxml/jackson/core/base/ParserBase;->_validJsonValueList()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/base/ParserBase;->close()V HSPLcom/fasterxml/jackson/core/base/ParserBase;->convertNumberToLong()V -HSPLcom/fasterxml/jackson/core/base/ParserBase;->getCurrentName()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/base/ParserBase;->getIntValue()I HSPLcom/fasterxml/jackson/core/base/ParserBase;->getLongValue()J HSPLcom/fasterxml/jackson/core/base/ParserBase;->getNumberType()Lcom/fasterxml/jackson/core/JsonParser$NumberType; @@ -13407,7 +13731,9 @@ HSPLcom/fasterxml/jackson/core/base/ParserBase;->resetInt(ZI)Lcom/fasterxml/jack HSPLcom/fasterxml/jackson/core/base/ParserBase;->setCurrentValue(Ljava/lang/Object;)V HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->()V HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->(I)V +HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->_getCharDesc(I)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->_reportError(Ljava/lang/String;)V +HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->_throwInvalidSpace(I)V HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->currentToken()Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->currentTokenId()I HSPLcom/fasterxml/jackson/core/base/ParserMinimalBase;->getValueAsString()Ljava/lang/String; @@ -13499,6 +13825,7 @@ HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->(Lcom/fasterxm HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->(Lcom/fasterxml/jackson/core/io/IOContext;ILjava/io/Reader;Lcom/fasterxml/jackson/core/ObjectCodec;Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;[CIIZ)V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_closeInput()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_closeScope(I)V +HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_finishString()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_finishString2()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_loadMore()Z HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchFalse()V @@ -13545,13 +13872,9 @@ HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeString(Ljava/lang/S HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeString([CII)V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->(Lcom/fasterxml/jackson/core/io/IOContext;ILjava/io/InputStream;Lcom/fasterxml/jackson/core/ObjectCodec;Lcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;[BIIIZ)V -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_closeArrayScope()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_closeInput()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_closeObjectScope()V -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_decodeCharForError(I)I -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_finishAndReturnString()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_finishString2([CI)V -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_handleUnexpectedValue(I)Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_loadMore()Z HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_loadMoreGuaranteed()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_nextAfterName()Lcom/fasterxml/jackson/core/JsonToken; @@ -13560,12 +13883,9 @@ HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_padLastQuad(II)I HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_parseName(I)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_parsePosNumber(I)Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_releaseBuffers()V -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_reportInvalidOther(I)V -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_reportInvalidToken(Ljava/lang/String;Ljava/lang/String;)V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_skipColon()I HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_skipWS()I HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_skipWS2()I -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_skipWSOrEnd()I HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_updateLocation()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_updateNameLocation()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->addName([III)Ljava/lang/String; @@ -13576,9 +13896,7 @@ HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName([IIII)Ljava/ HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getCurrentLocation()Lcom/fasterxml/jackson/core/JsonLocation; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getReadCapabilities()Lcom/fasterxml/jackson/core/util/JacksonFeatureSet; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getText()Ljava/lang/String; -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->nextByte()I HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->nextFieldName()Ljava/lang/String; -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->nextToken()Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseEscapedName([IIIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseLongName(III)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseMediumName(I)Ljava/lang/String; @@ -13590,6 +13908,7 @@ HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_flushBuffer()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_releaseBuffers()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_verifyValueWrite(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeBinary(Lcom/fasterxml/jackson/core/Base64Variant;[BII)V +HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeFieldName(Lcom/fasterxml/jackson/core/SerializableString;Z)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeFieldName(Ljava/lang/String;Z)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeNull()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeString(Ljava/lang/String;)V @@ -13616,7 +13935,6 @@ HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_calcTertiaryShift(I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_checkNeedForRehash()Z HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_findOffsetForAdd(I)I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_findSecondary(III)Ljava/lang/String; -HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_findSecondary(IIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_resizeAndFindOffsetForAdd(I)I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_spilloverStart()I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_verifyLongName([III)Z @@ -14177,6 +14495,7 @@ HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->_deserializeWithErro HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserializeFromObject(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; +HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->vanillaDeserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/core/JsonToken;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->()V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->(Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/deser/impl/BeanPropertyMap;Ljava/util/Map;Ljava/util/Set;ZLjava/util/Set;Z)V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->_delegateDeserializer()Lcom/fasterxml/jackson/databind/JsonDeserializer; @@ -14366,6 +14685,7 @@ HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->hasParameter HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->readIdProperty(Ljava/lang/String;)Z HSPLcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer;->(Ljava/lang/Class;Ljava/lang/Boolean;)V HSPLcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer;->_fromInt(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;)Lcom/fasterxml/jackson/databind/JsonNode; +HSPLcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer;->deserializeArray(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;)Lcom/fasterxml/jackson/databind/node/ArrayNode; HSPLcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer;->deserializeObject(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;)Lcom/fasterxml/jackson/databind/node/ObjectNode; HSPLcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer;->isCachable()Z HSPLcom/fasterxml/jackson/databind/deser/std/ContainerDeserializerBase;->(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)V @@ -14484,6 +14804,7 @@ HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/util/Collection; +HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/util/Collection;)Ljava/util/Collection; HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->isCachable()Z HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->withResolved(Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)Lcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StringDeserializer;->()V @@ -15024,6 +15345,8 @@ HSPLcom/fasterxml/jackson/databind/module/SimpleModule;->getModuleName()Ljava/la HSPLcom/fasterxml/jackson/databind/module/SimpleModule;->getTypeId()Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/module/SimpleModule;->setupModule(Lcom/fasterxml/jackson/databind/Module$SetupContext;)V HSPLcom/fasterxml/jackson/databind/module/SimpleModule;->version()Lcom/fasterxml/jackson/core/Version; +HSPLcom/fasterxml/jackson/databind/node/ArrayNode;->(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;)V +HSPLcom/fasterxml/jackson/databind/node/ArrayNode;->_add(Lcom/fasterxml/jackson/databind/JsonNode;)Lcom/fasterxml/jackson/databind/node/ArrayNode; HSPLcom/fasterxml/jackson/databind/node/ArrayNode;->add(Lcom/fasterxml/jackson/databind/JsonNode;)Lcom/fasterxml/jackson/databind/node/ArrayNode; HSPLcom/fasterxml/jackson/databind/node/ArrayNode;->elements()Ljava/util/Iterator; HSPLcom/fasterxml/jackson/databind/node/ArrayNode;->size()I @@ -15930,8 +16253,10 @@ HSPLcom/google/android/material/appbar/AppBarLayout$1;->(Lcom/google/andro HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/view/View$OnUnhandledKeyEventListener;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$$ExternalSyntheticLambda1;->(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;Landroid/view/View;Lcom/google/android/material/appbar/AppBarLayout;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$2;->(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$2;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$4;->(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;Lcom/google/android/material/appbar/AppBarLayout;Z)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->access$000(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->access$100(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)I HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->addAccessibilityScrollActions(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->addActionToExpand(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;Z)V @@ -16108,6 +16433,7 @@ HSPLcom/google/android/material/card/MaterialCardView;->isChecked()Z HSPLcom/google/android/material/card/MaterialCardView;->isDragged()Z HSPLcom/google/android/material/card/MaterialCardView;->onAttachedToWindow()V HSPLcom/google/android/material/card/MaterialCardView;->onCreateDrawableState(I)[I +HSPLcom/google/android/material/card/MaterialCardView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V HSPLcom/google/android/material/card/MaterialCardView;->onMeasure(II)V HSPLcom/google/android/material/card/MaterialCardView;->setAncestorContentPadding(IIII)V HSPLcom/google/android/material/card/MaterialCardView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V @@ -16628,7 +16954,6 @@ HSPLcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearanc HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->()V HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->angleOfEdge(I)F HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->appendCornerPath(Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;I)V -HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->appendEdgePath(Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;I)V HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Landroid/graphics/Path;)V HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Lcom/google/android/material/shape/ShapeAppearancePathProvider$PathListener;Landroid/graphics/Path;)V HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getCoordinatesOfCorner(ILandroid/graphics/RectF;Landroid/graphics/PointF;)V @@ -17573,6 +17898,8 @@ HSPLio/reactivex/rxjava3/core/Flowable;->bufferSize()I HSPLio/reactivex/rxjava3/core/Flowable;->combineLatest(Lorg/reactivestreams/Publisher;Lorg/reactivestreams/Publisher;Lio/reactivex/rxjava3/functions/BiFunction;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->combineLatestArray([Lorg/reactivestreams/Publisher;Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->create(Lio/reactivex/rxjava3/core/FlowableOnSubscribe;Lio/reactivex/rxjava3/core/BackpressureStrategy;)Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/core/Flowable;->debounce(JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/core/Flowable;->debounce(JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged()Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->doOnEach(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/core/Flowable; @@ -17673,6 +18000,7 @@ HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->(Ljava/lan HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->error(Ljava/lang/Throwable;Lio/reactivex/rxjava3/core/SingleObserver;)V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->()V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->dispose()V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->isDisposed()Z HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->replace(Lio/reactivex/rxjava3/disposables/Disposable;)Z HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->update(Lio/reactivex/rxjava3/disposables/Disposable;)Z @@ -17730,6 +18058,7 @@ HSPLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->(Ljava/ HSPLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->onError(Ljava/lang/Throwable;)V HSPLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->(Lorg/reactivestreams/Subscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->cancel()V HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->checkTerminated(ZZLorg/reactivestreams/Subscriber;Ljava/util/concurrent/atomic/AtomicReference;)Z HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->drain()V HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V @@ -17760,6 +18089,18 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$LatestAsyncE HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$LatestAsyncEmitter;->onRequested()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate;->(Lio/reactivex/rxjava3/core/FlowableOnSubscribe;Lio/reactivex/rxjava3/core/BackpressureStrategy;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate;->subscribeActual(Lorg/reactivestreams/Subscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter;->(Ljava/lang/Object;JLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter;->dispose()V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter;->emit()V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter;->run()V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter;->setResource(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;->(Lorg/reactivestreams/Subscriber;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler$Worker;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;->emit(JLjava/lang/Object;Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;->request(J)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed;->(Lio/reactivex/rxjava3/core/Flowable;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged$DistinctUntilChangedSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/functions/Function;Lio/reactivex/rxjava3/functions/BiPredicate;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged$DistinctUntilChangedSubscriber;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged$DistinctUntilChangedSubscriber;->requestFusion(I)I @@ -17773,6 +18114,7 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach;->subscrib HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture;->(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->(Lorg/reactivestreams/Subscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->cancel()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->request(J)V @@ -17830,7 +18172,9 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedRepla HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->getHead()Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$Node; HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->leaveTransform(Ljava/lang/Object;)Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->next(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->removeFirst()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->replay(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->setFirst(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$Node;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$DefaultUnboundedFactory;->()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$ReplaySubscriber;Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->index()Ljava/lang/Object; @@ -17993,7 +18337,9 @@ HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode;->soNext HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode;->spValue(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->()V HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->clear()V +HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->isEmpty()Z HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lpConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; +HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvProducerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->offer(Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->poll()Ljava/lang/Object; @@ -18030,6 +18376,7 @@ HSPLio/reactivex/rxjava3/internal/queue/SpscLinkedArrayQueue;->soProducerIndex(J HSPLio/reactivex/rxjava3/internal/queue/SpscLinkedArrayQueue;->writeToQueue(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/lang/Object;JI)Z HSPLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->()V HSPLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->(Ljava/lang/Runnable;Z)V +HSPLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->cancelFuture(Ljava/util/concurrent/Future;)V HSPLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->dispose()V HSPLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->setFuture(Ljava/util/concurrent/Future;)V HSPLio/reactivex/rxjava3/internal/schedulers/DisposeOnCancel;->(Lio/reactivex/rxjava3/disposables/Disposable;)V @@ -18141,6 +18488,13 @@ HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->removeEntry(I[Ljava/lang/Ob HSPLio/reactivex/rxjava3/internal/util/Pow2;->roundToPowerOfTwo(I)I HSPLio/reactivex/rxjava3/kotlin/DisposableKt;->addTo(Lio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/DisposableKt;->plusAssign(Lio/reactivex/rxjava3/disposables/CompositeDisposable;Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/kotlin/Flowables$combineLatest$2;->()V +HSPLio/reactivex/rxjava3/kotlin/Flowables$combineLatest$2;->()V +HSPLio/reactivex/rxjava3/kotlin/Flowables$combineLatest$2;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLio/reactivex/rxjava3/kotlin/Flowables$combineLatest$2;->apply(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair; +HSPLio/reactivex/rxjava3/kotlin/Flowables;->()V +HSPLio/reactivex/rxjava3/kotlin/Flowables;->()V +HSPLio/reactivex/rxjava3/kotlin/Flowables;->combineLatest(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/core/Flowable;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onCompleteStub$1;->()V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onCompleteStub$1;->()V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onErrorStub$1;->()V @@ -18249,6 +18603,12 @@ HSPLio/reactivex/rxjava3/subjects/SerializedSubject;->onNext(Ljava/lang/Object;) HSPLio/reactivex/rxjava3/subjects/SerializedSubject;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/subjects/Subject;->()V HSPLio/reactivex/rxjava3/subjects/Subject;->toSerialized()Lio/reactivex/rxjava3/subjects/Subject; +HSPLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->(Lorg/reactivestreams/Subscriber;)V +HSPLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->(Lorg/reactivestreams/Subscriber;Z)V +HSPLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->emitLoop()V +HSPLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +HSPLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->request(J)V HSPLj$/com/android/tools/r8/a;->e(JJ)J HSPLj$/com/android/tools/r8/a;->f(Lsun/misc/Unsafe;Ljava/lang/Object;JLjava/lang/Object;)Z HSPLj$/com/android/tools/r8/a;->g(JJ)J @@ -18509,13 +18869,13 @@ HSPLj$/util/c;->()V HSPLj$/util/concurrent/ConcurrentHashMap;->()V HSPLj$/util/concurrent/ConcurrentHashMap;->()V HSPLj$/util/concurrent/ConcurrentHashMap;->(IFI)V +HSPLj$/util/concurrent/ConcurrentHashMap;->a(JI)V HSPLj$/util/concurrent/ConcurrentHashMap;->b([Lj$/util/concurrent/l;ILj$/util/concurrent/l;)Z HSPLj$/util/concurrent/ConcurrentHashMap;->c(Ljava/lang/Object;)Ljava/lang/Class; HSPLj$/util/concurrent/ConcurrentHashMap;->clear()V -HSPLj$/util/concurrent/ConcurrentHashMap;->e([Lj$/util/concurrent/l;Lj$/util/concurrent/l;)[Lj$/util/concurrent/l; HSPLj$/util/concurrent/ConcurrentHashMap;->entrySet()Ljava/util/Set; HSPLj$/util/concurrent/ConcurrentHashMap;->f()[Lj$/util/concurrent/l; -HSPLj$/util/concurrent/ConcurrentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +HSPLj$/util/concurrent/ConcurrentHashMap;->g(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->i([Lj$/util/concurrent/l;ILj$/util/concurrent/l;)V HSPLj$/util/concurrent/ConcurrentHashMap;->isEmpty()Z HSPLj$/util/concurrent/ConcurrentHashMap;->j(I)I @@ -18534,7 +18894,6 @@ HSPLj$/util/concurrent/b;->(Lj$/util/concurrent/ConcurrentHashMap;)V HSPLj$/util/concurrent/b;->toArray()[Ljava/lang/Object; HSPLj$/util/concurrent/e;->iterator()Ljava/util/Iterator; HSPLj$/util/concurrent/g;->([Lj$/util/concurrent/l;)V -HSPLj$/util/concurrent/g;->a(Ljava/lang/Object;I)Lj$/util/concurrent/l; HSPLj$/util/concurrent/h;->([Lj$/util/concurrent/l;IILj$/util/concurrent/ConcurrentHashMap;I)V HSPLj$/util/concurrent/h;->next()Ljava/lang/Object; HSPLj$/util/concurrent/i;->iterator()Ljava/util/Iterator; @@ -18543,7 +18902,6 @@ HSPLj$/util/concurrent/p;->([Lj$/util/concurrent/l;III)V HSPLj$/util/concurrent/p;->b()Lj$/util/concurrent/l; HSPLj$/util/concurrent/q;->()V HSPLj$/util/concurrent/q;->(Lj$/util/concurrent/r;)V -HSPLj$/util/concurrent/q;->a(Ljava/lang/Object;I)Lj$/util/concurrent/l; HSPLj$/util/concurrent/q;->c(Lj$/util/concurrent/r;Lj$/util/concurrent/r;)Lj$/util/concurrent/r; HSPLj$/util/concurrent/q;->e()V HSPLj$/util/concurrent/q;->f(ILjava/lang/Object;Ljava/lang/Object;)Lj$/util/concurrent/r; @@ -18553,7 +18911,6 @@ HSPLj$/util/concurrent/q;->j(Ljava/lang/Object;Ljava/lang/Object;)I HSPLj$/util/concurrent/r;->(ILjava/lang/Object;Ljava/lang/Object;Lj$/util/concurrent/r;Lj$/util/concurrent/r;)V HSPLj$/util/concurrent/r;->b(ILjava/lang/Object;Ljava/lang/Class;)Lj$/util/concurrent/r; HSPLj$/util/concurrent/v;->()V -HSPLj$/util/concurrent/v;->a(Lsun/misc/Unsafe;Ljava/lang/Object;J)I HSPLj$/util/concurrent/v;->b()Ljava/lang/reflect/Field; HSPLj$/util/concurrent/v;->c()Lsun/misc/Unsafe; HSPLj$/util/d;->(Ljava/util/Map;)V @@ -18704,6 +19061,7 @@ HSPLkotlin/SafePublicationLazyImpl;->getValue()Ljava/lang/Object; HSPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)V HSPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; +HSPLkotlin/SynchronizedLazyImpl;->isInitialized()Z HSPLkotlin/Triple;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V HSPLkotlin/Triple;->component1()Ljava/lang/Object; HSPLkotlin/Triple;->component2()Ljava/lang/Object; @@ -18727,11 +19085,15 @@ HSPLkotlin/UnsafeLazyImpl;->getValue()Ljava/lang/Object; HSPLkotlin/UnsignedKt;->ulongToDouble(J)D HSPLkotlin/collections/AbstractCollection$toString$1;->(Lkotlin/collections/AbstractCollection;)V HSPLkotlin/collections/AbstractCollection;->()V +HSPLkotlin/collections/AbstractCollection;->isEmpty()Z +HSPLkotlin/collections/AbstractCollection;->size()I HSPLkotlin/collections/AbstractCollection;->toString()Ljava/lang/String; HSPLkotlin/collections/AbstractList$Companion;->()V HSPLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V HSPLkotlin/collections/AbstractList$IteratorImpl;->(Lkotlin/collections/AbstractList;)V +HSPLkotlin/collections/AbstractList$IteratorImpl;->hasNext()Z +HSPLkotlin/collections/AbstractList$IteratorImpl;->next()Ljava/lang/Object; HSPLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->iterator()Ljava/util/Iterator; @@ -19147,6 +19509,7 @@ HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/corouti HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->releaseIntercepted()V HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V HSPLkotlin/coroutines/jvm/internal/Boxing;->boxBoolean(Z)Ljava/lang/Boolean; +HSPLkotlin/coroutines/jvm/internal/Boxing;->boxLong(J)Ljava/lang/Long; HSPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V HSPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;)V @@ -19277,7 +19640,6 @@ HSPLkotlin/ranges/IntProgression$Companion;->()V HSPLkotlin/ranges/IntProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/ranges/IntProgression$Companion;->fromClosedRange(III)Lkotlin/ranges/IntProgression; HSPLkotlin/ranges/IntProgression;->()V -HSPLkotlin/ranges/IntProgression;->(III)V HSPLkotlin/ranges/IntProgression;->getFirst()I HSPLkotlin/ranges/IntProgression;->getLast()I HSPLkotlin/ranges/IntProgression;->getStep()I @@ -20817,7 +21179,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind;->(Ljava HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind;->getNumber()I HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind;->values()[Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->(Z)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->getConstructor(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor; @@ -20893,7 +21254,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function$1;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function$1;->parsePartialFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function$1;->parsePartialFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->(Z)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getContextReceiverTypeCount()I @@ -20926,7 +21286,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->hasReturnTypeI HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->hasTypeTable()Z HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->initFields()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->isInitialized()Z -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->writeTo(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedOutputStream;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind$1;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind;->(Ljava/lang/String;III)V @@ -21113,7 +21472,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;->initField HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;->isInitialized()Z HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;->writeTo(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedOutputStream;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->(Z)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->getArgument(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument; @@ -21438,6 +21796,7 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolve HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->([Ljava/lang/String;Ljava/util/Set;Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->getQualifiedClassName(I)Ljava/lang/String; +HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->getString(I)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->isLocalClassName(I)Z HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverKt;->toExpandedRecordsList(Ljava/util/List;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V @@ -21608,7 +21967,6 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readEnum()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readFloat()F HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readInt32()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readMessage(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite$Builder;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V -HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readMessage(Lkotlin/reflect/jvm/internal/impl/protobuf/Parser;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite; HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawByte()B HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawLittleEndian32()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawLittleEndian64()J @@ -22268,7 +22626,9 @@ HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeseria HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->getReceiverParameterAnnotations(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotatedCallableKind;)Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->initializeWithCoroutinesExperimentalityStatus(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedSimpleFunctionDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;Ljava/util/Map;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadConstructor(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;Z)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor; +HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadFunction(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;)Lkotlin/reflect/jvm/internal/impl/descriptors/SimpleFunctionDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadOldFlags(I)I +HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadProperty(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;)Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->valueParameters(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotatedCallableKind;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt;->getClassId(Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;I)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt;->getName(Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;I)Lkotlin/reflect/jvm/internal/impl/name/Name; @@ -22306,6 +22666,7 @@ HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeseriali HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->computeLocalClassifierReplacementType(I)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->getOwnTypeParameters()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->simpleType$collectAllArguments(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;)Ljava/util/List; +HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->simpleType(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;Z)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->toAttributes(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->type(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;)Lkotlin/reflect/jvm/internal/impl/types/KotlinType; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;->typeArgument(Lkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;)Lkotlin/reflect/jvm/internal/impl/types/TypeProjection; @@ -22937,6 +23298,7 @@ HSPLkotlin/text/CharsKt__CharJVMKt;->isWhitespace(C)Z HSPLkotlin/text/Charsets;->()V HSPLkotlin/text/Charsets;->()V HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->(Lkotlin/text/DelimitedRangesSequence;)V +HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->calcNext()V HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->hasNext()Z HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Ljava/lang/Object; HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Lkotlin/ranges/IntRange; @@ -23002,6 +23364,7 @@ HSPLkotlin/text/StringsKt__IndentKt$getIndentFunction$1;->invoke(Ljava/lang/Obje HSPLkotlin/text/StringsKt__IndentKt$getIndentFunction$1;->invoke(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__IndentKt;->getIndentFunction$StringsKt__IndentKt(Ljava/lang/String;)Lkotlin/jvm/functions/Function1; HSPLkotlin/text/StringsKt__IndentKt;->indentWidth$StringsKt__IndentKt(Ljava/lang/String;)I +HSPLkotlin/text/StringsKt__IndentKt;->replaceIndent(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__IndentKt;->trimIndent(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;)Ljava/lang/Long; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;I)Ljava/lang/Long; @@ -23017,7 +23380,7 @@ HSPLkotlin/text/StringsKt__StringsJVMKt;->startsWith$default(Ljava/lang/String;L HSPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;IZ)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;Z)Z HSPLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;->(Ljava/util/List;Z)V -HSPLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;->invoke(Ljava/lang/CharSequence;I)Lkotlin/Pair; HSPLkotlin/text/StringsKt__StringsKt$splitToSequence$1;->(Ljava/lang/CharSequence;)V HSPLkotlin/text/StringsKt__StringsKt$splitToSequence$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/text/StringsKt__StringsKt$splitToSequence$1;->invoke(Lkotlin/ranges/IntRange;)Ljava/lang/String; @@ -23028,7 +23391,6 @@ HSPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;CZ)Z HSPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z HSPLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->endsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z -HSPLkotlin/text/StringsKt__StringsKt;->findAnyOf$StringsKt__StringsKt(Ljava/lang/CharSequence;Ljava/util/Collection;IZZ)Lkotlin/Pair; HSPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I @@ -24081,10 +24443,10 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->attachCancellationSignal(L HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->bindArguments(Lnet/zetetic/database/sqlcipher/SQLiteConnection$PreparedStatement;[Ljava/lang/Object;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->canonicalizeSyncMode(Ljava/lang/String;)Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->detachCancellationSignal(Landroid/os/CancellationSignal;)V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)I HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String; +HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->finalizePreparedStatement(Lnet/zetetic/database/sqlcipher/SQLiteConnection$PreparedStatement;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->hasCodec()Z HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->isCacheable(I)Z HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->isPreparedStatementInCache(Ljava/lang/String;)Z @@ -24114,7 +24476,6 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->closeExcessConnectionsAndLogExceptionsLocked()V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->finishAcquireConnectionLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnection;I)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->getPriority(I)I HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->markAcquiredConnectionsLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$AcquiredConnectionStatus;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->obtainConnectionWaiterLocked(Ljava/lang/Thread;JIZLjava/lang/String;I)Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$ConnectionWaiter; @@ -24127,16 +24488,14 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->recycleConnectionLocke HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->recycleConnectionWaiterLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$ConnectionWaiter;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->throwIfClosedLocked()V +HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->wakeConnectionWaitersLocked()V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;J)Landroid/database/CursorWindow; HSPLnet/zetetic/database/sqlcipher/SQLiteCursor$$ExternalSyntheticApiModelOutline1;->m()V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->()V -HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->(Lnet/zetetic/database/sqlcipher/SQLiteCursorDriver;Ljava/lang/String;Lnet/zetetic/database/sqlcipher/SQLiteQuery;)V -HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->awc_clearOrCreateWindow(Ljava/lang/String;)V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->close()V -HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->fillWindow(I)V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->finalize()V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->getColumnIndex(Ljava/lang/String;)I HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->getColumnNames()[Ljava/lang/String; @@ -24165,9 +24524,9 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getPath()Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getVersion()I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->hasCodec()Z +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->inTransaction()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insert(Ljava/lang/String;ILandroid/content/ContentValues;)J HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J -HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isMainThread()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isOpen()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isReadOnly()Z @@ -24176,7 +24535,6 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->open()V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->openDatabase(Ljava/lang/String;[BLnet/zetetic/database/sqlcipher/SQLiteDatabase$CursorFactory;ILnet/zetetic/database/DatabaseErrorHandler;Lnet/zetetic/database/sqlcipher/SQLiteDatabaseHook;)Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->openInner()V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; -HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/Object;)Landroid/database/Cursor; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->queryWithFactory(Lnet/zetetic/database/sqlcipher/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; @@ -24223,7 +24581,9 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->clearBindings()V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getBindArgs()[Ljava/lang/Object; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getColumnNames()[Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; +HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSession()Lnet/zetetic/database/sqlcipher/SQLiteSession; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSql()Ljava/lang/String; +HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->onAllReferencesReleased()V HSPLnet/zetetic/database/sqlcipher/SQLiteQuery;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/lang/String;Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteQueryBuilder;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteQueryBuilder;->appendClause(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V @@ -24234,6 +24594,7 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteSession$Transaction;->(Lnet/zetet HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->beginTransaction(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V +HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->beginTransactionUnchecked(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->endTransaction(Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->endTransactionUnchecked(Landroid/os/CancellationSignal;Z)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)I @@ -24243,6 +24604,7 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->executeSpecial(Ljava/lang/Str HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->hasTransaction()Z HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->obtainTransaction(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;)Lnet/zetetic/database/sqlcipher/SQLiteSession$Transaction; HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->recycleTransaction(Lnet/zetetic/database/sqlcipher/SQLiteSession$Transaction;)V +HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->releaseConnection()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->setTransactionSuccessful()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->throwIfNoTransaction()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->throwIfTransactionMarkedSuccessful()V @@ -24339,6 +24701,11 @@ HSPLokhttp3/CookieJar$Companion$NoCookies;->loadForRequest(Lokhttp3/HttpUrl;)Lja HSPLokhttp3/CookieJar$Companion;->()V HSPLokhttp3/CookieJar$Companion;->()V HSPLokhttp3/CookieJar;->()V +HSPLokhttp3/Credentials;->()V +HSPLokhttp3/Credentials;->()V +HSPLokhttp3/Credentials;->basic$default(Ljava/lang/String;Ljava/lang/String;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/lang/String; +HSPLokhttp3/Credentials;->basic(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +HSPLokhttp3/Credentials;->basic(Ljava/lang/String;Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String; HSPLokhttp3/Dispatcher;->()V HSPLokhttp3/Dispatcher;->enqueue$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V HSPLokhttp3/Dispatcher;->executed$okhttp(Lokhttp3/internal/connection/RealCall;)V @@ -24455,8 +24822,6 @@ HSPLokhttp3/HttpUrl$Companion;->percentDecode$okhttp(Ljava/lang/String;IIZ)Ljava HSPLokhttp3/HttpUrl$Companion;->toPathString$okhttp(Ljava/util/List;Ljava/lang/StringBuilder;)V HSPLokhttp3/HttpUrl$Companion;->toQueryNamesAndValues$okhttp(Ljava/lang/String;)Ljava/util/List; HSPLokhttp3/HttpUrl$Companion;->toQueryString$okhttp(Ljava/util/List;Ljava/lang/StringBuilder;)V -HSPLokhttp3/HttpUrl$Companion;->writeCanonicalized(Lokio/Buffer;Ljava/lang/String;IILjava/lang/String;ZZZZLjava/nio/charset/Charset;)V -HSPLokhttp3/HttpUrl$Companion;->writePercentDecoded(Lokio/Buffer;Ljava/lang/String;IIZ)V HSPLokhttp3/HttpUrl;->()V HSPLokhttp3/HttpUrl;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)V HSPLokhttp3/HttpUrl;->encodedFragment()Ljava/lang/String; @@ -24540,7 +24905,6 @@ HSPLokhttp3/OkHttpClient$Companion;->(Lkotlin/jvm/internal/DefaultConstruc HSPLokhttp3/OkHttpClient$Companion;->getDEFAULT_CONNECTION_SPECS$okhttp()Ljava/util/List; HSPLokhttp3/OkHttpClient$Companion;->getDEFAULT_PROTOCOLS$okhttp()Ljava/util/List; HSPLokhttp3/OkHttpClient;->()V -HSPLokhttp3/OkHttpClient;->(Lokhttp3/OkHttpClient$Builder;)V HSPLokhttp3/OkHttpClient;->access$getDEFAULT_CONNECTION_SPECS$cp()Ljava/util/List; HSPLokhttp3/OkHttpClient;->access$getDEFAULT_PROTOCOLS$cp()Ljava/util/List; HSPLokhttp3/OkHttpClient;->access$getSslSocketFactoryOrNull$p(Lokhttp3/OkHttpClient;)Ljavax/net/ssl/SSLSocketFactory; @@ -25096,7 +25460,6 @@ HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->(Lokhttp3/internal/ HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->close()V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->getClosed$okhttp()Z HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->getFinished$okhttp()Z -HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->read(Lokio/Buffer;J)J HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->receive$okhttp(Lokio/BufferedSource;J)V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->setFinished$okhttp(Z)V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->setTrailers(Lokhttp3/Headers;)V @@ -25308,7 +25671,6 @@ HSPLokio/AsyncTimeout$Companion;->awaitTimeout$okio()Lokio/AsyncTimeout; HSPLokio/AsyncTimeout$Companion;->cancelScheduledTimeout(Lokio/AsyncTimeout;)Z HSPLokio/AsyncTimeout$Companion;->getCondition()Ljava/util/concurrent/locks/Condition; HSPLokio/AsyncTimeout$Companion;->getLock()Ljava/util/concurrent/locks/ReentrantLock; -HSPLokio/AsyncTimeout$Companion;->scheduleTimeout(Lokio/AsyncTimeout;JZ)V HSPLokio/AsyncTimeout$Watchdog;->()V HSPLokio/AsyncTimeout$Watchdog;->run()V HSPLokio/AsyncTimeout$sink$1;->(Lokio/AsyncTimeout;Lokio/Sink;)V @@ -25344,6 +25706,7 @@ HSPLokio/Buffer$UnsafeCursor;->()V HSPLokio/Buffer;->()V HSPLokio/Buffer;->clear()V HSPLokio/Buffer;->close()V +HSPLokio/Buffer;->completeSegmentByteCount()J HSPLokio/Buffer;->copyTo(Lokio/Buffer;JJ)Lokio/Buffer; HSPLokio/Buffer;->exhausted()Z HSPLokio/Buffer;->getByte(J)B @@ -25359,13 +25722,12 @@ HSPLokio/Buffer;->readFully([B)V HSPLokio/Buffer;->readInt()I HSPLokio/Buffer;->readIntLe()I HSPLokio/Buffer;->readShort()S +HSPLokio/Buffer;->readString(JLjava/nio/charset/Charset;)Ljava/lang/String; HSPLokio/Buffer;->readString(Ljava/nio/charset/Charset;)Ljava/lang/String; -HSPLokio/Buffer;->readUtf8()Ljava/lang/String; HSPLokio/Buffer;->readUtf8(J)Ljava/lang/String; HSPLokio/Buffer;->setSize$okio(J)V HSPLokio/Buffer;->size()J HSPLokio/Buffer;->skip(J)V -HSPLokio/Buffer;->writableSegment$okio(I)Lokio/Segment; HSPLokio/Buffer;->write(Lokio/Buffer;J)V HSPLokio/Buffer;->write(Lokio/ByteString;)Lokio/Buffer; HSPLokio/Buffer;->write([B)Lokio/Buffer; @@ -25377,13 +25739,12 @@ HSPLokio/Buffer;->writeInt(I)Lokio/Buffer; HSPLokio/Buffer;->writeShort(I)Lokio/Buffer; HSPLokio/Buffer;->writeString(Ljava/lang/String;IILjava/nio/charset/Charset;)Lokio/Buffer; HSPLokio/Buffer;->writeString(Ljava/lang/String;Ljava/nio/charset/Charset;)Lokio/Buffer; -HSPLokio/Buffer;->writeUtf8(Ljava/lang/String;)Lokio/Buffer; HSPLokio/Buffer;->writeUtf8(Ljava/lang/String;II)Lokio/Buffer; HSPLokio/Buffer;->writeUtf8(Ljava/lang/String;II)Lokio/BufferedSink; -HSPLokio/Buffer;->writeUtf8CodePoint(I)Lokio/Buffer; HSPLokio/ByteString$Companion;->()V HSPLokio/ByteString$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokio/ByteString$Companion;->decodeHex(Ljava/lang/String;)Lokio/ByteString; +HSPLokio/ByteString$Companion;->encodeString(Ljava/lang/String;Ljava/nio/charset/Charset;)Lokio/ByteString; HSPLokio/ByteString$Companion;->encodeUtf8(Ljava/lang/String;)Lokio/ByteString; HSPLokio/ByteString$Companion;->of$default(Lokio/ByteString$Companion;[BIIILjava/lang/Object;)Lokio/ByteString; HSPLokio/ByteString$Companion;->of([B)Lokio/ByteString; @@ -25473,7 +25834,6 @@ HSPLokio/Options;->of([Lokio/ByteString;)Lokio/Options; HSPLokio/OutputStreamSink;->(Ljava/io/OutputStream;Lokio/Timeout;)V HSPLokio/OutputStreamSink;->close()V HSPLokio/OutputStreamSink;->flush()V -HSPLokio/OutputStreamSink;->write(Lokio/Buffer;J)V HSPLokio/PeekSource;->(Lokio/BufferedSource;)V HSPLokio/PeekSource;->read(Lokio/Buffer;J)J HSPLokio/RealBufferedSink;->(Lokio/Sink;)V @@ -25505,6 +25865,7 @@ HSPLokio/RealBufferedSource;->readInt()I HSPLokio/RealBufferedSource;->readIntLe()I HSPLokio/RealBufferedSource;->readShort()S HSPLokio/RealBufferedSource;->readString(Ljava/nio/charset/Charset;)Ljava/lang/String; +HSPLokio/RealBufferedSource;->request(J)Z HSPLokio/RealBufferedSource;->require(J)V HSPLokio/RealBufferedSource;->select(Lokio/Options;)I HSPLokio/RealBufferedSource;->skip(J)V @@ -25539,6 +25900,7 @@ HSPLokio/Utf8;->size(Ljava/lang/String;II)J HSPLokio/_JvmPlatformKt;->asUtf8ToByteArray(Ljava/lang/String;)[B HSPLokio/_JvmPlatformKt;->toUtf8String([B)Ljava/lang/String; HSPLokio/internal/-Buffer;->()V +HSPLokio/internal/-Buffer;->selectPrefix(Lokio/Buffer;Lokio/Options;Z)I HSPLokio/internal/-ByteString;->()V HSPLokio/internal/-ByteString;->access$decodeHexDigit(C)I HSPLokio/internal/-ByteString;->commonWrite(Lokio/ByteString;Lokio/Buffer;II)V @@ -25691,7 +26053,6 @@ HSPLorg/conscrypt/ConscryptEngine;->singleDstBuffer(Ljava/nio/ByteBuffer;)[Ljava HSPLorg/conscrypt/ConscryptEngine;->singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer; HSPLorg/conscrypt/ConscryptEngine;->transitionTo(I)V HSPLorg/conscrypt/ConscryptEngine;->unwrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult; -HSPLorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;II[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult; HSPLorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult; HSPLorg/conscrypt/ConscryptEngine;->verifyCertificateChain([[BLjava/lang/String;)V HSPLorg/conscrypt/ConscryptEngine;->wrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult; @@ -25988,6 +26349,7 @@ HSPLorg/conscrypt/OpenSSLX509CertPath;->getCertificates()Ljava/util/List; HSPLorg/conscrypt/OpenSSLX509Certificate;->(J)V HSPLorg/conscrypt/OpenSSLX509Certificate;->alternativeNameArrayToList([[Ljava/lang/Object;)Ljava/util/Collection; HSPLorg/conscrypt/OpenSSLX509Certificate;->checkValidity(Ljava/util/Date;)V +HSPLorg/conscrypt/OpenSSLX509Certificate;->equals(Ljava/lang/Object;)Z HSPLorg/conscrypt/OpenSSLX509Certificate;->finalize()V HSPLorg/conscrypt/OpenSSLX509Certificate;->fromX509DerInputStream(Ljava/io/InputStream;)Lorg/conscrypt/OpenSSLX509Certificate; HSPLorg/conscrypt/OpenSSLX509Certificate;->getCriticalExtensionOIDs()Ljava/util/Set; @@ -26255,8 +26617,8 @@ HSPLorg/signal/core/util/CursorUtil;->getString(Landroid/database/Cursor;Ljava/l HSPLorg/signal/core/util/CursorUtil;->isNull(Landroid/database/Cursor;Ljava/lang/String;)Z HSPLorg/signal/core/util/CursorUtil;->requireBlob(Landroid/database/Cursor;Ljava/lang/String;)[B HSPLorg/signal/core/util/CursorUtil;->requireBoolean(Landroid/database/Cursor;Ljava/lang/String;)Z -HSPLorg/signal/core/util/CursorUtil;->requireInt(Landroid/database/Cursor;Ljava/lang/String;)I HSPLorg/signal/core/util/CursorUtil;->requireLong(Landroid/database/Cursor;Ljava/lang/String;)J +HSPLorg/signal/core/util/CursorUtil;->requireString(Landroid/database/Cursor;Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/DeleteBuilderPart1;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V HSPLorg/signal/core/util/DeleteBuilderPart1;->where(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/DeleteBuilderPart2; HSPLorg/signal/core/util/DeleteBuilderPart2;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V @@ -26281,6 +26643,7 @@ HSPLorg/signal/core/util/ExistsBuilderPart1;->(Landroidx/sqlite/db/Support HSPLorg/signal/core/util/ExistsBuilderPart1;->where(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/ExistsBuilderPart2; HSPLorg/signal/core/util/ExistsBuilderPart1;->where(Ljava/lang/String;[Ljava/lang/String;)Lorg/signal/core/util/ExistsBuilderPart2; HSPLorg/signal/core/util/ExistsBuilderPart2;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V +HSPLorg/signal/core/util/ExistsBuilderPart2;->run()Z HSPLorg/signal/core/util/Hex;->()V HSPLorg/signal/core/util/Hex;->appendHexChar(Ljava/lang/StringBuffer;I)V HSPLorg/signal/core/util/Hex;->fromStringCondensed(Ljava/lang/String;)[B @@ -26314,6 +26677,7 @@ HSPLorg/signal/core/util/ResettableLazy;->getValue(Ljava/lang/Object;Lkotlin/ref HSPLorg/signal/core/util/ResettableLazy;->isInitialized()Z HSPLorg/signal/core/util/ResettableLazy;->reset()V HSPLorg/signal/core/util/ResettableLazyKt;->resettableLazy(Lkotlin/jvm/functions/Function0;)Lorg/signal/core/util/ResettableLazy; +HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->()V HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->count(Landroidx/sqlite/db/SupportSQLiteDatabase;)Lorg/signal/core/util/SelectBuilderPart1; HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->delete(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Lorg/signal/core/util/DeleteBuilderPart1; HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->deleteAll(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)I @@ -26332,6 +26696,7 @@ HSPLorg/signal/core/util/SelectBuilderPart2;->where(Ljava/lang/String;[Ljava/lan HSPLorg/signal/core/util/SelectBuilderPart3;->(Landroidx/sqlite/db/SupportSQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V HSPLorg/signal/core/util/SelectBuilderPart3;->limit(I)Lorg/signal/core/util/SelectBuilderPart4b; HSPLorg/signal/core/util/SelectBuilderPart3;->orderBy(Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart4a; +HSPLorg/signal/core/util/SelectBuilderPart3;->run()Landroid/database/Cursor; HSPLorg/signal/core/util/SelectBuilderPart4a;->(Landroidx/sqlite/db/SupportSQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/SelectBuilderPart4a;->limit(I)Lorg/signal/core/util/SelectBuilderPart5; HSPLorg/signal/core/util/SelectBuilderPart4a;->run()Landroid/database/Cursor; @@ -26357,7 +26722,6 @@ HSPLorg/signal/core/util/SqlUtil;->buildCollectionQuery$default(Ljava/lang/Strin HSPLorg/signal/core/util/SqlUtil;->buildCollectionQuery(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;ILorg/signal/core/util/SqlUtil$CollectionOperator;)Ljava/util/List; HSPLorg/signal/core/util/SqlUtil;->buildQuery(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; HSPLorg/signal/core/util/SqlUtil;->buildTrueUpdateQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/content/ContentValues;)Lorg/signal/core/util/SqlUtil$Query; -HSPLorg/signal/core/util/SqlUtil;->tableExists(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Z HSPLorg/signal/core/util/Stopwatch$Split;->(JJLjava/lang/String;)V HSPLorg/signal/core/util/Stopwatch$Split;->displayString(I)Ljava/lang/String; HSPLorg/signal/core/util/Stopwatch$Split;->getNanoTime()J @@ -26378,8 +26742,6 @@ HSPLorg/signal/core/util/StreamUtil;->copy(Ljava/io/InputStream;Ljava/io/OutputS HSPLorg/signal/core/util/StringExtensionsKt;->isNotNullOrBlank(Ljava/lang/CharSequence;)Z HSPLorg/signal/core/util/StringExtensionsKt;->nullIfBlank(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringExtensionsKt;->toSingleLine(Ljava/lang/String;)Ljava/lang/String; -HSPLorg/signal/core/util/StringUtil$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List; -HSPLorg/signal/core/util/StringUtil$$ExternalSyntheticBackport1;->m([Ljava/lang/Object;)Ljava/util/List; HSPLorg/signal/core/util/StringUtil;->()V HSPLorg/signal/core/util/StringUtil;->isEmpty(Ljava/lang/String;)Z HSPLorg/signal/core/util/StringUtil;->isolateBidi(Ljava/lang/String;)Ljava/lang/String; @@ -26450,6 +26812,7 @@ HSPLorg/signal/core/util/concurrent/SettableFuture;->get(JLjava/util/concurrent/ HSPLorg/signal/core/util/concurrent/SettableFuture;->notifyAllListeners()V HSPLorg/signal/core/util/concurrent/SettableFuture;->setException(Ljava/lang/Throwable;)Z HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->()V +HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1;->(Ljava/lang/String;I)V HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; HSPLorg/signal/core/util/concurrent/SignalExecutors$1;->(Ljava/lang/Runnable;Ljava/lang/String;I)V @@ -26463,8 +26826,10 @@ HSPLorg/signal/core/util/concurrent/SignalExecutors$NumberedThreadFactory;->-$$N HSPLorg/signal/core/util/concurrent/SignalExecutors$NumberedThreadFactory;->(Ljava/lang/String;I)V HSPLorg/signal/core/util/concurrent/SignalExecutors$NumberedThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; HSPLorg/signal/core/util/concurrent/SignalExecutors;->$r8$lambda$CjE2RMTJtH6cknGNaFsN0_4i2U4(Ljava/lang/String;ILjava/lang/Runnable;)Ljava/lang/Thread; +HSPLorg/signal/core/util/concurrent/SignalExecutors;->$r8$lambda$PuKeoHyTOgRHxCNNBi9u3dUls_w(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLorg/signal/core/util/concurrent/SignalExecutors;->()V HSPLorg/signal/core/util/concurrent/SignalExecutors;->getAndStartHandlerThread(Ljava/lang/String;I)Landroid/os/HandlerThread; +HSPLorg/signal/core/util/concurrent/SignalExecutors;->lambda$newCachedBoundedExecutor$1(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLorg/signal/core/util/concurrent/SignalExecutors;->lambda$newCachedSingleThreadExecutor$0(Ljava/lang/String;ILjava/lang/Runnable;)Ljava/lang/Thread; HSPLorg/signal/core/util/concurrent/SignalExecutors;->newCachedBoundedExecutor(Ljava/lang/String;IIII)Ljava/util/concurrent/ExecutorService; HSPLorg/signal/core/util/concurrent/SignalExecutors;->newCachedSingleThreadExecutor(Ljava/lang/String;I)Ljava/util/concurrent/ExecutorService; @@ -26562,6 +26927,7 @@ HSPLorg/signal/core/util/logging/Scrubber;->access$getTOP_100_TLDS$p()Ljava/util HSPLorg/signal/core/util/logging/Scrubber;->access$hash(Lorg/signal/core/util/logging/Scrubber;Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Scrubber;->hash(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Scrubber;->scrub(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLorg/signal/core/util/logging/Scrubber;->scrub(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Lkotlin/jvm/functions/Function2;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubCallLinkKeys(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubDomains(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubE164(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; @@ -26600,13 +26966,18 @@ HSPLorg/signal/core/util/tracing/Tracer$$ExternalSyntheticLambda0;->getTimeNanos HSPLorg/signal/core/util/tracing/Tracer;->()V HSPLorg/signal/core/util/tracing/Tracer;->()V HSPLorg/signal/core/util/tracing/Tracer;->addPacket(Lorg/signal/core/util/tracing/TracePacket;)V +HSPLorg/signal/core/util/tracing/Tracer;->debugAnnotation(Ljava/lang/String;Ljava/lang/String;)Lorg/signal/core/util/tracing/DebugAnnotation; +HSPLorg/signal/core/util/tracing/Tracer;->end(Ljava/lang/String;J)V +HSPLorg/signal/core/util/tracing/Tracer;->forMethodStart(Ljava/lang/String;JJLjava/util/Map;)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->forSynchronization(J)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->forTrack(JLjava/lang/String;)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->forTrackId(J)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->getInstance()Lorg/signal/core/util/tracing/Tracer; HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;)V HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V +HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;JLjava/util/Map;)V HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V +HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;Ljava/util/Map;)V HSPLorg/signal/core/util/tracing/Tracer;->toByteArray(Ljava/util/UUID;)[B HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->()V HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->build()Lorg/signal/core/util/tracing/TrackDescriptor; @@ -26618,7 +26989,6 @@ HSPLorg/signal/core/util/tracing/TrackDescriptor$Companion;->(Lkotlin/jvm/ HSPLorg/signal/core/util/tracing/TrackDescriptor;->()V HSPLorg/signal/core/util/tracing/TrackDescriptor;->(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Lorg/signal/core/util/tracing/ThreadDescriptor;Lorg/signal/core/util/tracing/CounterDescriptor;Lokio/ByteString;)V HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->()V -HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->build()Lorg/signal/core/util/tracing/TrackEvent; HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->debug_annotations(Ljava/util/List;)Lorg/signal/core/util/tracing/TrackEvent$Builder; HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->name(Ljava/lang/String;)Lorg/signal/core/util/tracing/TrackEvent$Builder; HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->track_uuid(Ljava/lang/Long;)Lorg/signal/core/util/tracing/TrackEvent$Builder; @@ -27057,28 +27427,30 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->< HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda61;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda61;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda62;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda62;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda62;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda63;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda63;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda64;->()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda64;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda64;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda65;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda65;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda66;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda66;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda67;->()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda68;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda69;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda68;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda69;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda6;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda70;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda70;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda71;->()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda71;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda70;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda71;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda71;->run()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda72;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda72;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda7;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda7;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V @@ -27293,6 +27665,7 @@ HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->getUri()Landroid HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->()V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->forPointer$default(Lorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;Lj$/util/Optional;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Ljava/lang/String;IILjava/lang/Object;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->forPointer(Lj$/util/Optional;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Ljava/lang/String;I)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->forPointers(Lj$/util/Optional;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->()V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->(Ljava/lang/String;IJLjava/lang/String;Lorg/thoughtcrime/securesms/attachments/Cdn;Ljava/lang/String;Ljava/lang/String;[B[B[BILjava/lang/String;ZZZIIJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Ljava/util/UUID;)V @@ -27471,8 +27844,9 @@ HSPLorg/thoughtcrime/securesms/banner/banners/DozeBannerKt$Banner$3$1;->(L HSPLorg/thoughtcrime/securesms/banner/banners/DozeBannerKt$Banner$4;->(Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;II)V HSPLorg/thoughtcrime/securesms/banner/banners/DozeBannerKt;->Banner(Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HSPLorg/thoughtcrime/securesms/banner/banners/DozeBannerKt;->access$Banner(Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V +HSPLorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner$dataFlow$2;->(Lorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner;)V HSPLorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner;->()V -HSPLorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner;->()V +HSPLorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner;->(Lorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner$RestoreProgressBannerListener;)V HSPLorg/thoughtcrime/securesms/banner/banners/OutdatedBuildBanner$Companion;->()V HSPLorg/thoughtcrime/securesms/banner/banners/OutdatedBuildBanner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/banner/banners/OutdatedBuildBanner;->()V @@ -27574,11 +27948,7 @@ HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->setTint(I)V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->updateContentDescription()V HSPLorg/thoughtcrime/securesms/components/ExpirationTimerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/FromTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;)V -HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V -HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)V -HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZ)V +HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZZ)V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/Material3SearchToolbar;)V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/Material3SearchToolbar;)V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar$special$$inlined$addTextChangedListener$default$1;->(Landroid/view/View;Lorg/thoughtcrime/securesms/components/Material3SearchToolbar;)V @@ -27604,6 +27974,7 @@ HSPLorg/thoughtcrime/securesms/components/QuoteView;->isStoryReply()Z HSPLorg/thoughtcrime/securesms/components/QuoteView;->setMessageType(Lorg/thoughtcrime/securesms/components/QuoteView$MessageType;)V HSPLorg/thoughtcrime/securesms/components/RatingManager;->()V HSPLorg/thoughtcrime/securesms/components/RatingManager;->showRatingDialogIfNecessary(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport2;->m([Ljava/lang/Object;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->initialize(Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->setDotTint(I)V @@ -27663,6 +28034,7 @@ HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->ellipsizeEmojiTe HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->hasMetricAffectingSpan(Ljava/lang/CharSequence;)Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isEllipsizedAtEnd()Z +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isSingleLine()Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$ellipsizeEmojiTextForMaxLines$2()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$ellipsizeEmojiTextForMaxLines$3(Ljava/lang/Runnable;Landroid/view/View;)Lkotlin/Unit; HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->onDraw(Landroid/graphics/Canvas;)V @@ -27750,6 +28122,25 @@ HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButt HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton;->pulse(J)V HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton;->startPulse(J)V HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton;->stopPulse()V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType$Companion;->deserialize(I)Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType; +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;->$values()[Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType; +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;->(Ljava/lang/String;II)V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;->getEntries()Lkotlin/enums/EnumEntries; +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;->getValue()I +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->(JLjava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/Set;ZZZZZLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;I)V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->(JLjava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/Set;ZZZZZLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->copy$default(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;JLjava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/Set;ZZZZZLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;IILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord; +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->copy(JLjava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/Set;ZZZZZLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType;I)Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord; +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->equals(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->getFolderType()Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType; +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;->getId()J +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository;->getCurrentFolders(Z)Ljava/util/List; HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository$getProfiles$1;->(Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;)V HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository$getProfiles$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository$getProfiles$1;->apply(Lkotlin/Unit;)Ljava/util/List; @@ -27920,12 +28311,15 @@ HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$1;->(Lo HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$2;->(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$3;->(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$4;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$5;->(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda0;->(Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnClickedCallback;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnLongClickedCallback;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda1;->(ZLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnClickedCallback;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Z)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda2;->()V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda3;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnClickedCallback;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion;->()V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion;->registerChatTypeItems(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnClickedCallback;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion;->registerExpands(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion;->registerHeaders(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion;->registerKnownRecipientItems(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnClickedCallback;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$OnLongClickedCallback;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;)V @@ -28173,6 +28567,11 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter;->(Lorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter$Callbacks;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel;->(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Z)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z @@ -28189,7 +28588,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->values()[Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->(Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$OnConversationClickListener;Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->(Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$OnConversationClickListener;Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$EmptyFolderViewHolder$OnFolderSettingsClickListener;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->getItem(I)Lorg/thoughtcrime/securesms/conversationlist/model/Conversation; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->getItemViewType(I)I HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->notifyTimestampPayloadUpdate()V @@ -28201,7 +28600,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->setSel HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListArchiveItemDecoration;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListArchiveItemDecoration;->(Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListArchiveItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Z)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Z)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->getCursor(JJ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->getHeaderOffset()I HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->getKey(Ljava/lang/Object;)Ljava/lang/Object; @@ -28209,76 +28608,80 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$Unarc HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->hasPinnedHeader()Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource;->hasUnpinnedHeader()Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Z)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->create(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;ZZ)Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Z)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->create(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;ZZ)Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->getKey(Lorg/thoughtcrime/securesms/conversationlist/model/Conversation;)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->load(IIILorg/signal/paging/PagedDataSource$CancellationSignal;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource;->size()I HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda14;->create(Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;)Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lcom/google/android/material/appbar/CollapsingToolbarLayout;I)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda15;->newState(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/FilterPullState;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterSource;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda17;->onOffsetChanged(Lcom/google/android/material/appbar/AppBarLayout;I)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda16;->create(Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;)Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lcom/google/android/material/appbar/CollapsingToolbarLayout;I)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda17;->newState(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/FilterPullState;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterSource;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda19;->onOffsetChanged(Lcom/google/android/material/appbar/AppBarLayout;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda20;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda20;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda21;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda22;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda23;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda37;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;ILjava/util/List;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda37;->run()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda38;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda38;->onChanged(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda39;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;ILjava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda39;->run()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda42;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda43;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/Set;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda45;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda46;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda47;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda48;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda40;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda40;->onChanged(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda44;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda45;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda47;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda48;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda49;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda4;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda51;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda50;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda51;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda53;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda55;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda57;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda61;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda64;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda6;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda71;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda78;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda78;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda74;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda7;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda81;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda81;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda8;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$10;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Z)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1;->$r8$lambda$Y8JIyAbcQPA7qwtQh9qNmu7nmjo(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4;->onItemRangeInserted(II)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1;->$r8$lambda$Y8JIyAbcQPA7qwtQh9qNmu7nmjo(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5;->onForeground()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$9;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5;->onItemRangeInserted(II)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$6;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$6;->onForeground()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ArchiveListenerCallback;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;II)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ContactSearchClickCallbacks;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ContactSearchClickCallbacks;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ContactSearchClickCallbacks-IA;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$BT005Zy9c3YGjY9-gIiJli9XBQo(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration$Builder;)Lkotlin/Unit; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$E2kQol4XezoS9z_wSx7q3Qsji9M(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;)Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$KPzBA-7CvAirzeY08ZpxNtNW7Qk(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lcom/google/android/material/appbar/AppBarLayout;I)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$MSB-TB9sARSMlNkTriXsqXhQrzA(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$NTWiRmHMeoz7xrMcVr1nMem4vIc(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$O3EqPlBcOC1O0tswXr4bEQu4PnM(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$SH4kWaKbmAoY2aQQCW_tUIy87vg(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lj$/util/Optional;)V @@ -28318,6 +28721,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambd HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->mapSearchStateToConfiguration(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchState;)Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->maybeScheduleRefreshProfileJob()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onAttach(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onChatFoldersChanged(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onConversationListChanged(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCreate(Landroid/os/Bundle;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V @@ -28335,12 +28739,12 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updat HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateMultiSelectState()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateSearchToolbarHint(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda2;->onChanged(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda1;->run()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda3;->onChanged(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->run()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$Ao_h4FypxhvytTG1WGaBgdSX7eg(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Landroid/text/SpannableString;)V @@ -28350,7 +28754,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambd HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bindThread(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/lang/String;Z)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bindThread(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/lang/String;ZZ)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->createFinalBodyWithMediaIcon(Landroid/content/Context;Ljava/lang/CharSequence;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->getThreadDisplayBody(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->lambda$bindThread$1(Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V @@ -28388,10 +28792,10 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$$Exter HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$1;->apply(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$1;->apply(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lkotlin/Pair; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$2;->apply(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$2;->apply(Lkotlin/Pair;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$3;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$3;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -28399,25 +28803,30 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$3;->in HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$4;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$4;->accept(Lkotlin/Unit;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->invoke(Ljava/lang/Integer;Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5;->accept(Lkotlin/Pair;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6;->apply(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lkotlin/Pair; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6;->invoke(Ljava/lang/Integer;Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$7;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$7;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$7;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$7;->apply(Lkotlin/Pair;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$7;->apply(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lkotlin/Pair; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$8;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$8;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$8;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$8;->apply(Lkotlin/Pair;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Companion;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->(Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;I)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->(Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->copy$default(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;IILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->copy(Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;I)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->(Ljava/util/List;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;I)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->(Ljava/util/List;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->copy$default(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;Ljava/util/List;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;IILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->copy(Ljava/util/List;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;Ljava/util/List;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;I)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->getChatFolders()Ljava/util/List; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->getConversations()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->getCurrentFolder()Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->getFilterRequest()Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->getInternalSelection()Ljava/util/Set; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;->getMegaphone()Lorg/thoughtcrime/securesms/megaphone/Megaphone; @@ -28428,6 +28837,10 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Factor HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Factory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Factory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Factory;->create(Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$chatFolderState$1;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$chatFolderState$1;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$chatFolderState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$chatFolderState$1;->invoke(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$conversationsState$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$conversationsState$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$conversationsState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -28436,6 +28849,12 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$filter HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$filterRequestState$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$filterRequestState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$filterRequestState$1;->invoke(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1$1;->(Ljava/util/List;Ljava/util/List;Ljava/lang/Long;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1$1;->invoke(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;Lkotlin/coroutines/Continuation;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -28466,11 +28885,15 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->(ZLorg/thoughtcrime/securesms/megaphone/MegaphoneRepository;Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->(ZLorg/thoughtcrime/securesms/megaphone/MegaphoneRepository;Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->access$getPagingConfig$p(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)Lorg/signal/paging/PagingConfig; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->access$isArchived$p(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)Z +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->access$loadCurrentFolders(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->currentSelectedConversations()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getChatFolderState()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getController()Lorg/signal/paging/ProxyPagingController; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getConversationFilterRequest()Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getConversationsState()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getCurrentFolder()Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getFilterRequestState()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getHasNoConversations()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getMegaphoneState()Lio/reactivex/rxjava3/core/Flowable; @@ -28478,6 +28901,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getN HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getPinnedCount()I HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getSelectedState()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getWebSocketState()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->loadCurrentFolders()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onMegaphoneVisible(Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onVisible$lambda$0(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onVisible()V @@ -28552,6 +28976,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type;->values()[Lorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type; HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V +HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->getThreadRecord()Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->getType()Lorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type; HSPLorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;->$values()[Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter; @@ -28733,6 +29158,7 @@ HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachment(Lorg/tho HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachments(Landroid/database/Cursor;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachmentsForMessage(J)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->insertAttachmentsForMessage(JLjava/util/List;Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->insertUndownloadedAttachment(JLorg/thoughtcrime/securesms/attachments/Attachment;Z)Lorg/thoughtcrime/securesms/attachments/AttachmentId; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->readAttachments(Landroid/database/Cursor;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->readStickerLocator(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/stickers/StickerLocator; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->setTransferProgressPermanentFailure(Lorg/thoughtcrime/securesms/attachments/AttachmentId;J)V @@ -28745,6 +29171,7 @@ HSPLorg/thoughtcrime/securesms/database/CallLinkTable;->()V HSPLorg/thoughtcrime/securesms/database/CallLinkTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/CallTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/CallTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/CallTable$Companion;->getCREATE_INDEXES()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/CallTable$Event$Serializer;->()V HSPLorg/thoughtcrime/securesms/database/CallTable$Event$Serializer;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/CallTable$Event$Serializer;->serialize(Lorg/thoughtcrime/securesms/database/CallTable$Event;)Ljava/lang/Integer; @@ -28761,6 +29188,7 @@ HSPLorg/thoughtcrime/securesms/database/CallTable$ReadState;->(Ljava/lang/ HSPLorg/thoughtcrime/securesms/database/CallTable$ReadState;->access$getCode$p(Lorg/thoughtcrime/securesms/database/CallTable$ReadState;)I HSPLorg/thoughtcrime/securesms/database/CallTable;->()V HSPLorg/thoughtcrime/securesms/database/CallTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/CallTable;->access$getCREATE_INDEXES$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/CallTable;->getLatestRingingCalls()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/CallTable;->getOldestDeletionTimestamp()J HSPLorg/thoughtcrime/securesms/database/CallTable;->getUnreadMissedCallCount()J @@ -28773,49 +29201,75 @@ HSPLorg/thoughtcrime/securesms/database/ChatColorsTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/ChatColorsTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/ChatColorsTable;->()V HSPLorg/thoughtcrime/securesms/database/ChatColorsTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderMembershipTable;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderMembershipTable;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderMembershipTable;->getCREATE_INDEXES()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderTable;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderTable;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderTable;->getCREATE_INDEX()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderTable;->getCREATE_TABLE()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$Companion;->getAllChatsFolderContentValues()Landroid/content/ContentValues; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$Companion;->insertInitialChatFoldersAtCreationTime(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$MembershipType;->$values()[Lorg/thoughtcrime/securesms/database/ChatFolderTables$MembershipType; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$MembershipType;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$MembershipType;->(Ljava/lang/String;II)V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables$MembershipType;->getValue()I +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->()V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->getChatFolders(Z)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->getExcludedChats$default(Lorg/thoughtcrime/securesms/database/ChatFolderTables;Ljava/lang/Long;ILjava/lang/Object;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->getExcludedChats(Ljava/lang/Long;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->getIncludedChats$default(Lorg/thoughtcrime/securesms/database/ChatFolderTables;Ljava/lang/Long;ILjava/lang/Object;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/ChatFolderTables;->getIncludedChats(Ljava/lang/Long;)Ljava/util/Map; HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->()V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->()V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onDelete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onQuery(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onSql(Ljava/lang/String;[Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onUpdate(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda15;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda16;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda19;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda18;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda21;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda21;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda31;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda31;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda44;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda44;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda8;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$7Xzl-LD_QMlkhCUH8-6n3yFwhfs(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$9Gz7KbXzfAHwYopZ4SWig_CeXlM(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda32;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda32;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda33;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda33;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda47;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda47;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$0pqdC7SQgRD4htF6bzKtpUzNMhE(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$25SR2YoHKnlXZC8Q_64WRFqVRoo(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$BYvmNAG1LzsHwZL4JjJlUjuDxGY(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$PgY6uGCio3bRZeR2yZEo_KM9Lks(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$jSYkDtgxIziOJXvPmEzKkP7NkVo(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$kX8EQqk_hZHCH4wY-uCeSzUmt-4(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$X1kz1_0l2nN5cOA1-htohlR2uPg(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$Y_GN9qmXeweYvV0u4f_z4X8AFdY(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$ZEo94mfhB4uwHsxi8VHthh8HkCU(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$ciLh01Ubr0Hujb0IiKoBP8WdIIE(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$hhIbehX8n3T_6v4G-BW6zZ8yoO8(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$nWVZ0GtsJtiPq4Zsu0SH8XaISrk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$sXYoVhvGUYp3RiQF3w2RSUNzg-c(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$u53YUYuh0t4raIJcsUpMf2kqPH8(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyAttachmentUpdatedObservers$31()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListListeners$25()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListeners$22(J)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyRecipientChanged$38(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStoryObservers$39(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyAttachmentUpdatedObservers$32()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListListeners$26()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListeners$23(J)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyRecipientChanged$39(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStoryObservers$40(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerAttachmentDeletedObserver$10(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerChatFolderObserver$19(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationListObserver$0(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerNotificationProfileObserver$13(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$runPostSuccessfulTransaction$46(Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$runPostSuccessfulTransaction$48(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyAttachmentUpdatedObservers()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyConversationListListeners()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyConversationListeners(J)V @@ -28824,6 +29278,7 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyRecipientChange HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifySet(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyStoryObservers(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerAttachmentDeletedObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerChatFolderObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationListObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerNotificationProfileObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V @@ -28835,6 +29290,7 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyConversationListLi HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyConversationListeners(J)V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->insertInitialDistributionListAtCreationTime(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$ListTable;->()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$ListTable;->()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$ListTable;->getCREATE_TABLE()Ljava/lang/String; @@ -28845,8 +29301,10 @@ HSPLorg/thoughtcrime/securesms/database/DistributionListTables;->()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/DonationReceiptTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DonationReceiptTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/DonationReceiptTable$Companion;->getCREATE_INDEXS()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/DonationReceiptTable;->()V HSPLorg/thoughtcrime/securesms/database/DonationReceiptTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/DonationReceiptTable;->access$getCREATE_INDEXS$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/DraftTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DraftTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->()V @@ -28870,6 +29328,7 @@ HSPLorg/thoughtcrime/securesms/database/GroupReceiptTable;->()V HSPLorg/thoughtcrime/securesms/database/GroupReceiptTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/GroupTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/GroupTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/GroupTable$Companion;->getCREATE_TABLES()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/GroupTable$Companion;->getTYPED_GROUP_PROJECTION()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/GroupTable$MembershipTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/GroupTable$MembershipTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -28884,6 +29343,7 @@ HSPLorg/thoughtcrime/securesms/database/GroupTable$ShowAsStoryState;->(Lja HSPLorg/thoughtcrime/securesms/database/GroupTable$ShowAsStoryState;->getCode()I HSPLorg/thoughtcrime/securesms/database/GroupTable;->()V HSPLorg/thoughtcrime/securesms/database/GroupTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/GroupTable;->access$getCREATE_TABLES$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/GroupTable;->access$getTYPED_GROUP_PROJECTION$cp()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/GroupTable;->getAllGroupV2Ids()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/GroupTable;->getGroup(Lorg/signal/core/util/SqlUtil$Query;)Lj$/util/Optional; @@ -28911,6 +29371,7 @@ HSPLorg/thoughtcrime/securesms/database/InAppPaymentSubscriberTable;->() HSPLorg/thoughtcrime/securesms/database/InAppPaymentSubscriberTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$Companion;->getCREATE_TABLE()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$State$Companion;->()V HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$State$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$State$Companion;->serialize(Lorg/thoughtcrime/securesms/database/InAppPaymentTable$State;)Ljava/lang/Integer; @@ -28920,23 +29381,20 @@ HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$State;->(Ljava/l HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable$State;->getCode()I HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable;->()V HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable;->access$getCREATE_TABLE$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/InAppPaymentTable;->hasWaitingForAuth()Z -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/JobDatabase;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/database/JobDatabase$Companion;->()V HSPLorg/thoughtcrime/securesms/database/JobDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase$Companion;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/JobDatabase; HSPLorg/thoughtcrime/securesms/database/JobDatabase$getMostEligibleJobInQueue$1;->(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase$getMostEligibleJobInQueue$1;->invoke(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/database/JobDatabase$getMostEligibleJobInQueue$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->$r8$lambda$QG9gfPEt1nMVSr2ltzqu-cEwVes(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->()V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$getInstance$cp()Lorg/thoughtcrime/securesms/database/JobDatabase; HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$setInstance$cp(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$toJobSpec(Lorg/thoughtcrime/securesms/database/JobDatabase;Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/database/JobDatabase;->deleteJobs(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->dropTableIfPresent(Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->getAllDependencySpecs()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/JobDatabase;->getAllMinimalJobSpecs()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/JobDatabase;->getConstraintSpecsForJobs(Ljava/util/Collection;)Ljava/util/List; @@ -28948,14 +29406,11 @@ HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertDependencySpecs(Lnet HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertJobSpec(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertJobs(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->markJobAsRunning(Ljava/lang/String;J)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->onOpen$lambda$0(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->onOpen(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->toContentValues(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)Landroid/content/ContentValues; HSPLorg/thoughtcrime/securesms/database/JobDatabase;->toJobSpec(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/database/JobDatabase;->updateAllJobsToBePending()V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->updateJobAfterRetry(Ljava/lang/String;JIJ[B)V -HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$1;->()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$Type;->$values()[Lorg/thoughtcrime/securesms/database/KeyValueDatabase$Type; HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$Type;->()V @@ -28963,19 +29418,19 @@ HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$Type;->(Ljava/lan HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$Type;->fromId(I)Lorg/thoughtcrime/securesms/database/KeyValueDatabase$Type; HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$Type;->getId()I HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$Type;->values()[Lorg/thoughtcrime/securesms/database/KeyValueDatabase$Type; -HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->$r8$lambda$G2dZI_gAXkqExOGYLgmndIoi47k()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;)V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->getDataSet()Lorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet; HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/KeyValueDatabase; -HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->lambda$onOpen$0()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->onOpen(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase;->writeDataSet(Lorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;Ljava/util/Collection;)V HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable$Companion;->getCREATE_INDEXES()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->()V HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->access$getCREATE_INDEXES$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->insert(Lorg/whispersystems/signalservice/api/push/ServiceId;ILorg/signal/libsignal/protocol/state/KyberPreKeyRecord;Z)V HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->toAccountId(Lorg/whispersystems/signalservice/api/push/ServiceId;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/LocalMetricsDatabase$Companion;->()V @@ -29043,22 +29498,20 @@ HSPLorg/thoughtcrime/securesms/database/MediaTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/MediaTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/MediaTable;->()V HSPLorg/thoughtcrime/securesms/database/MediaTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V -HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->$r8$lambda$Hn6TX4rnCrZWpQUu_qk_FiE0W94()V HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->()V HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;)V HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->getAllAndDeleteMissing()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/MegaphoneDatabase; HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->insert(Ljava/util/Collection;)V -HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->lambda$onOpen$0()V HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->markFinished(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;)V HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->markFirstVisible(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;J)V HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->onOpen(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/MentionTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/MentionTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/MentionTable$Companion;->getCREATE_INDEXES()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MentionTable;->()V HSPLorg/thoughtcrime/securesms/database/MentionTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/MentionTable;->access$getCREATE_INDEXES$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MentionTable;->getMentionsForMessage(J)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/MentionTable;->insert(JJLjava/util/Collection;)V HSPLorg/thoughtcrime/securesms/database/MentionUtil$$ExternalSyntheticLambda3;->(Landroid/content/Context;)V @@ -29124,7 +29577,6 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->close()V HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getCurrent()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getCursor()Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getFailures(Ljava/lang/String;)Ljava/util/Set; -HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMediaMmsMessageRecord(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMismatchedIdentities(Ljava/lang/String;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getNext()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getQuote(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/Quote; @@ -29217,8 +29669,15 @@ HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isUnsupportedMessageT HSPLorg/thoughtcrime/securesms/database/MessageTypes;->()V HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$Companion;->()V HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$Companion;->getCREATE_INDEXES()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$Companion;->getCREATE_TABLE()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$NameCollisionMembershipTable;->()V +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$NameCollisionMembershipTable;->()V +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables$NameCollisionMembershipTable;->getCREATE_INDEXES()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/NameCollisionTables;->()V HSPLorg/thoughtcrime/securesms/database/NameCollisionTables;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables;->access$getCREATE_INDEXES$cp()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/NameCollisionTables;->access$getCREATE_TABLE$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/NotificationProfileDatabase$Companion;->()V HSPLorg/thoughtcrime/securesms/database/NotificationProfileDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/NotificationProfileDatabase$NotificationProfileAllowedMembersTable;->()V @@ -29250,8 +29709,10 @@ HSPLorg/thoughtcrime/securesms/database/PaymentTable;->()V HSPLorg/thoughtcrime/securesms/database/PaymentTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable$Companion;->getCREATE_INDEXES()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable;->()V HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable;->access$getCREATE_INDEXES$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/PendingRetryReceiptCache;->()V HSPLorg/thoughtcrime/securesms/database/PendingRetryReceiptCache;->()V HSPLorg/thoughtcrime/securesms/database/PendingRetryReceiptCache;->(Lorg/thoughtcrime/securesms/database/PendingRetryReceiptTable;)V @@ -29295,6 +29756,7 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda6 HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda6;->run()V HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->getCREATE_INDEXS()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->maskCapabilitiesToLong(Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities;)J HSPLorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)V HSPLorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult;->getRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; @@ -29368,6 +29830,7 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable;->$r8$lambda$JXfW5Mk9kGUC HSPLorg/thoughtcrime/securesms/database/RecipientTable;->$r8$lambda$mINFFJ-egVgJ9tzzcXjQIqnTUyw(Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->access$getCREATE_INDEXS$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->buildContentValuesForNewUser(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Z)Landroid/content/ContentValues; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getAndPossiblyMerge$default(Lorg/thoughtcrime/securesms/database/RecipientTable;Lorg/whispersystems/signalservice/api/push/ServiceId;Ljava/lang/String;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getAndPossiblyMerge$lambda$5$lambda$4(Lkotlin/jvm/internal/Ref$ObjectRef;)V @@ -29428,21 +29891,34 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getExtras(Lan HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecipientExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtras; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecord(Landroid/content/Context;Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getSyncExtras$lambda$6(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getSyncExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->parseBadgeList([B)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion;->()V HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion;->getCREATE_TABLE()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables;->()V HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables;->access$getCREATE_TABLE$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable$Companion;->getCREATE_TABLE()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable;->()V HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable;->access$getCREATE_TABLE$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RemoteMegaphoneTable;->getPotentialMegaphonesAndClearOld(J)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1;->subscribe(Lio/reactivex/rxjava3/core/FlowableEmitter;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;->(Lio/reactivex/rxjava3/core/Emitter;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;->prime()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFolders$2;->()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFolders$2;->()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFolders$2;->invoke()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFolders$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFoldersFlowable$1;->()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFoldersFlowable$1;->()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFoldersFlowable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFoldersFlowable$1;->invoke(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2;->invoke()Lio/reactivex/rxjava3/core/Flowable; @@ -29466,11 +29942,14 @@ HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$notificationProfilesF HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->$r8$lambda$Q-MHO-3EVj6lQ5qvnI2O-7YevNQ(Lkotlin/jvm/functions/Function1;Lio/reactivex/rxjava3/core/FlowableEmitter;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->access$chatFoldersFlowable(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver;)Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->access$conversationListFlowable(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver;)Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->access$notificationProfilesFlowable(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver;)Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->chatFoldersFlowable()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->conversationListFlowable()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->databaseFlowable$lambda$1(Lkotlin/jvm/functions/Function1;Lio/reactivex/rxjava3/core/FlowableEmitter;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->databaseFlowable(Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->getChatFolders()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->getConversationList()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->getNotificationProfiles()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->notificationProfilesFlowable()Lio/reactivex/rxjava3/core/Flowable; @@ -29527,6 +30006,7 @@ HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->(Lnet/zetetic/dat HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->beginTransaction()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->endTransaction()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->execSQL(Ljava/lang/String;[Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->getPendingPostSuccessfulTransactionTasks()Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->getPostSuccessfulTransactionTasks()Ljava/util/Set; @@ -29554,6 +30034,9 @@ HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->replace(Ljava/lang/Stri HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->runPostSuccessfulTransaction(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->setTransactionSuccessful()V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->trace(Ljava/lang/String;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceLockEnd()V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceLockStart()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/SQLiteDatabase$Returnable;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->update(Ljava/lang/String;ILandroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)I @@ -29561,8 +30044,12 @@ HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->update(Ljava/lang/Strin HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I HSPLorg/thoughtcrime/securesms/database/SearchTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/SearchTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/SearchTable$Companion;->getCREATE_TABLE()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/SearchTable$Companion;->getCREATE_TRIGGERS()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/SearchTable;->()V HSPLorg/thoughtcrime/securesms/database/SearchTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/SearchTable;->access$getCREATE_TABLE$cp()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/SearchTable;->access$getCREATE_TRIGGERS$cp()[Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/SenderKeySharedTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/SenderKeySharedTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/SenderKeySharedTable;->()V @@ -29583,13 +30070,13 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->(Lkotli HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->attachments()Lorg/thoughtcrime/securesms/database/AttachmentTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->avatarPicker()Lorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->calls()Lorg/thoughtcrime/securesms/database/CallTable; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->chatFolders()Lorg/thoughtcrime/securesms/database/ChatFolderTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->distributionLists()Lorg/thoughtcrime/securesms/database/DistributionListTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->drafts()Lorg/thoughtcrime/securesms/database/DraftTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->emojiSearch()Lorg/thoughtcrime/securesms/database/EmojiSearchTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->getInstance()Lorg/thoughtcrime/securesms/database/SignalDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->getRawDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->groups()Lorg/thoughtcrime/securesms/database/GroupTable; -HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->hasTable(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->identities()Lorg/thoughtcrime/securesms/database/IdentityTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->inAppPayments()Lorg/thoughtcrime/securesms/database/InAppPaymentTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->inTransaction()Z @@ -29604,6 +30091,7 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->pendingRetryR HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->recipients()Lorg/thoughtcrime/securesms/database/RecipientTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->remoteMegaphones()Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->runPostSuccessfulTransaction(Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->senderKeyShared()Lorg/thoughtcrime/securesms/database/SenderKeySharedTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->senderKeys()Lorg/thoughtcrime/securesms/database/SenderKeyTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->sessions()Lorg/thoughtcrime/securesms/database/SessionTable; @@ -29617,9 +30105,11 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->access$setInstance$cp(L HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->attachments()Lorg/thoughtcrime/securesms/database/AttachmentTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->distributionLists()Lorg/thoughtcrime/securesms/database/DistributionListTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->emojiSearch()Lorg/thoughtcrime/securesms/database/EmojiSearchTable; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->executeStatements(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;[Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getAttachmentTable()Lorg/thoughtcrime/securesms/database/AttachmentTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getAvatarPickerDatabase()Lorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getCallTable()Lorg/thoughtcrime/securesms/database/CallTable; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getChatFoldersTable()Lorg/thoughtcrime/securesms/database/ChatFolderTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getDistributionListTables()Lorg/thoughtcrime/securesms/database/DistributionListTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getDraftTable()Lorg/thoughtcrime/securesms/database/DraftTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getEmojiSearchTable()Lorg/thoughtcrime/securesms/database/EmojiSearchTable; @@ -29633,7 +30123,6 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getMessageTable()Lorg/t HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getNotificationProfileDatabase()Lorg/thoughtcrime/securesms/database/NotificationProfileDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getPendingRetryReceiptTable()Lorg/thoughtcrime/securesms/database/PendingRetryReceiptTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRawDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; -HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRawReadableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRawWritableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRecipientTable()Lorg/thoughtcrime/securesms/database/RecipientTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRemoteMegaphoneTable()Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; @@ -29646,7 +30135,6 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getSignalWritableDataba HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getSignedPreKeyTable()Lorg/thoughtcrime/securesms/database/SignedPreKeyTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getThreadTable()Lorg/thoughtcrime/securesms/database/ThreadTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->groups()Lorg/thoughtcrime/securesms/database/GroupTable; -HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->hasTable(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->identities()Lorg/thoughtcrime/securesms/database/IdentityTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->inTransaction()Z HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->init(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;Lorg/thoughtcrime/securesms/crypto/AttachmentSecret;)V @@ -29654,6 +30142,7 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->mentions()Lorg/thoughtc HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->messageLog()Lorg/thoughtcrime/securesms/database/MessageSendLogTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->messageSearch()Lorg/thoughtcrime/securesms/database/SearchTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->messages()Lorg/thoughtcrime/securesms/database/MessageTable; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->onCreate(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->onOpen(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->recipients()Lorg/thoughtcrime/securesms/database/RecipientTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V @@ -29684,8 +30173,12 @@ HSPLorg/thoughtcrime/securesms/database/StickerTable;->()V HSPLorg/thoughtcrime/securesms/database/StickerTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;Lorg/thoughtcrime/securesms/crypto/AttachmentSecret;)V HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->getCREATE_INDEXS()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->getCREATE_TABLE()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/StorySendTable;->()V HSPLorg/thoughtcrime/securesms/database/StorySendTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/StorySendTable;->access$getCREATE_INDEXS$cp()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/StorySendTable;->access$getCREATE_TABLE$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->(Ljava/lang/CharSequence;ILjava/util/List;)V HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->(Ljava/lang/CharSequence;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->getBody()Ljava/lang/CharSequence; @@ -29725,7 +30218,6 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable$Reader;->(Lorg/thought HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->(Landroid/database/Cursor;Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->close()V -HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->getCurrent()Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->getNext()Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->getSnippetUri(Landroid/database/Cursor;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/database/ThreadTable$ThreadIdResult;->()V @@ -29742,30 +30234,36 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/Str HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/String;Ljava/lang/String;JJ)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createThreadForRecipient(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZI)J HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getArchivedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)I +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getAttachmentUriFor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getContentTypeFor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getExtrasFor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;)Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getOrCreateThreadIdFor(Lorg/thoughtcrime/securesms/recipients/Recipient;)J HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getOrCreateThreadIdFor(Lorg/thoughtcrime/securesms/recipients/Recipient;I)J HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getOrCreateThreadIdFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZI)J HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getOrCreateThreadIdResultFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZI)Lorg/thoughtcrime/securesms/database/ThreadTable$ThreadIdResult; -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getPinnedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)I +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getPinnedConversationListCount$default(Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;ILjava/lang/Object;)I +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getPinnedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;)I HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getRecentConversationList(IZZ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getRecentConversationList(IZZZZZZ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getRecipientForThreadId(J)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getRecipientIdForThreadId(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadIdFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadIdIfExistsFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;)J -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnarchivedConversationList(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;ZJJ)Landroid/database/Cursor; -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnarchivedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)I +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnarchivedConversationList(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;ZJJLorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;)Landroid/database/Cursor; +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnarchivedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;)I +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnreadCountByChatFolder(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;)I HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnreadMessageCount()J HSPLorg/thoughtcrime/securesms/database/ThreadTable;->hasMoreRecentDraft(JJ)Z HSPLorg/thoughtcrime/securesms/database/ThreadTable;->incrementUnread(JII)V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->markAsActiveEarly(J)V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->readerFor(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/ThreadTable$Reader; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->setLastScrolled(JJ)V +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->toQuery(Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->toQuery(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->update$default(Lorg/thoughtcrime/securesms/database/ThreadTable;JZZILjava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZZ)Z +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZZZZ)Z +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->updateThread(JZLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/ThreadTable$Extra;JIIJZJIIILorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras;)V HSPLorg/thoughtcrime/securesms/database/UnknownStorageIdTable;->()V HSPLorg/thoughtcrime/securesms/database/UnknownStorageIdTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;)Ljava/util/List; @@ -30009,6 +30507,7 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setUnreadCo HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setUnreadSelfMentionsCount(I)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)V HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;Lorg/thoughtcrime/securesms/database/model/ThreadRecord-IA;)V +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getBody()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getBodyRanges()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getDate()J @@ -30024,6 +30523,7 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getUnreadCount()I HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isArchived()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isMessageRequestAccepted()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isOutgoing()Z +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isPinned()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isRead()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isScheduledMessage()Z HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/InAppPaymentData$Error$Type$Companion$ADAPTER$1;->(Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;Lorg/thoughtcrime/securesms/database/model/databaseprotos/InAppPaymentData$Error$Type;)V @@ -30723,6 +31223,7 @@ HSPLorg/thoughtcrime/securesms/jobmanager/CompositeScheduler;->schedule(JLjava/u HSPLorg/thoughtcrime/securesms/jobmanager/Constraint$-CC;->$default$getJobSchedulerKeyPart(Lorg/thoughtcrime/securesms/jobmanager/Constraint;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator;->(Ljava/util/Map;)V HSPLorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator;->instantiate(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/Constraint; +HSPLorg/thoughtcrime/securesms/jobmanager/CoroutineJob;->()V HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler;)V HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->$r8$lambda$0KH5iNLdy2DvUxriNkEuWXyJtWM(Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler;)V @@ -30733,7 +31234,7 @@ HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->schedule(JLjava/util/ HSPLorg/thoughtcrime/securesms/jobmanager/Job$1;->()V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->()V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZI)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZII)V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->addConstraint(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->build()Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setConstraints(Ljava/util/List;)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; @@ -30744,17 +31245,18 @@ HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setMaxAttempt HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setMaxInstancesForFactory(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setMaxInstancesForQueue(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setQueue(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZI)V -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZILorg/thoughtcrime/securesms/jobmanager/Job$Parameters-IA;)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZII)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZIILorg/thoughtcrime/securesms/jobmanager/Job$Parameters-IA;)V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getConstraintKeys()Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getCreateTime()J +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getGlobalPriority()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getLifespan()J HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getMaxAttempts()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getMaxInstancesForFactory()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getMaxInstancesForQueue()I -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getPriority()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getQueue()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getQueuePriority()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->isMemoryOnly()Z HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType;->$values()[Lorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType;->()V @@ -30791,6 +31293,8 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda11;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda11;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/jobmanager/JobController$Callback;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda12;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V @@ -30853,22 +31357,26 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobInstantiator;->instantiate(Ljava/la HSPLorg/thoughtcrime/securesms/jobmanager/JobLogger;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobLogger;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobLogger;->format(Lorg/thoughtcrime/securesms/jobmanager/Job;Ljava/lang/String;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda11;->run()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobLogger;->format(Lorg/thoughtcrime/securesms/jobmanager/Job;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda10;->run()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda12;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda13;->run()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda18;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda19;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda2;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda4;->run()V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda6;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda6;->shouldRunOnExecutor()Z -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8;->run()V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda5;->run()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda7;->()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda7;->shouldRunOnExecutor()Z +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8;->onEmpty()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda9;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;->enqueue()V @@ -30894,12 +31402,15 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;->getJobStora HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;->getJobThreadCount()I HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;->getJobTracker()Lorg/thoughtcrime/securesms/jobmanager/JobTracker; HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;->getReservedJobRunners()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$4JJHrJTTxDi7E4hxKAg_02mqi-A(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$dOaoyApbi-emSzM8ubj7rk8lick(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$fs9mjzdPoak0N33jgbXldhjhsgo(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$5MCytohoZMTu0amyU_AepCgWC58(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$85LmNexRgNyavzXKYnZRZzbo2OM(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$I4fiEevNy45-v8vZWBFdV5Aed00(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$Nx92yx6XLq9eUfEY4_OOUhJGfxU(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$O7YLSgqZSskRHEMffz0g8GNHnmk(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$SiKOmgTA1xzWr13KNtwvTJp-j1U(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$gVhLLB-m3Oyfo4j7A2GugXdBKLA(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Z -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$hjGGJSJxjousDNfIU6IzLFzivSk(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$xUXumT2c8sBYgvbmLPreFpbEpV0(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$rL6pC70vZRybajVNYxOy7VpjYEs()Z +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$zv5kjLTlYV8_FHBWN5R16rnvwBc(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->-$$Nest$menqueueChain(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;)V @@ -30907,13 +31418,16 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->add(Lorg/thoughtcrime/sec HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->addOnEmptyQueueListener(Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->beginJobLoop()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->enqueueChain(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$addOnEmptyQueueListener$12(Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$beginJobLoop$2()V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$enqueueChain$14(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$new$1(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$runOnExecutor$16(Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$addOnEmptyQueueListener$13(Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$beginJobLoop$3()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$enqueueChain$15(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$new$1()Z +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$new$2(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$onEmptyQueue$16()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$runOnExecutor$17(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$static$0(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Z HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->onConstraintMet(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->onEmptyQueue()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->runOnExecutor(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->startChain(Lorg/thoughtcrime/securesms/jobmanager/Job;)Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain; HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->waitUntilInitialized()V @@ -30989,13 +31503,14 @@ HSPLorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint;->get HSPLorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint;->getJobSchedulerKeyPart()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint;->isMet()Z HSPLorg/thoughtcrime/securesms/jobmanager/impl/BackoffUtil;->exponentialBackoff(IJ)J +HSPLorg/thoughtcrime/securesms/jobmanager/impl/BatteryNotLowConstraint$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/BatteryNotLowConstraint$Factory;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$LegacyServiceStateListener;->(Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$ServiceStateListenerApi31;->(Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$ServiceStateListenerApi31;->(Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$ServiceStateListenerApi31-IA;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$ServiceStateListenerApi31;->onServiceStateChanged(Landroid/telephony/ServiceState;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;->-$$Nest$fgetnotifier(Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;)Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier; HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;->-$$Nest$fputlastKnownState(Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;Landroid/telephony/ServiceState;)V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;->-$$Nest$sfgetREASON()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;->-$$Nest$sfgetTAG()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver;->(Landroid/app/Application;)V @@ -31006,16 +31521,21 @@ HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraint$Factory;-> HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver;->register(Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier;)V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver$1;->(Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier;)V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$sfgetREASON()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$sfgetbatteryNotLow()Z +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$sfgetcharging()Z +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$sfputbatteryNotLow(Z)V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$sfputcharging(Z)V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$smisBatteryNotLow(Landroid/content/Intent;)Z +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->-$$Nest$smisCharging(Landroid/content/Intent;)Z +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->()V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->(Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->isBatteryNotLow(Landroid/content/Intent;)Z +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->isCharging(Landroid/content/Intent;)Z +HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver;->register(Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraint$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver$1;->(Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier;)V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->-$$Nest$sfgetcharging()Z -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->-$$Nest$sfputcharging(Z)V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->-$$Nest$smisCharging(Landroid/content/Intent;)Z -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->(Landroid/app/Application;)V -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->isCharging(Landroid/content/Intent;)Z -HSPLorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver;->register(Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/DataRestoreConstraint$Factory;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/DataRestoreConstraint$Factory;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/DataRestoreConstraintObserver;->()V @@ -31109,18 +31629,19 @@ HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->getDependencySp HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->getJobSpec()Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->isMemoryOnly()Z HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZI)V -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy$default(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZIILjava/lang/Object;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZI)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZII)V +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy$default(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZII)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getCreateTime()J HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getFactoryKey()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getGlobalPriority()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getLastRunAttemptTime()J HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getLifespan()J HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getMaxAttempts()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getNextBackoffInterval()J -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getPriority()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getQueueKey()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getQueuePriority()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getRunAttempt()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getSerializedData()[B HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getSerializedInputData()[B @@ -31172,12 +31693,21 @@ HSPLorg/thoughtcrime/securesms/jobs/AvatarGroupsV1DownloadJob$Factory;->() HSPLorg/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackfillDigestJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackfillDigestJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackfillDigestsForDataFileJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackfillDigestsForDataFileJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackupMessagesJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackupMessagesJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackupRestoreJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackupRestoreJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackupRestoreMediaJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BackupRestoreMediaJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Companion;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Companion;->enqueueIfAble()V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob;->()V +HSPLorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob;->enqueueIfAble()V HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->()V HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->getNextRunAttemptBackoff(ILjava/lang/Exception;)J @@ -31230,6 +31760,8 @@ HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->getFactoryKey()Lja HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->setAvatar(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/jobs/DeleteAbandonedAttachmentsJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/DeleteAbandonedAttachmentsJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob; @@ -31312,6 +31844,8 @@ HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory;->() HSPLorg/thoughtcrime/securesms/jobs/FailingJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda3;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda3;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda4;->(Lkotlin/jvm/functions/Function1;)V @@ -31346,6 +31880,9 @@ HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$markJobAsRunning$1;->invoke(L HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$markJobAsRunning$2;->(J)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$markJobAsRunning$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$markJobAsRunning$2;->invoke(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec; +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$placeJobInEligibleList$1$1;->(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)V +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$placeJobInEligibleList$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$placeJobInEligibleList$1$1;->invoke(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$replaceJobInEligibleList$2;->(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$replaceJobInEligibleList$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$replaceJobInEligibleList$2;->invoke(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Ljava/lang/Boolean; @@ -31361,7 +31898,8 @@ HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$updateJobAfterRetry$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$updateJobAfterRetry$2;->invoke(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$DnPsmD4KME6p-eCjMV1KYuzoJTU(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$hFZUtsLVmB-60DjhFd86s3LIq2A(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$KBIPyzUPCn5TYHPpIoGoyoEpv0s(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$aG9BR_CjcvYUWWPD87qxudOl4Kg(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$vnmFAlA-0szExhp1DFO8bQ9rr2U(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->()V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->(Lorg/thoughtcrime/securesms/database/JobDatabase;)V @@ -31375,15 +31913,14 @@ HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->deleteJobs(Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getConstraintSpecs(Ljava/lang/String;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobCountForFactory(Ljava/lang/String;)I -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobCountForFactoryAndQueue(Ljava/lang/String;Ljava/lang/String;)I HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobSpec(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getSingleLayerOfDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->hasEligibleRunTime(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;J)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->init()V -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->insertJobs(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->markJobAsRunning(Ljava/lang/String;J)V +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->placeJobInEligibleList$lambda$31$lambda$30(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->placeJobInEligibleList(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)V -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->replaceJobInEligibleList$lambda$32(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->replaceJobInEligibleList$lambda$33(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->replaceJobInEligibleList(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->toJobSpec(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->updateAllJobsToBePending()V @@ -31497,17 +32034,18 @@ HSPLorg/thoughtcrime/securesms/jobs/MarkNoteToSelfAttachmentUploadedJob$Factory; HSPLorg/thoughtcrime/securesms/jobs/MarkerJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MessageFetchJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->()V -HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIZZ)V -HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->copy$default(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIZZILjava/lang/Object;)Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec; -HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->copy(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIZZ)Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec; +HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIZZ)V +HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->copy$default(Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIZZILjava/lang/Object;)Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec; +HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->copy(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIZZ)Lorg/thoughtcrime/securesms/jobs/MinimalJobSpec; HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getCreateTime()J HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getFactoryKey()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getGlobalPriority()I HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getLastRunAttemptTime()J HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getNextBackoffInterval()J -HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getPriority()I HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getQueueKey()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->getQueuePriority()I HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->hashCode()I HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->isMemoryOnly()Z HSPLorg/thoughtcrime/securesms/jobs/MinimalJobSpec;->isRunning()Z @@ -31653,8 +32191,13 @@ HSPLorg/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RestoreLocalAttachmentJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RestoreLocalAttachmentJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Companion;->()V +HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Companion;->enqueueIfNecessary()V HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob;->()V +HSPLorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob;->enqueueIfNecessary()V HSPLorg/thoughtcrime/securesms/jobs/ResumableUploadSpecJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion;->()V @@ -31838,6 +32381,8 @@ HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues$Companion;->()V HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V +HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues;->backsUpMedia()Z +HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues;->getBackupTier()Lorg/thoughtcrime/securesms/backup/v2/MessageBackupTier; HSPLorg/thoughtcrime/securesms/keyvalue/BlobValue;->(Ljava/lang/String;[BLorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/BooleanValue;->(Ljava/lang/String;ZLorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/BooleanValue;->getValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)Ljava/lang/Boolean; @@ -31918,6 +32463,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->putString(Ljava/lang/S HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->readValueAsType(Ljava/lang/String;Ljava/lang/Class;Z)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->removeAll(Ljava/util/Collection;)V HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueEnumValue;->(Ljava/lang/String;Ljava/lang/Object;Lorg/signal/core/util/LongSerializer;Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V +HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueEnumValue;->getValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueProtoValue;->(Ljava/lang/String;Lcom/squareup/wire/ProtoAdapter;Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueProtoValue;->getValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueStore$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;Lorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;Ljava/util/Collection;)V @@ -32070,6 +32616,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->shouldKeepMutedChatsArc HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->()V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->account()Lorg/thoughtcrime/securesms/keyvalue/AccountValues; +HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->backup()Lorg/thoughtcrime/securesms/keyvalue/BackupValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->chatColors()Lorg/thoughtcrime/securesms/keyvalue/ChatColorsValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->emoji()Lorg/thoughtcrime/securesms/keyvalue/EmojiValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion;->getNotificationProfile()Lorg/thoughtcrime/securesms/keyvalue/NotificationProfileValues; @@ -32097,6 +32644,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->access$setInstance$cp(Lorg HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->account()Lorg/thoughtcrime/securesms/keyvalue/AccountValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->emoji()Lorg/thoughtcrime/securesms/keyvalue/EmojiValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->getAccountValues()Lorg/thoughtcrime/securesms/keyvalue/AccountValues; +HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->getBackupValues()Lorg/thoughtcrime/securesms/keyvalue/BackupValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->getChatColorsValues()Lorg/thoughtcrime/securesms/keyvalue/ChatColorsValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->getEmojiValues()Lorg/thoughtcrime/securesms/keyvalue/EmojiValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->getInAppPaymentValues()Lorg/thoughtcrime/securesms/keyvalue/InAppPaymentValues; @@ -32129,6 +32677,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->settings()Lorg/thoughtcrim HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->storageService()Lorg/thoughtcrime/securesms/keyvalue/StorageServiceValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->svr()Lorg/thoughtcrime/securesms/keyvalue/SvrValues; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStore;->uiHints()Lorg/thoughtcrime/securesms/keyvalue/UiHintValues; +HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate$flow$1;->(Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate;)V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate;->()V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -32228,7 +32777,6 @@ HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->flush()V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->v(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V -HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->write(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment;)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment;)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment;)V @@ -32570,6 +33118,8 @@ HSPLorg/thoughtcrime/securesms/migrations/AttachmentHashBackfillMigrationJob$Fac HSPLorg/thoughtcrime/securesms/migrations/AttributesMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/AvatarIdRemovalMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/AvatarMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/BackfillDigestsForDuplicatesMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/BackfillDigestsForDuplicatesMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/BackfillDigestsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/BackfillDigestsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/BackupJitterMigrationJob$Factory;->()V @@ -32637,6 +33187,8 @@ HSPLorg/thoughtcrime/securesms/migrations/UpdateSmsJobsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/UserNotificationMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/UuidMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/WallpaperCleanupMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/WallpaperCleanupMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/WallpaperStorageMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/WallpaperStorageMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$Factory;->()V @@ -32881,7 +33433,6 @@ HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->()V HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/io/InputStream; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/io/File; -HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFileDetails(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getOutputStream(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/OutputStream; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->hasAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Z @@ -33021,6 +33572,7 @@ HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->getId()Lorg/thoughtcri HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->getLiveData()Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$2(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->refresh()Lorg/thoughtcrime/securesms/recipients/LiveRecipient; +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->refresh(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->resolve()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->set(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache;)V @@ -33061,7 +33613,6 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient$Capability;->(Ljava/la HSPLorg/thoughtcrime/securesms/recipients/Recipient$Capability;->serialize()I HSPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->live(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/LiveRecipient; HSPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->resolved(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->resolvedList(Ljava/util/Collection;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->self()Lorg/thoughtcrime/securesms/recipients/Recipient; @@ -33078,13 +33629,13 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;->(Ljava/lang/String;II)V HSPLorg/thoughtcrime/securesms/recipients/Recipient$callRingtone$2;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/Recipient$combinedAboutAndEmoji$2;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/recipients/Recipient$filteredAbout$2;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/Recipient$hasViewedStory$1;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$hasViewedStory$1;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$messageRingtone$2;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/Recipient$shouldHideStory$1;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$shouldHideStory$1;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient;->()V +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZLorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Ljava/util/List;Lj$/util/Optional;ZZZJLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Landroid/net/Uri;Landroid/net/Uri;IILorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Ljava/lang/String;Landroid/net/Uri;Ljava/lang/String;Landroid/net/Uri;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;JLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$SealedSenderAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lj$/util/Optional;ZLjava/util/List;ZZLorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lj$/util/Optional;Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/recipients/Recipient;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZLorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Ljava/util/List;Lj$/util/Optional;ZZZJLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Landroid/net/Uri;Landroid/net/Uri;IILorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Ljava/lang/String;Landroid/net/Uri;Ljava/lang/String;Landroid/net/Uri;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;JLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$SealedSenderAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lj$/util/Optional;ZLjava/util/List;ZZLorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lj$/util/Optional;Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/recipients/Recipient;->access$getTAG$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->equals(Ljava/lang/Object;)Z @@ -33140,6 +33691,7 @@ HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator$create$2;->() HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator$create$2;->()V HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator;->()V HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator;->()V +HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator;->create(ZLjava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;Lorg/thoughtcrime/securesms/database/model/RecipientRecord;Ljava/util/List;ZLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Lj$/util/Optional;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator;->forId$default(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator;->forId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/RecipientCreator;->forId(Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Lorg/thoughtcrime/securesms/recipients/Recipient; @@ -33150,7 +33702,6 @@ HSPLorg/thoughtcrime/securesms/recipients/RecipientId$Serializer;->()V HSPLorg/thoughtcrime/securesms/recipients/RecipientId$Serializer;->(Lorg/thoughtcrime/securesms/recipients/RecipientId$Serializer-IA;)V HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->()V HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->(J)V -HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Lorg/whispersystems/signalservice/api/push/ServiceId;)Lorg/thoughtcrime/securesms/recipients/RecipientId; @@ -33594,6 +34145,7 @@ HSPLorg/thoughtcrime/securesms/util/DateUtils;->isNow(J)Z HSPLorg/thoughtcrime/securesms/util/DateUtils;->isWithin-HG0u8IE(JJ)Z HSPLorg/thoughtcrime/securesms/util/Debouncer;->(J)V HSPLorg/thoughtcrime/securesms/util/Debouncer;->(JLjava/util/concurrent/TimeUnit;)V +HSPLorg/thoughtcrime/securesms/util/Debouncer;->publish(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->getValue()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/Deferred;->()V @@ -33743,6 +34295,7 @@ HSPLorg/thoughtcrime/securesms/util/NameUtil;->getAbbreviation(Ljava/lang/String HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->getNetworkInfo(Landroid/content/Context;)Landroid/net/NetworkInfo; HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->isConnected(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->isConnectedWifi(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator;->()V HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda1;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)V @@ -33850,6 +34403,7 @@ HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->getGroupHardLimit()I HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->getGroupRecommendedLimit()I HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->getInitialized()Z HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->getREMOTE_VALUES()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->getShowChatFolders()Z HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->groupLimits()Lorg/thoughtcrime/securesms/groups/SelectionLimits; HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->init()V HSPLorg/thoughtcrime/securesms/util/RemoteConfig;->internalUser()Z @@ -34033,6 +34587,7 @@ HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setStatusBarColor(Landroid/view HSPLorg/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory;->(Lj$/util/function/Function;I)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->()V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->(Z)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->registerFactory(Ljava/lang/Class;Lorg/thoughtcrime/securesms/util/adapter/mapping/Factory;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->()V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingModelList;->(Ljava/util/Collection;)V @@ -34307,6 +34862,10 @@ HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilit HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->$values()[Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType; HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->()V HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->(Ljava/lang/String;I)V +HSPLorg/whispersystems/signalservice/api/push/DistributionId;->()V +HSPLorg/whispersystems/signalservice/api/push/DistributionId;->(Ljava/util/UUID;)V +HSPLorg/whispersystems/signalservice/api/push/DistributionId;->from(Ljava/lang/String;)Lorg/whispersystems/signalservice/api/push/DistributionId; +HSPLorg/whispersystems/signalservice/api/push/DistributionId;->toString()Ljava/lang/String; HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->()V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->from(Ljava/util/UUID;)Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; @@ -34322,6 +34881,7 @@ HSPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->()V HSPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->fromLibSignal(Lorg/signal/libsignal/protocol/ServiceId;)Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->parseOrNull$default(Lorg/whispersystems/signalservice/api/push/ServiceId$Companion;Ljava/lang/String;ZILjava/lang/Object;)Lorg/whispersystems/signalservice/api/push/ServiceId; +HSPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->parseOrNull(Ljava/lang/String;Z)Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->parseOrThrow(Ljava/lang/String;)Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/whispersystems/signalservice/api/push/ServiceId$PNI$Companion;->()V HSPLorg/whispersystems/signalservice/api/push/ServiceId$PNI$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -34334,7 +34894,6 @@ HSPLorg/whispersystems/signalservice/api/push/ServiceId$PNI;->(Lorg/signal HSPLorg/whispersystems/signalservice/api/push/ServiceId$PNI;->equals(Ljava/lang/Object;)Z HSPLorg/whispersystems/signalservice/api/push/ServiceId$PNI;->toString()Ljava/lang/String; HSPLorg/whispersystems/signalservice/api/push/ServiceId;->()V -HSPLorg/whispersystems/signalservice/api/push/ServiceId;->(Lorg/signal/libsignal/protocol/ServiceId;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId;->(Lorg/signal/libsignal/protocol/ServiceId;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId;->fromLibSignal(Lorg/signal/libsignal/protocol/ServiceId;)Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/whispersystems/signalservice/api/push/ServiceId;->isUnknown()Z @@ -34397,6 +34956,7 @@ HSPLorg/whispersystems/signalservice/api/util/Tls12SocketFactory;->(Ljavax HSPLorg/whispersystems/signalservice/api/util/Tls12SocketFactory;->createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket; HSPLorg/whispersystems/signalservice/api/util/Tls12SocketFactory;->patch(Ljava/net/Socket;)Ljava/net/Socket; HSPLorg/whispersystems/signalservice/api/util/UptimeSleepTimer;->()V +HSPLorg/whispersystems/signalservice/api/util/UptimeSleepTimer;->sleep(J)V HSPLorg/whispersystems/signalservice/api/util/UuidUtil;->()V HSPLorg/whispersystems/signalservice/api/util/UuidUtil;->isUuid(Ljava/lang/String;)Z HSPLorg/whispersystems/signalservice/api/util/UuidUtil;->parseOrNull(Ljava/lang/String;)Ljava/util/UUID; @@ -34897,6 +35457,7 @@ Landroidx/compose/animation/core/EasingKt; Landroidx/compose/animation/core/FiniteAnimationSpec; Landroidx/compose/animation/core/TweenSpec; Landroidx/compose/foundation/AbstractClickableNode$TraverseKey; +Landroidx/compose/foundation/AbstractClickableNode$applySemantics$1; Landroidx/compose/foundation/AbstractClickableNode; Landroidx/compose/foundation/BackgroundElement; Landroidx/compose/foundation/BackgroundKt; @@ -34917,6 +35478,7 @@ Landroidx/compose/foundation/DrawStretchOverscrollModifier$$ExternalSyntheticApi Landroidx/compose/foundation/DrawStretchOverscrollModifier$$ExternalSyntheticApiModelOutline4; Landroidx/compose/foundation/FocusableInNonTouchMode; Landroidx/compose/foundation/FocusableInteractionNode; +Landroidx/compose/foundation/FocusableNode$applySemantics$1; Landroidx/compose/foundation/FocusableNode; Landroidx/compose/foundation/FocusablePinnableContainerNode; Landroidx/compose/foundation/FocusedBoundsNode$TraverseKey; @@ -35015,6 +35577,10 @@ Landroidx/compose/foundation/text/modifiers/InlineDensity; Landroidx/compose/foundation/text/modifiers/LayoutUtilsKt; Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; Landroidx/compose/foundation/text/modifiers/TextStringSimpleElement; +Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$1; +Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$2; +Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$3; +Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$4; Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1; Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode; Landroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1; @@ -35455,6 +36021,8 @@ Landroidx/compose/ui/focus/FocusTransactionManager; Landroidx/compose/ui/geometry/CornerRadius$Companion; Landroidx/compose/ui/geometry/CornerRadius; Landroidx/compose/ui/geometry/CornerRadiusKt; +Landroidx/compose/ui/geometry/MutableRect; +Landroidx/compose/ui/geometry/MutableRectKt; Landroidx/compose/ui/geometry/Offset$Companion; Landroidx/compose/ui/geometry/Offset; Landroidx/compose/ui/geometry/OffsetKt; @@ -35484,6 +36052,7 @@ Landroidx/compose/ui/graphics/AndroidImageBitmap; Landroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline1; Landroidx/compose/ui/graphics/AndroidImageBitmap_androidKt; +Landroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt; Landroidx/compose/ui/graphics/AndroidPaint; Landroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings; Landroidx/compose/ui/graphics/AndroidPaint_androidKt; @@ -35728,9 +36297,12 @@ Landroidx/compose/ui/layout/FixedScale; Landroidx/compose/ui/layout/HorizontalAlignmentLine; Landroidx/compose/ui/layout/IntrinsicMeasurable; Landroidx/compose/ui/layout/IntrinsicMeasureScope; +Landroidx/compose/ui/layout/LayoutCoordinates$-CC; Landroidx/compose/ui/layout/LayoutCoordinates; +Landroidx/compose/ui/layout/LayoutCoordinatesKt; Landroidx/compose/ui/layout/LayoutInfo; Landroidx/compose/ui/layout/LookaheadCapablePlacementScope; +Landroidx/compose/ui/layout/LookaheadLayoutCoordinates; Landroidx/compose/ui/layout/Measurable; Landroidx/compose/ui/layout/MeasurePolicy; Landroidx/compose/ui/layout/MeasureResult; @@ -35799,6 +36371,7 @@ Landroidx/compose/ui/node/LayoutNode$LayoutState; Landroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy; Landroidx/compose/ui/node/LayoutNode$UsageByParent; Landroidx/compose/ui/node/LayoutNode$_foldedChildren$1; +Landroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1; Landroidx/compose/ui/node/LayoutNode; Landroidx/compose/ui/node/LayoutNodeAlignmentLines; Landroidx/compose/ui/node/LayoutNodeDrawScope; @@ -35869,6 +36442,7 @@ Landroidx/compose/ui/node/ParentDataModifierNodeKt; Landroidx/compose/ui/node/PlaceableResult; Landroidx/compose/ui/node/PointerInputModifierNode; Landroidx/compose/ui/node/RootForTest; +Landroidx/compose/ui/node/SemanticsModifierNode$-CC; Landroidx/compose/ui/node/SemanticsModifierNode; Landroidx/compose/ui/node/SemanticsModifierNodeKt; Landroidx/compose/ui/node/TailModifierNode; @@ -35910,12 +36484,16 @@ Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$Ext Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda2; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda3; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1; +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl; +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Companion; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$ComposeAccessibilityNodeProvider; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$onSendAccessibilityEvent$1; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$scheduleScrollEventIfNeededLambda$1; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat; +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1; +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt; Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ; Landroidx/compose/ui/platform/AndroidComposeViewTranslationCallback; @@ -35959,7 +36537,9 @@ Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1; Landroidx/compose/ui/platform/AndroidUiFrameClock; Landroidx/compose/ui/platform/AndroidUriHandler; Landroidx/compose/ui/platform/AndroidViewConfiguration; +Landroidx/compose/ui/platform/AndroidViewsHandler; Landroidx/compose/ui/platform/CalculateMatrixToWindow; +Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29; Landroidx/compose/ui/platform/ClipboardManager; Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1; @@ -36005,8 +36585,11 @@ Landroidx/compose/ui/platform/GraphicsLayerOwnerLayer; Landroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1; Landroidx/compose/ui/platform/InspectableValueKt; Landroidx/compose/ui/platform/InspectorValueInfo; +Landroidx/compose/ui/platform/InvertMatrixKt; Landroidx/compose/ui/platform/MotionDurationScaleImpl; Landroidx/compose/ui/platform/SemanticsNodeCopy; +Landroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds; +Landroidx/compose/ui/platform/SemanticsUtils_androidKt; Landroidx/compose/ui/platform/SoftwareKeyboardController; Landroidx/compose/ui/platform/TextToolbar; Landroidx/compose/ui/platform/TextToolbarStatus; @@ -36024,6 +36607,7 @@ Landroidx/compose/ui/platform/ViewCompositionStrategy; Landroidx/compose/ui/platform/ViewCompositionStrategy_androidKt$$ExternalSyntheticLambda0; Landroidx/compose/ui/platform/ViewCompositionStrategy_androidKt$installForLifecycle$2; Landroidx/compose/ui/platform/ViewCompositionStrategy_androidKt; +Landroidx/compose/ui/platform/ViewConfiguration$-CC; Landroidx/compose/ui/platform/ViewConfiguration; Landroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1; Landroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1; @@ -36059,6 +36643,7 @@ Landroidx/compose/ui/platform/WrappedComposition; Landroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods; Landroidx/compose/ui/platform/Wrapper_androidKt; +Landroidx/compose/ui/platform/accessibility/CollectionInfo_androidKt; Landroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback; Landroidx/compose/ui/platform/coreshims/ContentCaptureSessionCompat; Landroidx/compose/ui/platform/coreshims/ViewCompatShims$Api29Impl; @@ -36077,18 +36662,27 @@ Landroidx/compose/ui/res/StringResources_androidKt; Landroidx/compose/ui/res/VectorResources_androidKt; Landroidx/compose/ui/scrollcapture/ComposeScrollCaptureCallback$ScrollCaptureSessionListener; Landroidx/compose/ui/scrollcapture/ScrollCapture; +Landroidx/compose/ui/semantics/AccessibilityAction; Landroidx/compose/ui/semantics/AppendedSemanticsElement; +Landroidx/compose/ui/semantics/CollectionInfo; Landroidx/compose/ui/semantics/CoreSemanticsModifierNode; Landroidx/compose/ui/semantics/EmptySemanticsElement; Landroidx/compose/ui/semantics/EmptySemanticsModifier; +Landroidx/compose/ui/semantics/LiveRegionMode; +Landroidx/compose/ui/semantics/ProgressBarRangeInfo; Landroidx/compose/ui/semantics/Role$Companion; Landroidx/compose/ui/semantics/Role; +Landroidx/compose/ui/semantics/ScrollAxisRange; Landroidx/compose/ui/semantics/SemanticsActions; Landroidx/compose/ui/semantics/SemanticsConfiguration; Landroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1; Landroidx/compose/ui/semantics/SemanticsConfigurationKt; Landroidx/compose/ui/semantics/SemanticsModifier; Landroidx/compose/ui/semantics/SemanticsModifierKt; +Landroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1; +Landroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1; +Landroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1; +Landroidx/compose/ui/semantics/SemanticsNode$parent$2; Landroidx/compose/ui/semantics/SemanticsNode; Landroidx/compose/ui/semantics/SemanticsNodeKt; Landroidx/compose/ui/semantics/SemanticsOwner; @@ -36109,6 +36703,7 @@ Landroidx/compose/ui/semantics/SemanticsPropertiesKt; Landroidx/compose/ui/semantics/SemanticsPropertyKey$1; Landroidx/compose/ui/semantics/SemanticsPropertyKey; Landroidx/compose/ui/semantics/SemanticsPropertyReceiver; +Landroidx/compose/ui/state/ToggleableState; Landroidx/compose/ui/text/AndroidParagraph; Landroidx/compose/ui/text/AndroidParagraph_androidKt; Landroidx/compose/ui/text/AndroidTextStyle_androidKt; @@ -36304,6 +36899,7 @@ Landroidx/compose/ui/text/intl/LocaleList$Companion; Landroidx/compose/ui/text/intl/LocaleList; Landroidx/compose/ui/text/intl/PlatformLocaleDelegate; Landroidx/compose/ui/text/intl/PlatformLocaleKt; +Landroidx/compose/ui/text/platform/AndroidAccessibilitySpannableString_androidKt; Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1; Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt; Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1; @@ -36379,6 +36975,9 @@ Landroidx/compose/ui/unit/DensityKt; Landroidx/compose/ui/unit/DensityWithConverter; Landroidx/compose/ui/unit/Dp$Companion; Landroidx/compose/ui/unit/Dp; +Landroidx/compose/ui/unit/DpKt; +Landroidx/compose/ui/unit/DpSize$Companion; +Landroidx/compose/ui/unit/DpSize; Landroidx/compose/ui/unit/FontScaling$-CC; Landroidx/compose/ui/unit/FontScaling; Landroidx/compose/ui/unit/IntOffset$Companion; @@ -36398,6 +36997,8 @@ Landroidx/compose/ui/unit/fontscaling/FontScaleConverter; Landroidx/compose/ui/unit/fontscaling/FontScaleConverterFactory; Landroidx/compose/ui/unit/fontscaling/FontScaleConverterTable$Companion; Landroidx/compose/ui/unit/fontscaling/FontScaleConverterTable; +Landroidx/compose/ui/util/ListUtilsKt; +Landroidx/compose/ui/viewinterop/AndroidViewHolder; Landroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0; Landroidx/constraintlayout/core/ArrayLinkedVariables; Landroidx/constraintlayout/core/ArrayRow$ArrayRowVariables; @@ -36408,7 +37009,6 @@ Landroidx/constraintlayout/core/LinearSystem$ValuesRow; Landroidx/constraintlayout/core/LinearSystem; Landroidx/constraintlayout/core/Pools$Pool; Landroidx/constraintlayout/core/Pools$SimplePool; -Landroidx/constraintlayout/core/PriorityGoalRow$1; Landroidx/constraintlayout/core/PriorityGoalRow$GoalVariableAccessor; Landroidx/constraintlayout/core/PriorityGoalRow; Landroidx/constraintlayout/core/SolverVariable$Type; @@ -36581,7 +37181,10 @@ Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl30; Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl; Landroidx/core/view/SoftwareKeyboardControllerCompat; Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda1; +Landroidx/core/view/ViewCompat$1; Landroidx/core/view/ViewCompat$2; +Landroidx/core/view/ViewCompat$3; +Landroidx/core/view/ViewCompat$4; Landroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager; Landroidx/core/view/ViewCompat$AccessibilityViewProperty; Landroidx/core/view/ViewCompat$Api20Impl; @@ -36590,12 +37193,18 @@ Landroidx/core/view/ViewCompat$Api21Impl; Landroidx/core/view/ViewCompat$Api26Impl; Landroidx/core/view/ViewCompat$Api28Impl; Landroidx/core/view/ViewCompat$Api29Impl; +Landroidx/core/view/ViewCompat$Api30Impl; Landroidx/core/view/ViewCompat; Landroidx/core/view/ViewConfigurationCompat$Api26Impl; Landroidx/core/view/ViewConfigurationCompat$Api28Impl; Landroidx/core/view/ViewConfigurationCompat; Landroidx/core/view/ViewKt$doOnPreDraw$1; Landroidx/core/view/ViewKt; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline13; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline14; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline3; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline4; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline11; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline13; @@ -36614,6 +37223,9 @@ Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActio Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline6; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline7; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19; Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi26; Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; @@ -36847,6 +37459,7 @@ Landroidx/lifecycle/Transformations$switchMap$1$1; Landroidx/lifecycle/Transformations$switchMap$1; Landroidx/lifecycle/Transformations; Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelKt; Landroidx/lifecycle/ViewModelLazy; Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion$APPLICATION_KEY$1; Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion; @@ -36882,6 +37495,8 @@ Landroidx/lifecycle/viewmodel/R$id; Landroidx/lifecycle/viewmodel/ViewModelInitializer; Landroidx/lifecycle/viewmodel/ViewModelProviderImpl; Landroidx/lifecycle/viewmodel/ViewModelProviderImpl_androidKt; +Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; +Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScopeKt; Landroidx/lifecycle/viewmodel/internal/SynchronizedObject; Landroidx/lifecycle/viewmodel/internal/ViewModelImpl; Landroidx/lifecycle/viewmodel/internal/ViewModelProviders$ViewModelKey; @@ -39240,6 +39855,9 @@ Lio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$1; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$BaseEmitter; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$LatestAsyncEmitter; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate; +Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceEmitter; +Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber; +Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged$DistinctUntilChangedSubscriber; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach$DoOnEachSubscriber; @@ -39352,6 +39970,8 @@ Lio/reactivex/rxjava3/internal/util/NotificationLite; Lio/reactivex/rxjava3/internal/util/OpenHashSet; Lio/reactivex/rxjava3/internal/util/Pow2; Lio/reactivex/rxjava3/kotlin/DisposableKt; +Lio/reactivex/rxjava3/kotlin/Flowables$combineLatest$2; +Lio/reactivex/rxjava3/kotlin/Flowables; Lio/reactivex/rxjava3/kotlin/SubscribersKt$onCompleteStub$1; Lio/reactivex/rxjava3/kotlin/SubscribersKt$onErrorStub$1; Lio/reactivex/rxjava3/kotlin/SubscribersKt$onNextStub$1; @@ -39376,6 +39996,7 @@ Lio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable; Lio/reactivex/rxjava3/subjects/PublishSubject; Lio/reactivex/rxjava3/subjects/SerializedSubject; Lio/reactivex/rxjava3/subjects/Subject; +Lio/reactivex/rxjava3/subscribers/SerializedSubscriber; Lj$/com/android/tools/r8/a; Lj$/lang/a; Lj$/time/DayOfWeek; @@ -39585,6 +40206,7 @@ Lkotlin/LazyKt__LazyKt; Lkotlin/LazyThreadSafetyMode; Lkotlin/Metadata; Lkotlin/NoWhenBranchMatchedException; +Lkotlin/NotImplementedError; Lkotlin/Pair; Lkotlin/Result$Companion; Lkotlin/Result$Failure; @@ -40915,8 +41537,6 @@ Lkotlin/time/DurationUnitKt__DurationUnitJvmKt; Lkotlinx/collections/immutable/ExtensionsKt; Lkotlinx/collections/immutable/ImmutableCollection; Lkotlinx/collections/immutable/ImmutableSet; -Lkotlinx/collections/immutable/PersistentMap$Builder; -Lkotlinx/collections/immutable/PersistentMap; Lkotlinx/collections/immutable/PersistentSet$Builder; Lkotlinx/collections/immutable/PersistentSet; Lkotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap$Companion; @@ -41240,6 +41860,7 @@ Lokhttp3/ConnectionSpec; Lokhttp3/CookieJar$Companion$NoCookies; Lokhttp3/CookieJar$Companion; Lokhttp3/CookieJar; +Lokhttp3/Credentials; Lokhttp3/Dispatcher; Lokhttp3/Dns$Companion$DnsSystem; Lokhttp3/Dns$Companion; @@ -41661,8 +42282,6 @@ Lorg/signal/core/util/Stopwatch; Lorg/signal/core/util/StreamUtil; Lorg/signal/core/util/StringExtensionsKt; Lorg/signal/core/util/StringSerializer; -Lorg/signal/core/util/StringUtil$$ExternalSyntheticBackport0; -Lorg/signal/core/util/StringUtil$$ExternalSyntheticBackport1; Lorg/signal/core/util/StringUtil; Lorg/signal/core/util/ThreadUtil; Lorg/signal/core/util/UpdateAllBuilderPart1; @@ -41934,6 +42553,7 @@ Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda69; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda6; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda70; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda71; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda72; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda8; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda9; @@ -42026,6 +42646,8 @@ Lorg/thoughtcrime/securesms/banner/banners/DozeBanner; Lorg/thoughtcrime/securesms/banner/banners/DozeBannerKt$Banner$3$1; Lorg/thoughtcrime/securesms/banner/banners/DozeBannerKt$Banner$4; Lorg/thoughtcrime/securesms/banner/banners/DozeBannerKt; +Lorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner$RestoreProgressBannerListener; +Lorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner$dataFlow$2; Lorg/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner; Lorg/thoughtcrime/securesms/banner/banners/OutdatedBuildBanner$Companion; Lorg/thoughtcrime/securesms/banner/banners/OutdatedBuildBanner; @@ -42082,6 +42704,7 @@ Lorg/thoughtcrime/securesms/components/QuoteView; Lorg/thoughtcrime/securesms/components/RatingManager; Lorg/thoughtcrime/securesms/components/RecyclerViewFastScroller$FastScrollAdapter; Lorg/thoughtcrime/securesms/components/SharedContactView$EventListener; +Lorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport2; Lorg/thoughtcrime/securesms/components/TypingIndicatorView; Lorg/thoughtcrime/securesms/components/TypingStatusRepository; Lorg/thoughtcrime/securesms/components/ViewBinderDelegate$1; @@ -42124,6 +42747,10 @@ Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$ Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1; Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1; Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton; +Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType$Companion; +Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord$FolderType; +Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord; +Lorg/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository; Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository$getProfiles$1; Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository; Lorg/thoughtcrime/securesms/components/settings/app/subscription/completed/InAppPaymentsBottomSheetDelegate$Companion; @@ -42190,12 +42817,15 @@ Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$1; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$2; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$3; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$4; +Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$5; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks; +Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ChatTypeModel; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$Companion; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplaySecondaryInformation; @@ -42246,6 +42876,7 @@ Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel$controller$1; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel$data$1; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel$safetyNumberRepository$2; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel; +Lorg/thoughtcrime/securesms/contacts/paged/collections/ContactSearchIterator; Lorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery; Lorg/thoughtcrime/securesms/contactshare/Contact; Lorg/thoughtcrime/securesms/contactshare/ContactUtil; @@ -42311,6 +42942,10 @@ Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsD Lorg/thoughtcrime/securesms/conversation/v2/items/InteractiveConversationElement; Lorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout; +Lorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter$Callbacks; +Lorg/thoughtcrime/securesms/conversationlist/ChatFolderAdapter; +Lorg/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel; Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener; Lorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior$Callback; Lorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior; @@ -42319,6 +42954,7 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$$ExternalSy Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationDiffCallback; Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$EmptyFolderViewHolder$OnFolderSettingsClickListener; Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$OnConversationClickListener; Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter; @@ -42326,8 +42962,6 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListArchiveItemDecorati Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$UnarchivedConversationListDataSource; Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticBackport0; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda13; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda14; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda15; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda16; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda17; @@ -42336,41 +42970,45 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalS Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda20; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda21; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda22; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda23; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda37; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda38; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda39; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda3; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda42; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda43; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda40; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda44; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda45; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda46; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda47; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda48; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda49; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda50; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda51; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda53; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda55; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda57; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda5; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda61; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda64; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda6; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda71; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda78; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda74; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda81; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda8; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda9; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$10; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$2; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$5; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$9; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$6; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ArchiveListenerCallback; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$Callback; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ContactSearchClickCallbacks; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda13; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7; @@ -42397,11 +43035,15 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$4; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$5; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$6; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$7; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$8; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Companion; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Factory; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$chatFolderState$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$conversationsState$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$filterRequestState$1; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1$1; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$loadCurrentFolders$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onVisible$1$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$pagedData$1; @@ -42497,16 +43139,22 @@ Lorg/thoughtcrime/securesms/database/CdsTable$Companion; Lorg/thoughtcrime/securesms/database/CdsTable; Lorg/thoughtcrime/securesms/database/ChatColorsTable$Companion; Lorg/thoughtcrime/securesms/database/ChatColorsTable; +Lorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderMembershipTable; +Lorg/thoughtcrime/securesms/database/ChatFolderTables$ChatFolderTable; +Lorg/thoughtcrime/securesms/database/ChatFolderTables$Companion; +Lorg/thoughtcrime/securesms/database/ChatFolderTables$MembershipType; +Lorg/thoughtcrime/securesms/database/ChatFolderTables; Lorg/thoughtcrime/securesms/database/DatabaseMonitor; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda15; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda16; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda19; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda18; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda21; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda31; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda44; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda8; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda32; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda33; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda47; Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer; Lorg/thoughtcrime/securesms/database/DatabaseObserver; Lorg/thoughtcrime/securesms/database/DatabaseTable; @@ -42528,6 +43176,7 @@ Lorg/thoughtcrime/securesms/database/GroupReceiptTable; Lorg/thoughtcrime/securesms/database/GroupTable$Companion; Lorg/thoughtcrime/securesms/database/GroupTable$MembershipTable$Companion; Lorg/thoughtcrime/securesms/database/GroupTable$MembershipTable; +Lorg/thoughtcrime/securesms/database/GroupTable$Reader; Lorg/thoughtcrime/securesms/database/GroupTable$ShowAsStoryState$Companion; Lorg/thoughtcrime/securesms/database/GroupTable$ShowAsStoryState; Lorg/thoughtcrime/securesms/database/GroupTable; @@ -42542,11 +43191,9 @@ Lorg/thoughtcrime/securesms/database/InAppPaymentTable$Companion; Lorg/thoughtcrime/securesms/database/InAppPaymentTable$State$Companion; Lorg/thoughtcrime/securesms/database/InAppPaymentTable$State; Lorg/thoughtcrime/securesms/database/InAppPaymentTable; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/JobDatabase$Companion; Lorg/thoughtcrime/securesms/database/JobDatabase$getMostEligibleJobInQueue$1; Lorg/thoughtcrime/securesms/database/JobDatabase; -Lorg/thoughtcrime/securesms/database/KeyValueDatabase$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/KeyValueDatabase$1; Lorg/thoughtcrime/securesms/database/KeyValueDatabase$Type; Lorg/thoughtcrime/securesms/database/KeyValueDatabase; @@ -42568,7 +43215,6 @@ Lorg/thoughtcrime/securesms/database/LogDatabase$logs$2; Lorg/thoughtcrime/securesms/database/LogDatabase; Lorg/thoughtcrime/securesms/database/MediaTable$Companion; Lorg/thoughtcrime/securesms/database/MediaTable; -Lorg/thoughtcrime/securesms/database/MegaphoneDatabase$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/MegaphoneDatabase; Lorg/thoughtcrime/securesms/database/MentionTable$Companion; Lorg/thoughtcrime/securesms/database/MentionTable; @@ -42600,6 +43246,7 @@ Lorg/thoughtcrime/securesms/database/MessageType; Lorg/thoughtcrime/securesms/database/MessageTypes$-CC; Lorg/thoughtcrime/securesms/database/MessageTypes; Lorg/thoughtcrime/securesms/database/NameCollisionTables$Companion; +Lorg/thoughtcrime/securesms/database/NameCollisionTables$NameCollisionMembershipTable; Lorg/thoughtcrime/securesms/database/NameCollisionTables; Lorg/thoughtcrime/securesms/database/NoExternalStorageException; Lorg/thoughtcrime/securesms/database/NoSuchMessageException; @@ -42669,6 +43316,8 @@ Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver; +Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFolders$2; +Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$chatFoldersFlowable$1; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationListFlowable$1; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$notificationProfiles$2; @@ -42982,6 +43631,7 @@ Lorg/thoughtcrime/securesms/jobmanager/Constraint; Lorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator; Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier; Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver; +Lorg/thoughtcrime/securesms/jobmanager/CoroutineJob; Lorg/thoughtcrime/securesms/jobmanager/ExecutorFactory; Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler; @@ -42994,6 +43644,7 @@ Lorg/thoughtcrime/securesms/jobmanager/Job$Result; Lorg/thoughtcrime/securesms/jobmanager/Job; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda11; +Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda12; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda15; @@ -43010,12 +43661,13 @@ Lorg/thoughtcrime/securesms/jobmanager/JobController$Callback; Lorg/thoughtcrime/securesms/jobmanager/JobController; Lorg/thoughtcrime/securesms/jobmanager/JobInstantiator; Lorg/thoughtcrime/securesms/jobmanager/JobLogger; -Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda11; +Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda10; +Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda12; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda13; +Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda18; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda19; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda4; -Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda9; @@ -43046,14 +43698,15 @@ Lorg/thoughtcrime/securesms/jobmanager/Scheduler; Lorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint$Factory; Lorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint; Lorg/thoughtcrime/securesms/jobmanager/impl/BackoffUtil; +Lorg/thoughtcrime/securesms/jobmanager/impl/BatteryNotLowConstraint$Factory; Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$LegacyServiceStateListener; Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver$ServiceStateListenerApi31; Lorg/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver; Lorg/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraint$Factory; Lorg/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver; +Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver$1; +Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingAndBatteryIsNotLowConstraintObserver; Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraint$Factory; -Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver$1; -Lorg/thoughtcrime/securesms/jobmanager/impl/ChargingConstraintObserver; Lorg/thoughtcrime/securesms/jobmanager/impl/DataRestoreConstraint$Factory; Lorg/thoughtcrime/securesms/jobmanager/impl/DataRestoreConstraintObserver; Lorg/thoughtcrime/securesms/jobmanager/impl/DecryptionsDrainedConstraint$Factory; @@ -43111,9 +43764,13 @@ Lorg/thoughtcrime/securesms/jobs/AutomaticSessionResetJob$Factory; Lorg/thoughtcrime/securesms/jobs/AvatarGroupsV1DownloadJob$Factory; Lorg/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob$Factory; Lorg/thoughtcrime/securesms/jobs/BackfillDigestJob$Factory; +Lorg/thoughtcrime/securesms/jobs/BackfillDigestsForDataFileJob$Factory; Lorg/thoughtcrime/securesms/jobs/BackupMessagesJob$Factory; Lorg/thoughtcrime/securesms/jobs/BackupRestoreJob$Factory; Lorg/thoughtcrime/securesms/jobs/BackupRestoreMediaJob$Factory; +Lorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Companion; +Lorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob$Factory; +Lorg/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob; Lorg/thoughtcrime/securesms/jobs/BaseJob; Lorg/thoughtcrime/securesms/jobs/BoostReceiptRequestResponseJob$Factory; Lorg/thoughtcrime/securesms/jobs/BuildExpirationConfirmationJob$Factory; @@ -43134,6 +43791,7 @@ Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory; Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1; Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$2; Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob; +Lorg/thoughtcrime/securesms/jobs/DeleteAbandonedAttachmentsJob$Factory; Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory; Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob; Lorg/thoughtcrime/securesms/jobs/DonationReceiptRedemptionJob$Factory; @@ -43158,6 +43816,7 @@ Lorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory$Companion; Lorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory; Lorg/thoughtcrime/securesms/jobs/FailingJob$Factory; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda5; @@ -43171,6 +43830,7 @@ Lorg/thoughtcrime/securesms/jobs/FastJobStorage$getNextEligibleJob$2; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$getNextEligibleJob$3; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$markJobAsRunning$1; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$markJobAsRunning$2; +Lorg/thoughtcrime/securesms/jobs/FastJobStorage$placeJobInEligibleList$1$1; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$replaceJobInEligibleList$2; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$special$$inlined$compareBy$1; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$updateAllJobsToBePending$1; @@ -43290,7 +43950,9 @@ Lorg/thoughtcrime/securesms/jobs/ResetSvrGuessCountJob$Factory; Lorg/thoughtcrime/securesms/jobs/RestoreAttachmentJob$Factory; Lorg/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob$Factory; Lorg/thoughtcrime/securesms/jobs/RestoreLocalAttachmentJob$Factory; +Lorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Companion; Lorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob$Factory; +Lorg/thoughtcrime/securesms/jobs/RestoreOptimizedMediaJob; Lorg/thoughtcrime/securesms/jobs/ResumableUploadSpecJob$Factory; Lorg/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob$Factory; Lorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion; @@ -43406,6 +44068,7 @@ Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; Lorg/thoughtcrime/securesms/keyvalue/SettingsValues; Lorg/thoughtcrime/securesms/keyvalue/SignalStore$Companion; Lorg/thoughtcrime/securesms/keyvalue/SignalStore; +Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate$flow$1; Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate; Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt; Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValues; @@ -43534,6 +44197,7 @@ Lorg/thoughtcrime/securesms/migrations/AttachmentHashBackfillMigrationJob$Factor Lorg/thoughtcrime/securesms/migrations/AttributesMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/AvatarIdRemovalMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/AvatarMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/BackfillDigestsForDuplicatesMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/BackfillDigestsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/BackupJitterMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/BackupNotificationMigrationJob$Factory; @@ -43582,6 +44246,7 @@ Lorg/thoughtcrime/securesms/migrations/TrimByLengthSettingsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/UpdateSmsJobsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/UserNotificationMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/UuidMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/WallpaperCleanupMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/WallpaperStorageMigrationJob$Factory; Lorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$AttachmentModel; Lorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$Factory; @@ -43717,7 +44382,6 @@ Lorg/thoughtcrime/securesms/recipients/Recipient$HiddenState$Companion; Lorg/thoughtcrime/securesms/recipients/Recipient$HiddenState; Lorg/thoughtcrime/securesms/recipients/Recipient$callRingtone$2; Lorg/thoughtcrime/securesms/recipients/Recipient$combinedAboutAndEmoji$2; -Lorg/thoughtcrime/securesms/recipients/Recipient$filteredAbout$2; Lorg/thoughtcrime/securesms/recipients/Recipient$hasViewedStory$1; Lorg/thoughtcrime/securesms/recipients/Recipient$messageRingtone$2; Lorg/thoughtcrime/securesms/recipients/Recipient$shouldHideStory$1; @@ -43729,6 +44393,7 @@ Lorg/thoughtcrime/securesms/recipients/RecipientCreator$create$2; Lorg/thoughtcrime/securesms/recipients/RecipientCreator; Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver; Lorg/thoughtcrime/securesms/recipients/RecipientId$1; +Lorg/thoughtcrime/securesms/recipients/RecipientId$InvalidLongRecipientIdError; Lorg/thoughtcrime/securesms/recipients/RecipientId$Serializer; Lorg/thoughtcrime/securesms/recipients/RecipientId; Lorg/thoughtcrime/securesms/recipients/RecipientIdCache$1; @@ -43901,6 +44566,7 @@ Lorg/thoughtcrime/securesms/util/MediaUtil; Lorg/thoughtcrime/securesms/util/MessageRecordUtil; Lorg/thoughtcrime/securesms/util/NameUtil; Lorg/thoughtcrime/securesms/util/NetworkUtil; +Lorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda2; @@ -44078,6 +44744,7 @@ Lorg/whispersystems/signalservice/api/payments/Money; Lorg/whispersystems/signalservice/api/profiles/ProfileAndCredential; Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities; Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType; +Lorg/whispersystems/signalservice/api/push/DistributionId; Lorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion; Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; Lorg/whispersystems/signalservice/api/push/ServiceId$Companion; @@ -44213,7 +44880,6 @@ PLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/vi PLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;->()V PLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->getAccessibilityClassName()Ljava/lang/CharSequence; -PLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z PLandroidx/appcompat/view/menu/ActionMenuItemView;->prefersCondensedTitle()Z PLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V PLandroidx/appcompat/view/menu/BaseMenuPresenter;->addItemView(Landroid/view/View;I)V @@ -44234,12 +44900,10 @@ PLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I PLandroidx/appcompat/view/menu/MenuItemImpl;->getSubMenu()Landroid/view/SubMenu; PLandroidx/appcompat/view/menu/MenuItemImpl;->getSupportActionProvider()Landroidx/core/view/ActionProvider; PLandroidx/appcompat/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence; -PLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleForItemView(Landroidx/appcompat/view/menu/MenuView$ItemView;)Ljava/lang/CharSequence; PLandroidx/appcompat/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence; PLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroidx/core/internal/view/SupportMenuItem; -PLandroidx/appcompat/view/menu/MenuItemImpl;->setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setSubMenu(Landroidx/appcompat/view/menu/SubMenuBuilder;)V @@ -44256,7 +44920,6 @@ PLandroidx/appcompat/widget/ActionMenuPresenter;->isOverflowMenuShowing()Z PLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ActionMenuView;->dismissPopupMenus()V PLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; -PLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; PLandroidx/appcompat/widget/ActionMenuView;->isOverflowMenuShowing()Z PLandroidx/appcompat/widget/ActionMenuView;->onDetachedFromWindow()V PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->()V @@ -44302,7 +44965,6 @@ PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline3;->m PLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z PLandroidx/appcompat/widget/ForwardingListener;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/appcompat/widget/LinearLayoutCompat;->getBaseline()I -PLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V PLandroidx/appcompat/widget/ResourceManagerInternal;->addTintListToCache(Landroid/content/Context;ILandroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/ResourceManagerInternal;->getTintMode(I)Landroid/graphics/PorterDuff$Mode; PLandroidx/appcompat/widget/SearchView$10;->(Landroidx/appcompat/widget/SearchView;)V @@ -44356,11 +45018,6 @@ PLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(Landroid/content/res/Col PLandroidx/collection/ArraySet;->indexOf(Ljava/lang/Object;)I PLandroidx/collection/ArraySet;->remove(Ljava/lang/Object;)Z PLandroidx/collection/CircularArray;->popFirst()Ljava/lang/Object; -PLandroidx/collection/IntIntMap;->findKeyIndex(I)I -PLandroidx/collection/IntIntMap;->getOrDefault(II)I -PLandroidx/collection/IntObjectMap;->contains(I)Z -PLandroidx/collection/MutableIntObjectMap;->adjustStorage()V -PLandroidx/collection/MutableIntObjectMap;->resizeStorage(I)V PLandroidx/collection/MutableScatterSet;->adjustStorage()V PLandroidx/collection/MutableScatterSet;->plusAssign(Ljava/lang/Object;)V PLandroidx/collection/MutableScatterSet;->resizeStorage(I)V @@ -44368,27 +45025,9 @@ PLandroidx/collection/ScatterMap;->isNotEmpty()Z PLandroidx/collection/SimpleArrayMap;->equals(Ljava/lang/Object;)Z PLandroidx/collection/SparseArrayCompat;->append(ILjava/lang/Object;)V PLandroidx/collection/SparseArrayCompat;->clear()V -PLandroidx/compose/foundation/AbstractClickableNode$applySemantics$1;->(Landroidx/compose/foundation/AbstractClickableNode;)V -PLandroidx/compose/foundation/AbstractClickableNode;->applyAdditionalSemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/foundation/AbstractClickableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V PLandroidx/compose/foundation/AbstractClickableNode;->disposeInteractions()V -PLandroidx/compose/foundation/AbstractClickableNode;->getShouldClearDescendantSemantics()Z -PLandroidx/compose/foundation/AbstractClickableNode;->getShouldMergeDescendantSemantics()Z PLandroidx/compose/foundation/AbstractClickableNode;->onDetach()V -PLandroidx/compose/foundation/FocusableNode$applySemantics$1;->(Landroidx/compose/foundation/FocusableNode;)V -PLandroidx/compose/foundation/FocusableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$1;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$2;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$3;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$4;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;)V -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getShouldClearDescendantSemantics()Z -PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getShouldMergeDescendantSemantics()Z PLandroidx/compose/material/ripple/AndroidRippleNode;->onDetach()V -PLandroidx/compose/material3/ButtonKt$Button$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/material3/ButtonKt$Button$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/material3/IconKt$Icon$semantics$1$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/material3/IconKt$Icon$semantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/AbstractApplier;->clear()V PLandroidx/compose/runtime/ComposableSingletons$CompositionKt;->getLambda-2$runtime_release()Lkotlin/jvm/functions/Function2; PLandroidx/compose/runtime/ComposerImpl;->deactivate$runtime_release()V @@ -44464,62 +45103,20 @@ PLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->onViewDetach PLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->updateBuffersOnDisappeared(Landroidx/compose/ui/semantics/SemanticsNode;)V PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->onDetach()V PLandroidx/compose/ui/focus/FocusTargetNode;->onDetach()V -PLandroidx/compose/ui/geometry/MutableRect;->()V -PLandroidx/compose/ui/geometry/MutableRect;->(FFFF)V -PLandroidx/compose/ui/geometry/MutableRect;->getBottom()F -PLandroidx/compose/ui/geometry/MutableRect;->getLeft()F -PLandroidx/compose/ui/geometry/MutableRect;->getRight()F -PLandroidx/compose/ui/geometry/MutableRect;->getTop()F -PLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z -PLandroidx/compose/ui/geometry/MutableRect;->setRight(F)V -PLandroidx/compose/ui/geometry/MutableRect;->setTop(F)V -PLandroidx/compose/ui/geometry/MutableRectKt;->toRect(Landroidx/compose/ui/geometry/MutableRect;)Landroidx/compose/ui/geometry/Rect; -PLandroidx/compose/ui/geometry/OffsetKt;->isUnspecified-k-4lQ0M(J)Z -PLandroidx/compose/ui/geometry/SizeKt;->getCenter-uvyYCjk(J)J PLandroidx/compose/ui/graphics/AndroidGraphicsContext;->releaseGraphicsLayer(Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V -PLandroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt;->setFrom-tU-YjHk([FLandroid/graphics/Matrix;)V -PLandroidx/compose/ui/graphics/Matrix;->reset-impl([F)V -PLandroidx/compose/ui/graphics/Matrix;->rotateX-impl([FF)V -PLandroidx/compose/ui/graphics/Matrix;->rotateY-impl([FF)V -PLandroidx/compose/ui/graphics/Matrix;->scale-impl$default([FFFFILjava/lang/Object;)V -PLandroidx/compose/ui/graphics/MatrixKt;->access$dot-p89u6pk([FI[FI)F -PLandroidx/compose/ui/graphics/MatrixKt;->dot-p89u6pk([FI[FI)F PLandroidx/compose/ui/graphics/layer/ChildLayerDependenciesTracker;->access$setDependency$p(Landroidx/compose/ui/graphics/layer/ChildLayerDependenciesTracker;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->discardContentIfReleasedAndHaveNoParentLayerUsages()V PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->discardDisplayList$ui_graphics_release()V -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getPivotOffset-F1C5BW0()J -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getRotationX()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getRotationY()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getRotationZ()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getScaleX()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getScaleY()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getTranslationX()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getTranslationY()F PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->onRemovedFromParentLayer()V PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->release$ui_graphics_release()V PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29$$ExternalSyntheticApiModelOutline13;->m(Landroid/graphics/RenderNode;)V PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->discardDisplayList()V -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getRotationX()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getRotationY()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getRotationZ()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getScaleX()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getScaleY()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getTranslationX()F -PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getTranslationY()F -PLandroidx/compose/ui/layout/LayoutCoordinates$-CC;->localBoundingBoxOf$default(Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/layout/LayoutCoordinates;ZILjava/lang/Object;)Landroidx/compose/ui/geometry/Rect; -PLandroidx/compose/ui/layout/LayoutCoordinatesKt;->boundsInRoot(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/geometry/Rect; -PLandroidx/compose/ui/layout/LayoutCoordinatesKt;->findRootCoordinates(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/layout/LayoutCoordinates; -PLandroidx/compose/ui/layout/Placeable;->getMeasuredHeight()I -PLandroidx/compose/ui/layout/Placeable;->getMeasuredWidth()I PLandroidx/compose/ui/node/AlignmentLines;->reset$ui_release()V PLandroidx/compose/ui/node/DelegatingNode;->markAsDetached$ui_release()V PLandroidx/compose/ui/node/DelegatingNode;->runDetachLifecycle$ui_release()V PLandroidx/compose/ui/node/DelegatingNode;->undelegate(Landroidx/compose/ui/node/DelegatableNode;)V PLandroidx/compose/ui/node/DepthSortedSetsForDifferentPasses;->remove(Landroidx/compose/ui/node/LayoutNode;)Z -PLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1;->(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/internal/Ref$ObjectRef;)V -PLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/node/LayoutNode;->access$setIgnoreRemeasureRequests$p(Landroidx/compose/ui/node/LayoutNode;Z)V -PLandroidx/compose/ui/node/LayoutNode;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; PLandroidx/compose/ui/node/LayoutNode;->onChildRemoved(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/LayoutNode;->onRelease()V PLandroidx/compose/ui/node/LayoutNode;->removeAll$ui_release()V @@ -44533,94 +45130,33 @@ PLandroidx/compose/ui/node/MutableVectorWithMutationTracking;->get(I)Ljava/lang/ PLandroidx/compose/ui/node/MutableVectorWithMutationTracking;->getSize()I PLandroidx/compose/ui/node/NodeChain;->markAsDetached$ui_release()V PLandroidx/compose/ui/node/NodeChain;->runDetachLifecycle$ui_release()V -PLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V -PLandroidx/compose/ui/node/NodeCoordinator;->calculateMinimumTouchTargetPadding-E7KxVPU(J)J -PLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator; -PLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J -PLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; -PLandroidx/compose/ui/node/NodeCoordinator;->getRectCache()Landroidx/compose/ui/geometry/MutableRect; -PLandroidx/compose/ui/node/NodeCoordinator;->isAttached()Z -PLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z -PLandroidx/compose/ui/node/NodeCoordinator;->onCoordinatesUsed$ui_release()V PLandroidx/compose/ui/node/NodeCoordinator;->onRelease()V -PLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release$default(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;ZZILjava/lang/Object;)V PLandroidx/compose/ui/node/NodeCoordinator;->releaseLayer()V -PLandroidx/compose/ui/node/NodeCoordinator;->toCoordinator(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/node/NodeCoordinator; -PLandroidx/compose/ui/node/NodeCoordinator;->touchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; PLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateRemovedNode(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/ui/node/OnPositionedDispatcher;->remove(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/OwnerSnapshotObserver$clearInvalidObservations$1;->()V PLandroidx/compose/ui/node/OwnerSnapshotObserver$clearInvalidObservations$1;->()V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->clearInvalidObservations$ui_release()V -PLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeSemanticsReads$ui_release(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->stopObserving$ui_release()V -PLandroidx/compose/ui/node/SemanticsModifierNode$-CC;->$default$getShouldClearDescendantSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)Z -PLandroidx/compose/ui/node/SemanticsModifierNode$-CC;->$default$getShouldMergeDescendantSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)Z -PLandroidx/compose/ui/node/SemanticsModifierNodeKt;->getUseMinimumTouchTarget(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Z -PLandroidx/compose/ui/node/SemanticsModifierNodeKt;->touchBoundsInRoot(Landroidx/compose/ui/Modifier$Node;Z)Landroidx/compose/ui/geometry/Rect; PLandroidx/compose/ui/node/TailModifierNode;->onDetach()V PLandroidx/compose/ui/node/UiApplier;->onClear()V PLandroidx/compose/ui/platform/AbstractComposeView;->disposeComposition()V -PLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;)V -PLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;I)V -PLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/compose/ui/platform/AndroidComposeView;->clearChildInvalidObservations(Landroid/view/ViewGroup;)V -PLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui_release()Landroidx/compose/ui/platform/AndroidViewsHandler; PLandroidx/compose/ui/platform/AndroidComposeView;->onDetach(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/platform/AndroidComposeView;->onDetachedFromWindow()V PLandroidx/compose/ui/platform/AndroidComposeView;->onPause(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/compose/ui/platform/AndroidComposeView;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowViewTransforms()V PLandroidx/compose/ui/platform/AndroidComposeView;->recycle$ui_release(Landroidx/compose/ui/node/OwnedLayer;)Z PLandroidx/compose/ui/platform/AndroidComposeView;->requestClearInvalidObservations()V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewDetachedFromWindow(Landroid/view/View;)V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->()V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->()V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->addSetProgressAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->()V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->()V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$ComposeAccessibilityNodeProvider;->createAccessibilityNodeInfo(I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$createNodeInfo(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getHandler$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Landroid/os/Handler; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getSemanticsChangeChecker$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Ljava/lang/Runnable; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getSendingFocusAffectingEvent$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Z -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionEnd(Landroidx/compose/ui/semantics/SemanticsNode;)I -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionStart(Landroidx/compose/ui/semantics/SemanticsNode;)I -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes()Landroidx/collection/IntObjectMap; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTextForTextField(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/AnnotatedString; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setContentInvalid(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setStateDescription(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setText(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->toSpannableString(Landroidx/compose/ui/text/AnnotatedString;)Landroid/text/SpannableString; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->()V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->()V -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt$excludeLineAndPageGranularities$ancestor$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->access$isVisible(Landroidx/compose/ui/semantics/SemanticsNode;)Z -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->findClosestParentNode(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; -PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat_androidKt;->isVisible(Landroidx/compose/ui/semantics/SemanticsNode;)Z PLandroidx/compose/ui/platform/AndroidComposeViewTranslationCallbackS$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;)V PLandroidx/compose/ui/platform/AndroidComposeViewTranslationCallbackS;->clearViewTranslationCallback(Landroid/view/View;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$1$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$1$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainResourceIdCache$1$1$invoke$$inlined$onDispose$1;->dispose()V -PLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$setScheduledFrameDispatch$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;Z)V -PLandroidx/compose/ui/platform/AndroidViewConfiguration;->getMinimumTouchTargetSize-MYxV2XQ()J -PLandroidx/compose/ui/platform/AndroidViewsHandler;->()V -PLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V -PLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; -PLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V -PLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V -PLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V -PLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V -PLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->dispose()V PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$$ExternalSyntheticLambda0;->saveState()Landroid/os/Bundle; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;->invoke()Ljava/lang/Object; @@ -44629,142 +45165,12 @@ PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt;->$r8$l PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt;->DisposableSaveableStateRegistry$lambda$0(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)Landroid/os/Bundle; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt;->toBundle(Ljava/util/Map;)Landroid/os/Bundle; PLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->destroy()V -PLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->getMatrix-sQKQjiQ()[F -PLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V -PLandroidx/compose/ui/platform/InvertMatrixKt;->invertTo-JiSxe2E([F[F)Z -PLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->()V -PLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Rect;)V -PLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getAdjustedBounds()Landroid/graphics/Rect; -PLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; -PLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->()V -PLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->getAllUncoveredSemanticsNodesToIntObjectMap(Landroidx/compose/ui/semantics/SemanticsOwner;)Landroidx/collection/IntObjectMap; -PLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->isImportantForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Z -PLandroidx/compose/ui/platform/SemanticsUtils_androidKt;->toLegacyClassName-V4PA4sw(I)Ljava/lang/String; -PLandroidx/compose/ui/platform/ViewConfiguration$-CC;->$default$getMinimumTouchTargetSize-MYxV2XQ(Landroidx/compose/ui/platform/ViewConfiguration;)J PLandroidx/compose/ui/platform/WeakCache;->push(Ljava/lang/Object;)V PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WrappedComposition;->dispose()V -PLandroidx/compose/ui/platform/accessibility/CollectionInfo_androidKt;->setCollectionItemInfo(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/compose/ui/semantics/AccessibilityAction;->()V -PLandroidx/compose/ui/semantics/AccessibilityAction;->(Ljava/lang/String;Lkotlin/Function;)V -PLandroidx/compose/ui/semantics/AccessibilityAction;->getLabel()Ljava/lang/String; -PLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldClearDescendantSemantics()Z -PLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldMergeDescendantSemantics()Z -PLandroidx/compose/ui/semantics/EmptySemanticsModifier;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/ui/semantics/EmptySemanticsModifier;->getShouldClearDescendantSemantics()Z -PLandroidx/compose/ui/semantics/EmptySemanticsModifier;->getShouldMergeDescendantSemantics()Z -PLandroidx/compose/ui/semantics/Role$Companion;->getCheckbox-o7Vup1c()I -PLandroidx/compose/ui/semantics/Role$Companion;->getImage-o7Vup1c()I -PLandroidx/compose/ui/semantics/Role$Companion;->getRadioButton-o7Vup1c()I -PLandroidx/compose/ui/semantics/Role$Companion;->getSwitch-o7Vup1c()I -PLandroidx/compose/ui/semantics/Role$Companion;->getTab-o7Vup1c()I -PLandroidx/compose/ui/semantics/Role;->access$getCheckbox$cp()I -PLandroidx/compose/ui/semantics/Role;->access$getImage$cp()I -PLandroidx/compose/ui/semantics/Role;->access$getRadioButton$cp()I -PLandroidx/compose/ui/semantics/Role;->access$getSwitch$cp()I -PLandroidx/compose/ui/semantics/Role;->access$getTab$cp()I -PLandroidx/compose/ui/semantics/Role;->equals-impl0(II)Z -PLandroidx/compose/ui/semantics/Role;->unbox-impl()I -PLandroidx/compose/ui/semantics/SemanticsActions;->getClearTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getCollapse()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getCopyText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getCutText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getDismiss()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getExpand()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getGetTextLayoutResult()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getOnClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getOnImeAction()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getOnLongClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getPageDown()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getPageLeft()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getPageRight()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getPageUp()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getPasteText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getRequestFocus()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getScrollBy()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getSetProgress()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getSetSelection()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getSetText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getSetTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsActions;->getShowTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsConfiguration;->get(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; -PLandroidx/compose/ui/semantics/SemanticsConfiguration;->isMergingSemanticsOfDescendants()Z -PLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V -PLandroidx/compose/ui/semantics/SemanticsConfiguration;->setClearingSemantics(Z)V -PLandroidx/compose/ui/semantics/SemanticsConfiguration;->setMergingSemanticsOfDescendants(Z)V -PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(Landroidx/compose/ui/semantics/Role;)V -PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V -PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V -PLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->()V -PLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->()V -PLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; -PLandroidx/compose/ui/semantics/SemanticsNode$isUnmergedLeafNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->()V -PLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->()V -PLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; -PLandroidx/compose/ui/semantics/SemanticsNode$parent$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui_release()Landroidx/compose/ui/node/NodeCoordinator; -PLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; -PLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; -PLandroidx/compose/ui/semantics/SemanticsNode;->getId()I -PLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutInfo()Landroidx/compose/ui/layout/LayoutInfo; -PLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutNode$ui_release()Landroidx/compose/ui/node/LayoutNode; -PLandroidx/compose/ui/semantics/SemanticsNode;->getTouchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; -PLandroidx/compose/ui/semantics/SemanticsNode;->isFake$ui_release()Z -PLandroidx/compose/ui/semantics/SemanticsNode;->isTransparent$ui_release()Z -PLandroidx/compose/ui/semantics/SemanticsNode;->isUnmergedLeafNode$ui_release()Z -PLandroidx/compose/ui/semantics/SemanticsNodeKt;->access$roleFakeNodeId(Landroidx/compose/ui/semantics/SemanticsNode;)I -PLandroidx/compose/ui/semantics/SemanticsNodeKt;->findClosestParentNode(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; -PLandroidx/compose/ui/semantics/SemanticsNodeKt;->roleFakeNodeId(Landroidx/compose/ui/semantics/SemanticsNode;)I -PLandroidx/compose/ui/semantics/SemanticsProperties;->getDisabled()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsProperties;->getError()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsProperties;->getHeading()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsProperties;->getInvisibleToUser()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsProperties;->getPassword()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsProperties;->getSelectableGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsProperties;->getText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->clearTextSubstitution$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->clearTextSubstitution(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->onClick(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->requestFocus$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->requestFocus(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContentDescription(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setFocused(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Z)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setRole-kuIjeqM(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;I)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setText(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/text/AnnotatedString;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTextSubstitution$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTextSubstitution(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->showTextSubstitution$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V -PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->showTextSubstitution(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V -PLandroidx/compose/ui/semantics/SemanticsPropertyKey;->isImportantForAccessibility$ui_release()Z -PLandroidx/compose/ui/semantics/SemanticsPropertyKey;->setValue(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V -PLandroidx/compose/ui/text/AnnotatedString;->getLength()I -PLandroidx/compose/ui/text/AnnotatedString;->getLinkAnnotations(II)Ljava/util/List; -PLandroidx/compose/ui/text/AnnotatedString;->getSpanStylesOrNull$ui_text_release()Ljava/util/List; -PLandroidx/compose/ui/text/AnnotatedString;->getTtsAnnotations(II)Ljava/util/List; -PLandroidx/compose/ui/text/AnnotatedString;->getUrlAnnotations(II)Ljava/util/List; -PLandroidx/compose/ui/text/AnnotatedString;->length()I -PLandroidx/compose/ui/text/platform/AndroidAccessibilitySpannableString_androidKt;->toAccessibilitySpannableString(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamily$Resolver;Landroidx/compose/ui/text/platform/URLSpanCache;)Landroid/text/SpannableString; PLandroidx/compose/ui/text/platform/ImmutableBool;->getValue()Ljava/lang/Boolean; PLandroidx/compose/ui/text/platform/ImmutableBool;->getValue()Ljava/lang/Object; -PLandroidx/compose/ui/unit/Density$-CC;->$default$toSize-XkaWNTQ(Landroidx/compose/ui/unit/Density;J)J -PLandroidx/compose/ui/unit/DensityWithConverter;->toSize-XkaWNTQ(J)J -PLandroidx/compose/ui/unit/DpKt;->DpSize-YgX7TsA(FF)J -PLandroidx/compose/ui/unit/DpSize$Companion;->()V -PLandroidx/compose/ui/unit/DpSize$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLandroidx/compose/ui/unit/DpSize;->()V -PLandroidx/compose/ui/unit/DpSize;->constructor-impl(J)J -PLandroidx/compose/ui/unit/DpSize;->getHeight-D9Ej5fM(J)F -PLandroidx/compose/ui/unit/DpSize;->getWidth-D9Ej5fM(J)F -PLandroidx/compose/ui/util/ListUtilsKt;->appendElement(Ljava/lang/Appendable;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V -PLandroidx/compose/ui/util/ListUtilsKt;->fastJoinTo(Ljava/util/List;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; -PLandroidx/compose/ui/util/ListUtilsKt;->fastJoinToString$default(Ljava/util/List;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; -PLandroidx/compose/ui/util/ListUtilsKt;->fastJoinToString(Ljava/util/List;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; PLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->(Landroidx/concurrent/futures/AbstractResolvableFuture$1;)V PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->()V @@ -44794,6 +45200,8 @@ PLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasCenteredDependent PLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalMargin()I PLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalLeft(I)V PLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalDimension(II)V +PLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMaxVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V +PLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMinVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V PLandroidx/constraintlayout/core/widgets/Guideline$1;->()V PLandroidx/constraintlayout/core/widgets/Guideline;->()V PLandroidx/constraintlayout/core/widgets/Guideline;->getOrientation()I @@ -44854,11 +45262,9 @@ PLandroidx/core/text/util/LinkifyCompat;->()V PLandroidx/core/text/util/LinkifyCompat;->addLinks(Landroid/text/Spannable;I)Z PLandroidx/core/text/util/LinkifyCompat;->shouldAddLinksFallbackToFramework()Z PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z -PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEvent(Landroid/view/View;I)V PLandroidx/core/view/AccessibilityDelegateCompat;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z -PLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V PLandroidx/core/view/AccessibilityDelegateCompat;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEvent(Landroid/view/View;I)V PLandroidx/core/view/GestureDetectorCompat;->onTouchEvent(Landroid/view/MotionEvent;)Z @@ -44875,31 +45281,15 @@ PLandroidx/core/view/NestedScrollingParentHelper;->onStopNestedScroll(Landroid/v PLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl30$$ExternalSyntheticApiModelOutline3;->m()I PLandroidx/core/view/TreeIterator;->(Ljava/util/Iterator;Lkotlin/jvm/functions/Function1;)V PLandroidx/core/view/TreeIterator;->next()Ljava/lang/Object; -PLandroidx/core/view/TreeIterator;->prepareNextIterator(Ljava/lang/Object;)V -PLandroidx/core/view/ViewCompat$1;->(ILjava/lang/Class;I)V -PLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; -PLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; -PLandroidx/core/view/ViewCompat$3;->(ILjava/lang/Class;II)V -PLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; -PLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; -PLandroidx/core/view/ViewCompat$4;->(ILjava/lang/Class;I)V -PLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; -PLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; -PLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;I)V PLandroidx/core/view/ViewCompat$Api20Impl;->dispatchApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api21Impl;->getZ(Landroid/view/View;)F PLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/ViewCompat$Api28Impl;->isAccessibilityHeading(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api28Impl;->isScreenReaderFocusable(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api30Impl;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; -PLandroidx/core/view/ViewCompat;->accessibilityHeadingProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; PLandroidx/core/view/ViewCompat;->dispatchApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat;->getZ(Landroid/view/View;)F PLandroidx/core/view/ViewCompat;->hasTransientState(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat;->isScreenReaderFocusable(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V PLandroidx/core/view/ViewGroupKt$descendants$1$1;->()V @@ -44978,57 +45368,6 @@ PLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/Win PLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/accessibility/AccessibilityEventCompat;->getContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;)I PLandroidx/core/view/accessibility/AccessibilityEventCompat;->setContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline13;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline14;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline4;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->()V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addChild(Landroid/view/View;I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addSpansToExtras(Ljava/lang/CharSequence;Landroid/view/View;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/List; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getMovementGranularities()I -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->hasSpans()Z -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isClickable()Z -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocusable()Z -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocused()Z -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->obtain()Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setAccessibilityFocused(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setAvailableExtraData(Ljava/util/List;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setBoundsInScreen(Landroid/graphics/Rect;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCheckable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClickable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setContentDescription(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEditable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEnabled(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocusable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocused(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHeading(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setImportantForAccessibility(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setLongClickable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setMaxTextLength(I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setMovementGranularities(I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPackageName(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPassword(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScrollable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setSource(Landroid/view/View;I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setText(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setTextSelection(II)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setVisibleToUser(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->wrap(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; -PLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; -PLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->getProvider()Ljava/lang/Object; PLandroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V PLandroidx/core/view/inputmethod/EditorInfoCompat;->()V PLandroidx/core/view/inputmethod/EditorInfoCompat;->setContentMimeTypes(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V @@ -45112,12 +45451,12 @@ PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigStateInternal(L PLandroidx/fragment/app/FragmentManagerViewModel;->shouldDestroy(Landroidx/fragment/app/Fragment;)Z PLandroidx/fragment/app/FragmentState$1;->()V PLandroidx/fragment/app/FragmentState;->()V +PLandroidx/fragment/app/FragmentState;->(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/fragment/app/FragmentStateManager;->destroyFragmentView()V PLandroidx/fragment/app/FragmentStateManager;->detach()V PLandroidx/fragment/app/FragmentStateManager;->isFragmentViewChild(Landroid/view/View;)Z PLandroidx/fragment/app/FragmentStateManager;->pause()V -PLandroidx/fragment/app/FragmentStateManager;->saveState()Landroid/os/Bundle; PLandroidx/fragment/app/FragmentStateManager;->saveViewState()V PLandroidx/fragment/app/FragmentStateManager;->stop()V PLandroidx/fragment/app/FragmentStore;->getAllSavedState()Ljava/util/HashMap; @@ -45174,14 +45513,12 @@ PLandroidx/lifecycle/SavedStateHandleController;->onStateChanged(Landroidx/lifec PLandroidx/lifecycle/SavedStateHandlesProvider;->saveState()Landroid/os/Bundle; PLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/Map; PLandroidx/lifecycle/SavedStateViewModelFactoryKt;->access$getVIEWMODEL_SIGNATURE$p()Ljava/util/List; -PLandroidx/lifecycle/ViewModel;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V PLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +PLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->close()V PLandroidx/lifecycle/viewmodel/internal/JvmViewModelProviders;->()V PLandroidx/lifecycle/viewmodel/internal/JvmViewModelProviders;->()V PLandroidx/lifecycle/viewmodel/internal/JvmViewModelProviders;->createViewModel(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->access$closeWithRuntimeException(Landroidx/lifecycle/viewmodel/internal/ViewModelImpl;Ljava/lang/AutoCloseable;)V -PLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V -PLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->closeWithRuntimeException(Ljava/lang/AutoCloseable;)V PLandroidx/loader/app/LoaderManager;->()V PLandroidx/loader/app/LoaderManager;->getInstance(Landroidx/lifecycle/LifecycleOwner;)Landroidx/loader/app/LoaderManager; PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel$1;->()V @@ -45349,9 +45686,8 @@ PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/ PLandroidx/recyclerview/widget/AdapterListUpdateCallback;->onChanged(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/AsyncDifferConfig;->getDiffCallback()Landroidx/recyclerview/widget/DiffUtil$ItemCallback; PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areContentsTheSame(II)Z -PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areItemsTheSame(II)Z PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getChangePayload(II)Ljava/lang/Object; -PLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z +PLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/ChildHelper;->removeViewAt(I)V PLandroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode;->()V PLandroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode;->(Ljava/lang/String;I)V @@ -45430,7 +45766,6 @@ PLandroidx/recyclerview/widget/NestedAdapterWrapper$1;->onItemRangeInserted(II)V PLandroidx/recyclerview/widget/NestedAdapterWrapper;->(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/NestedAdapterWrapper$Callback;Landroidx/recyclerview/widget/ViewTypeStorage;Landroidx/recyclerview/widget/StableIdStorage$StableIdLookup;)V PLandroidx/recyclerview/widget/NestedAdapterWrapper;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V PLandroidx/recyclerview/widget/NestedAdapterWrapper;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -PLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I PLandroidx/recyclerview/widget/OrientationHelper;->getTotalSpaceChange()I PLandroidx/recyclerview/widget/RecyclerView$5;->removeViewAt(I)V PLandroidx/recyclerview/widget/RecyclerView$6;->markViewHoldersUpdated(IILjava/lang/Object;)V @@ -45447,19 +45782,10 @@ PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPreLayoutInform PLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getItemCount()I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isLayoutHierarchical(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Z PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAddFocusables(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/ArrayList;II)Z PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleViewAt(ILandroidx/recyclerview/widget/RecyclerView$Recycler;)V @@ -45488,6 +45814,7 @@ PLandroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener;->() PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addChangePayload(Ljava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->doesTransientStatePreventRecycling()Z PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAbsoluteAdapterPosition()I +PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getOldPosition()I PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRecyclable()Z PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->resetInternal()V @@ -45497,14 +45824,10 @@ PLandroidx/recyclerview/widget/RecyclerView;->addFocusables(Ljava/util/ArrayList PLandroidx/recyclerview/widget/RecyclerView;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;ZZ)V PLandroidx/recyclerview/widget/RecyclerView;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/RecyclerView;->clearNestedRecyclerViewIfNotNested(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I -PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I -PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I PLandroidx/recyclerview/widget/RecyclerView;->dispatchChildDetached(Landroid/view/View;)V PLandroidx/recyclerview/widget/RecyclerView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V PLandroidx/recyclerview/widget/RecyclerView;->findInterceptingOnItemTouchListener(Landroid/view/MotionEvent;)Z PLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams; -PLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; PLandroidx/recyclerview/widget/RecyclerView;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; PLandroidx/recyclerview/widget/RecyclerView;->invalidateItemDecorations()V PLandroidx/recyclerview/widget/RecyclerView;->onChildDetachedFromWindow(Landroid/view/View;)V @@ -45518,18 +45841,19 @@ PLandroidx/recyclerview/widget/RecyclerView;->startNestedScroll(II)Z PLandroidx/recyclerview/widget/RecyclerView;->stopGlowAnimations(Landroid/view/MotionEvent;)Z PLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V PLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll(I)V +PLandroidx/recyclerview/widget/RecyclerView;->viewRangeUpdate(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAndRemoveOriginalDelegateForItem(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->sendAccessibilityEvent(Landroid/view/View;I)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V PLandroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage$1;->(Landroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage;)V PLandroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage;->()V PLandroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage;->createStableIdLookup()Landroidx/recyclerview/widget/StableIdStorage$StableIdLookup; PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->drainCache()V PLandroidx/recyclerview/widget/ViewInfoStore;->addToOldChangeHolders(JLandroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/ViewInfoStore;->onDetach()V PLandroidx/recyclerview/widget/ViewInfoStore;->popFromPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; PLandroidx/recyclerview/widget/ViewInfoStore;->popFromPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; @@ -45645,8 +45969,6 @@ PLcom/fasterxml/jackson/databind/type/TypeBindings;->createIfNeeded(Ljava/lang/C PLcom/fasterxml/jackson/databind/type/TypeFactory;->constructCollectionType(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/CollectionType; PLcom/fasterxml/jackson/databind/type/TypeFactory;->constructCollectionType(Ljava/lang/Class;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/type/CollectionType; PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$2;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->access$000(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)Z PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->animateOffsetTo(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IF)V PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->animateOffsetWithDuration(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;II)V PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canDragView(Landroid/view/View;)Z @@ -45787,7 +46109,6 @@ PLio/reactivex/rxjava3/disposables/Disposable$-CC;->disposed()Lio/reactivex/rxja PLio/reactivex/rxjava3/internal/disposables/CancellableDisposable;->dispose()V PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->complete(Lio/reactivex/rxjava3/core/MaybeObserver;)V PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->dispose()V -PLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->dispose()V PLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->(Lio/reactivex/rxjava3/functions/Function3;)V PLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->apply(Ljava/lang/Object;)Ljava/lang/Object; PLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->apply([Ljava/lang/Object;)Ljava/lang/Object; @@ -45808,18 +46129,17 @@ PLio/reactivex/rxjava3/internal/observers/QueueDrainObserver;->error()Ljava/lang PLio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberPad0;->()V PLio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberPad2;->()V PLio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberWip;->()V -PLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestCoordinator;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestCoordinator;->cancelAll()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestInnerSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$BaseEmitter;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$LatestAsyncEmitter;->onUnsubscribed()V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableDebounceTimed$DebounceTimedSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->(Lio/reactivex/rxjava3/internal/fuseable/ConditionalSubscriber;Lio/reactivex/rxjava3/functions/Predicate;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->onNext(Ljava/lang/Object;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->tryOnNext(Ljava/lang/Object;)Z PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Predicate;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter;->subscribeActual(Lorg/reactivestreams/Subscriber;)V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableInterval$IntervalSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->clear()V @@ -45829,8 +46149,6 @@ PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSu PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefCountSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount;->cancel(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefConnection;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount;->timeout(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefConnection;)V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->removeFirst()V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->setFirst(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$Node;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->dispose()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$ReplaySubscriber;->dispose()V @@ -45960,6 +46278,7 @@ PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$E PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle;->(Lio/reactivex/rxjava3/core/ObservableSource;JLjava/lang/Object;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver;->onNext(Ljava/lang/Object;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onComplete()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V @@ -45977,6 +46296,8 @@ PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$Fla PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->drainLoop()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->getOrCreateQueue()Lio/reactivex/rxjava3/internal/queue/SpscLinkedArrayQueue; PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V @@ -46097,13 +46418,9 @@ PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn;->(Lio/re PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorComplete;->(Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/functions/Predicate;)V PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorComplete;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->isEmpty()Z -PLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; PLio/reactivex/rxjava3/internal/queue/SpscArrayQueue;->clear()V PLio/reactivex/rxjava3/internal/queue/SpscArrayQueue;->isEmpty()Z -PLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->cancelFuture(Ljava/util/concurrent/Future;)V PLio/reactivex/rxjava3/internal/schedulers/DisposeOnCancel;->cancel(Z)Z -PLio/reactivex/rxjava3/internal/schedulers/ScheduledRunnable;->dispose()V PLio/reactivex/rxjava3/internal/subscribers/BasicFuseableConditionalSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/subscribers/BasicFuseableSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber;->cancel()V @@ -46162,11 +46479,13 @@ PLio/reactivex/rxjava3/subjects/BehaviorSubject;->terminate(Ljava/lang/Object;)[ PLio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable;->dispose()V PLio/reactivex/rxjava3/subjects/PublishSubject;->remove(Lio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable;)V PLio/reactivex/rxjava3/subjects/SerializedSubject;->test(Ljava/lang/Object;)Z +PLio/reactivex/rxjava3/subscribers/SerializedSubscriber;->cancel()V PLj$/util/DesugarCollections;->a()Ljava/lang/reflect/Constructor; PLj$/util/Optional;->ifPresent(Lj$/util/function/Consumer;)V -PLj$/util/S;->r(Lj$/util/function/Consumer;)Z PLj$/util/concurrent/ConcurrentHashMap;->h(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLj$/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +PLj$/util/concurrent/q;->a(Ljava/lang/Object;I)Lj$/util/concurrent/l; +PLj$/util/concurrent/v;->a(Lsun/misc/Unsafe;Ljava/lang/Object;J)I PLj$/util/d;->a(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; PLj$/util/d;->keySet()Ljava/util/Set; PLj$/util/function/b;->(Ljava/util/Comparator;I)V @@ -46218,7 +46537,6 @@ PLkotlin/coroutines/CombinedContext;->size()I PLkotlin/jvm/internal/PropertyReference0;->invoke()Ljava/lang/Object; PLkotlin/sequences/SequenceBuilderIterator;->yieldAll(Ljava/util/Iterator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/sequences/SequenceScope;->yieldAll(Lkotlin/sequences/Sequence;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlin/sequences/SequencesKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->(Lkotlin/jvm/functions/Function2;)V PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; @@ -46268,7 +46586,6 @@ PLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->invokeSuspend( PLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->access$receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlinx/coroutines/channels/BufferedChannel;->cancelSuspendedReceiveRequests(Lkotlinx/coroutines/channels/ChannelSegment;J)V PLkotlinx/coroutines/channels/BufferedChannel;->close(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/channels/BufferedChannel;->closeLinkedList()Lkotlinx/coroutines/channels/ChannelSegment; PLkotlinx/coroutines/channels/BufferedChannel;->closeOrCancelImpl(Ljava/lang/Throwable;Z)Z @@ -46285,7 +46602,6 @@ PLkotlinx/coroutines/channels/BufferedChannel;->markClosed()V PLkotlinx/coroutines/channels/BufferedChannel;->onClosedIdempotent()V PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU$suspendImpl(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->waitExpandBufferCompletion$kotlinx_coroutines_core(J)V PLkotlinx/coroutines/channels/BufferedChannelKt;->access$constructSendersAndCloseStatus(JI)J @@ -46370,7 +46686,6 @@ PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->([Lkotlin PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt;->combineInternal(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/FlowCoroutine;->childCancelled(Ljava/lang/Throwable;)Z @@ -46388,7 +46703,6 @@ PLkotlinx/coroutines/internal/LimitedDispatcher;->dispatchYield(Lkotlin/coroutin PLkotlinx/coroutines/internal/LockFreeLinkedListNode;->findPrevNonRemoved(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/internal/LockFreeLinkedListNode; PLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V PLkotlinx/coroutines/internal/Segment;->getCleanedAndPointers$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; -PLkotlinx/coroutines/internal/Segment;->onSlotCleaned()V PLkotlinx/coroutines/rx3/RxConvertKt$asFlow$1$$ExternalSyntheticLambda0;->(Ljava/util/concurrent/atomic/AtomicReference;)V PLkotlinx/coroutines/rx3/RxConvertKt$asFlow$1$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; PLkotlinx/coroutines/rx3/RxConvertKt$asFlow$1$observer$1;->(Lkotlinx/coroutines/channels/ProducerScope;Ljava/util/concurrent/atomic/AtomicReference;)V @@ -46484,7 +46798,6 @@ PLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery(Ljava/lang/String;Lj PLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery$default(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;Lorg/signal/core/util/SqlUtil$CollectionOperator;ILjava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; PLorg/signal/core/util/SqlUtil;->buildSingleCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; PLorg/signal/core/util/StringUtil;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -PLorg/signal/core/util/ToolbarExtensionsKt;->setActionItemTint(Landroidx/appcompat/widget/Toolbar;I)V PLorg/signal/core/util/concurrent/DeadlockDetector$$ExternalSyntheticLambda0;->run()V PLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->access$isExecutorFull(Lorg/signal/core/util/concurrent/DeadlockDetector$Companion;Ljava/util/concurrent/ExecutorService;)Z PLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->isExecutorFull(Ljava/util/concurrent/ExecutorService;)Z @@ -46511,6 +46824,7 @@ PLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/Strin PLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V PLorg/signal/core/util/logging/Log;->internal()Lorg/signal/core/util/logging/Log$Logger; PLorg/signal/libsignal/protocol/IdentityKey;->equals(Ljava/lang/Object;)Z +PLorg/signal/libsignal/protocol/ecc/ECPublicKey;->equals(Ljava/lang/Object;)Z PLorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda0;->(Lorg/signal/paging/BufferedPagingController;Ljava/lang/Object;)V PLorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda0;->run()V PLorg/signal/paging/BufferedPagingController;->$r8$lambda$niWJKUo-ehPdOP5P9_O82_NVKlY(Lorg/signal/paging/BufferedPagingController;Ljava/lang/Object;)V @@ -46522,7 +46836,7 @@ PLorg/signal/paging/FixedSizePagingController$$ExternalSyntheticLambda0;->run()V PLorg/signal/paging/FixedSizePagingController;->$r8$lambda$1LdP1wmyJub_fd25Xbr1Zuv0_Dw(Lorg/signal/paging/FixedSizePagingController;Ljava/lang/Object;)V PLorg/signal/paging/FixedSizePagingController;->onDataItemChanged(Ljava/lang/Object;)V PLorg/signal/paging/ProxyPagingController;->onDataItemChanged(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda69;->isInternal()Z +PLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda70;->isInternal()Z PLorg/thoughtcrime/securesms/LoggingFragment;->(I)V PLorg/thoughtcrime/securesms/LoggingFragment;->onDestroy()V PLorg/thoughtcrime/securesms/LoggingFragment;->onStop()V @@ -46550,6 +46864,7 @@ PLorg/thoughtcrime/securesms/attachments/Attachment;->isPermanentlyFailed()Z PLorg/thoughtcrime/securesms/attachments/AttachmentId;->hashCode()I PLorg/thoughtcrime/securesms/attachments/AttachmentId;->serialize()Ljava/lang/String; PLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->getThumbnailUri()Landroid/net/Uri; +PLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->hashCode()I PLorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/audio/AudioRecorder;)V PLorg/thoughtcrime/securesms/audio/AudioRecorder;->()V PLorg/thoughtcrime/securesms/audio/AudioRecorder;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V @@ -46568,9 +46883,14 @@ PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->hideStoryRing()V PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->()V PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->()V PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map; PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getMessageIdsOpenedThisSession$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Set; PLorg/thoughtcrime/securesms/banner/banners/BubbleOptOutBanner;->()V PLorg/thoughtcrime/securesms/banner/banners/BubbleOptOutBanner;->(ZLkotlin/jvm/functions/Function1;)V @@ -46583,6 +46903,7 @@ PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCorners()V PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->inflateLayout(I)V PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRelativeRadii(Lorg/thoughtcrime/securesms/components/ThumbnailView;IIII)V PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->showSlides(Lcom/bumptech/glide/RequestManager;Ljava/util/List;)V @@ -46659,6 +46980,7 @@ PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->lambda$init$0(L PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->notifyTouchDelegateChanged(Landroid/graphics/Rect;Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->onDetachedFromWindow()V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentAudioDuration(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDate(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentInsecureIndicator(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentSimInfo(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentTimer(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V @@ -46681,7 +47003,6 @@ PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$Thumbnail PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->()V PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getAlbumViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->formatUnreadCount(I)Ljava/lang/CharSequence; @@ -46831,6 +47152,7 @@ PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->()V PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)V +PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->isListCommitted()Z PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->notifyListCommitted()V PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -46854,11 +47176,10 @@ PLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/ PLorg/thoughtcrime/securesms/components/ThumbnailView;->dispatchDraw(Landroid/graphics/Canvas;)V PLorg/thoughtcrime/securesms/components/ThumbnailView;->fillTargetDimensions([I[I[I)V PLorg/thoughtcrime/securesms/components/ThumbnailView;->getNonZeroCount([I)I +PLorg/thoughtcrime/securesms/components/ThumbnailView;->hasSameContents(Lorg/thoughtcrime/securesms/mms/Slide;Lorg/thoughtcrime/securesms/mms/Slide;)Z PLorg/thoughtcrime/securesms/components/ThumbnailView;->onSizeChanged(IIII)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V PLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;ZZ)Lorg/signal/core/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/components/ThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +PLorg/thoughtcrime/securesms/components/ThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V PLorg/thoughtcrime/securesms/components/ThumbnailView;->showSecondaryText(Z)V PLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypists(J)Landroidx/lifecycle/LiveData; PLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->invoke(Landroidx/viewbinding/ViewBinding;)V @@ -46892,7 +47213,6 @@ PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->$r8$lambda$MRhTIH_ PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->ellipsizeAnyTextForMaxLength()V PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->getLastLineWidth()I PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isJumbomoji()Z -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isSingleLine()Z PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$getLongestLineWidth$0(Ljava/lang/String;)Ljava/lang/Float; PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setMentionBackgroundTint(I)V PLorg/thoughtcrime/securesms/components/emoji/EmojiToggle$1;->()V @@ -46968,6 +47288,8 @@ PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->c PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->getTransferState(Ljava/util/List;)I PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->onAttachedToWindow()V PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->onDetachedFromWindow()V +PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setCancelClickListener(Landroid/view/View$OnClickListener;)V +PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setTransferClickListener(Landroid/view/View$OnClickListener;)V PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->slidesAsListOfTimestamps(Ljava/util/List;)Ljava/lang/String; PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->verboseLog(Ljava/lang/String;)V PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->()V @@ -47011,6 +47333,7 @@ PLorg/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto;->equals(Ljava PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$sam$androidx_lifecycle_Observer$0;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$sam$androidx_lifecycle_Observer$0;->getFunctionDelegate()Lkotlin/Function; PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->onCleared()V +PLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->draw(Landroid/graphics/Canvas;)V PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->()V PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZ)V PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZ)V @@ -47087,6 +47410,7 @@ PLorg/thoughtcrime/securesms/conversation/ConversationItem;->forceFooter(Lorg/th PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBadgeImageView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBodyBubbleCorners(IIII)Lorg/thoughtcrime/securesms/util/Projection$Corners; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBubbleViews()Ljava/util/List; +PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getContactPhotoHolderView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultBubbleColor(Z)I @@ -47153,6 +47477,7 @@ PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMultiselectCo PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getThreadRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hasBeenQuoted()Z PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hasStyleLinks()Z +PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hashCode()I PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->isTextOnly(Landroid/content/Context;)Z PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->(Landroid/view/Menu;Z)V PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -47378,6 +47703,7 @@ PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Compa PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->fromSet(Ljava/util/Set;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->()V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->(Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V +PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->toSet()Ljava/util/Set; PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->()V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->()V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -47393,6 +47719,7 @@ PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;- PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawFocusShadeUnderIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawPulseShadeOverIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getCurrentSelection(Landroidx/recyclerview/widget/RecyclerView;)Ljava/util/Set; +PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getDifferenceForPart(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfPulseRequestAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V @@ -47402,6 +47729,7 @@ PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;- PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->()V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->hashCode()I PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->()V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->hashCode()I @@ -47530,6 +47858,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationV PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->canPlayContent()Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getDisplayMode()Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getNextMessage()Lj$/util/Optional; PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->showProjectionArea()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Ljava/lang/Object;)V @@ -47741,6 +48070,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConv PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Boolean; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke()Ljava/lang/Object; @@ -47890,6 +48220,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$doAft PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAdapter$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getArgs(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getBinding(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeText(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ComposeText; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeTextEventsListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener; @@ -48062,6 +48393,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->access$get PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConversationThreadState$lambda$0(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConversationThreadState(JI)Lio/reactivex/rxjava3/core/Single; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getMessageCounts(J)Lio/reactivex/rxjava3/core/Flowable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState$lambda$16(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadCount(J)I PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadMentionsCount(J)I PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->isInBubble()Z @@ -48188,6 +48520,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getBannerFlow PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getBannerFlows$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)Lio/reactivex/rxjava3/core/SingleSource; PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Lj$/util/Optional;)Z @@ -48273,6 +48606,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->setDrain(Lorg/th PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->()V PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;)V PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->shouldShowReviewBanner()Z PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V @@ -48319,7 +48653,6 @@ PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->(Lorg/th PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->()V PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V @@ -48461,12 +48794,14 @@ PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColors PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->(Lkotlin/jvm/functions/Function0;)V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getMask()Landroid/graphics/drawable/Drawable; PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOpacity()I +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->isSolidColor()Z PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setCorners(Lorg/thoughtcrime/securesms/util/Projection$Corners;)V PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setLocalChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V PLorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;->onMeasure(II)V @@ -48488,6 +48823,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->access$getCollapsedSpacing$cp()F PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->access$getDefaultSpacing$cp()F PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->getCornersLTR()Lorg/thoughtcrime/securesms/util/Projection$Corners; +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isSingularMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isStartOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isWithinClusteringTime(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z @@ -48539,6 +48875,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyVie PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->canPlayContent()Z PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getShape()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateFooterDrawable(Landroid/view/ViewGroup;)V PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->isContentCondensed()Z PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->isForcedFooter()Z PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentAlert()V @@ -48560,6 +48897,8 @@ PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBo PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;)V PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyTextColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)I PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getFooterBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getReplyIconBackgroundColor()I PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->()V @@ -48586,6 +48925,7 @@ PLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListene PLorg/thoughtcrime/securesms/conversation/v2/items/V2Payload;->$values()[Lorg/thoughtcrime/securesms/conversation/v2/items/V2Payload; PLorg/thoughtcrime/securesms/conversation/v2/items/V2Payload;->()V PLorg/thoughtcrime/securesms/conversation/v2/items/V2Payload;->(Ljava/lang/String;I)V +PLorg/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;I)V @@ -48593,10 +48933,10 @@ PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onSto PLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$$ExternalSyntheticLambda1;->onClick(Landroid/view/View;)V PLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->$r8$lambda$iJ3M5_PwpZ0_BVU0QPD67wRep54(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V PLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->lambda$onCreateViewHolder$1(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda76;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda76;->run()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda77;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;JI)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda77;->run(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda79;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda79;->run()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda80;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;JI)V +PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda80;->run(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->canStartNestedScroll()Z PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->onStopNestedScroll()V PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$Rp8Sxf-vLhFKh5li77bNlTYKO8c(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Object; @@ -48625,41 +48965,41 @@ PLorg/thoughtcrime/securesms/database/AttachmentTable;->hasStickerAttachments()Z PLorg/thoughtcrime/securesms/database/AttachmentTable;->readAttachment(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; PLorg/thoughtcrime/securesms/database/CallTable;->getCalls(Ljava/util/Collection;)Ljava/util/Map; PLorg/thoughtcrime/securesms/database/CallTable;->markAllCallEventsWithPeerBeforeTimestampRead(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lorg/thoughtcrime/securesms/database/CallTable$Call; -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda18;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda25;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda25;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda27;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda20;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda20;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda27;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda27;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda34;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda34;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda38;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda38;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda39;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda39;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda29;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda29;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda36;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda36;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda41;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda41;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda42;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda42;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda8;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$0jRCUTXTDVMpKepAkAg8DcY4jiA(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$1LvvZD3MMJCs2UcAbh6iCceBfls(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$4H5U_Q8BP_LdOaO31GRxD77lsIo(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$9IpxPQWQK0m2gGsU2g1e3UFfD1M(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$GXdy8_Xam7GTEc-kpnGOYelemU4(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$QuW_bMlLt-EJRMwq1DXrXJ3eYqU(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$UWVdWgnoz8LIawa01OJjD-HT0WM(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$frh4dntjBOhDTTzUuMic3POu1Zs(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$gsdJEUeMbOhcbJJGmn65gA2qeb8(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$hHYnudhLLDq3UpBEPX4iy6qChBo(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$keuyM8KxoDiwYDpQ2PUDD45qXMs(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyVerboseConversationListeners$23(J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$v_w74W8sC2i7Khry97icHMYKfTw(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyVerboseConversationListeners$24(J)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationObserver$1(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageInsertObserver$12(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageUpdateObserver$11(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerScheduledMessageObserver$15(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerStoryObserver$14(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerVerboseConversationObserver$2(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$20(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$21(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyVerboseConversationListeners(Ljava/util/Set;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMapped(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V @@ -48791,6 +49131,7 @@ PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->$r8$lambda$bAahgo PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getCall()Lorg/thoughtcrime/securesms/database/CallTable$Call; PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLatestRevisionId()Lorg/thoughtcrime/securesms/database/model/MessageId; +PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLinkPreviews()Ljava/util/List; PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getParentStoryId()Lorg/thoughtcrime/securesms/database/model/ParentStoryId; PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getPayment()Lorg/thoughtcrime/securesms/payments/Payment; PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getStoryType()Lorg/thoughtcrime/securesms/database/model/StoryType; @@ -48865,12 +49206,14 @@ PLorg/thoughtcrime/securesms/fonts/SignalSymbols;->()V PLorg/thoughtcrime/securesms/fonts/SignalSymbols;->()V PLorg/thoughtcrime/securesms/fonts/SignalSymbols;->getBoldWeightedFont(Landroid/content/Context;)Landroid/graphics/Typeface; PLorg/thoughtcrime/securesms/fonts/SignalSymbols;->getTypeface(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/SignalSymbols$Weight;)Landroid/graphics/Typeface; +PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->()V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->(Ljava/util/Set;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->(II)V +PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->attach(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V @@ -48897,7 +49240,7 @@ PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->setResizeMode(I)V PLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;->()V PLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;->(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;->(Landroid/content/Context;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setPriority(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; +PLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setGlobalPriority(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; PLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->putStringListAsArray(Ljava/lang/String;Ljava/util/List;)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder; PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->()V PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->()V @@ -48927,9 +49270,11 @@ PLorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;->(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/keyvalue/InternalValues;->useConversationItemV2Media()Z PLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->values()[Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; +PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageFontSize()I PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getUniversalExpireTimer()I PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isEnterKeySends()Z PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isLinkPreviewsEnabled()Z +PLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->hasWallpaperSet()Z PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->()V @@ -48992,12 +49337,14 @@ PLorg/thoughtcrime/securesms/mms/AttachmentManager;->(Landroid/content/Con PLorg/thoughtcrime/securesms/mms/AttachmentManager;->isAttachmentPresent()Z PLorg/thoughtcrime/securesms/mms/ImageSlide;->hasPlaceholder()Z PLorg/thoughtcrime/securesms/mms/ImageSlide;->isBorderless()Z +PLorg/thoughtcrime/securesms/mms/Slide;->asAttachment()Lorg/thoughtcrime/securesms/attachments/Attachment; PLorg/thoughtcrime/securesms/mms/Slide;->getBody()Lj$/util/Optional; PLorg/thoughtcrime/securesms/mms/Slide;->getCaption()Lj$/util/Optional; PLorg/thoughtcrime/securesms/mms/Slide;->getDisplayUri()Landroid/net/Uri; PLorg/thoughtcrime/securesms/mms/Slide;->getFileSize()J PLorg/thoughtcrime/securesms/mms/Slide;->getPlaceholderBlur()Lorg/thoughtcrime/securesms/blurhash/BlurHash; PLorg/thoughtcrime/securesms/mms/Slide;->hasThumbnail()Z +PLorg/thoughtcrime/securesms/mms/Slide;->isInProgress()Z PLorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0;->()V PLorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/mms/SlideDeck;->getBody()Ljava/lang/String; @@ -49094,14 +49441,11 @@ PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->removeForeverObserver(Lo PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->removeObserver(Landroidx/lifecycle/Observer;)V PLorg/thoughtcrime/securesms/recipients/Recipient$Companion;->observable(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; PLorg/thoughtcrime/securesms/recipients/Recipient$combinedAboutAndEmoji$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/recipients/Recipient$filteredAbout$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/recipients/Recipient$filteredAbout$2;->invoke()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getAbout()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getAboutEmoji()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getCombinedAboutAndEmoji()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getContactUri()Landroid/net/Uri; PLorg/thoughtcrime/securesms/recipients/Recipient;->getExpiresInSeconds()I -PLorg/thoughtcrime/securesms/recipients/Recipient;->getFilteredAbout()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getNotificationChannel()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getShouldShowE164()Z PLorg/thoughtcrime/securesms/recipients/Recipient;->isActiveGroup()Z @@ -49150,9 +49494,9 @@ PLorg/thoughtcrime/securesms/util/ConversationUtil;->refreshRecipientShortcuts() PLorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2;->invoke()Ljava/text/SimpleDateFormat; PLorg/thoughtcrime/securesms/util/DateUtils;->getConversationDateHeaderString(Landroid/content/Context;Ljava/util/Locale;J)Ljava/lang/String; +PLorg/thoughtcrime/securesms/util/DateUtils;->getDatelessRelativeTimeSpanFormattedDate(Landroid/content/Context;Ljava/util/Locale;J)Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate; PLorg/thoughtcrime/securesms/util/DateUtils;->isSameExtendedRelativeTimestamp(JJ)Z PLorg/thoughtcrime/securesms/util/Debouncer;->clear()V -PLorg/thoughtcrime/securesms/util/Debouncer;->publish(Ljava/lang/Runnable;)V PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->(Lkotlin/jvm/functions/Function0;)V PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V @@ -49187,8 +49531,9 @@ PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/app/ PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$getAnimator$p(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)Landroid/animation/ValueAnimator; PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$getSetStatusBarColor$p(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)Lkotlin/jvm/functions/Function1; PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getPreviousStatusBarColor()I +PLorg/thoughtcrime/securesms/util/MediaUtil;->isInstantVideoSupported(Lorg/thoughtcrime/securesms/mms/Slide;)Z +PLorg/thoughtcrime/securesms/util/MediaUtil;->isVideoType(Ljava/lang/String;)Z PLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasLocation(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator;->()V PLorg/thoughtcrime/securesms/util/NullableSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)V PLorg/thoughtcrime/securesms/util/Projection$Corners;->()V PLorg/thoughtcrime/securesms/util/Projection$Corners;->(F)V @@ -49234,6 +49579,7 @@ PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->valueOf(Ljava/lang/String;)Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->values()[Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMediaKeyboardMode(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; +PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMessageBodyTextSize(Landroid/content/Context;)I PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->hasSeenStickerIntroTooltip(Landroid/content/Context;)Z PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isEnterSendsEnabled(Landroid/content/Context;)Z PLorg/thoughtcrime/securesms/util/ThemeUtil;->getAttribute(Landroid/content/Context;ILjava/lang/String;)Ljava/lang/String; @@ -49290,6 +49636,7 @@ PLorg/thoughtcrime/securesms/util/ViewUtil;->getAlphaAnimation(FFI)Landroid/view PLorg/thoughtcrime/securesms/util/ViewUtil;->getLeftMargin(Landroid/view/View;)I PLorg/thoughtcrime/securesms/util/ViewUtil;->getRightMargin(Landroid/view/View;)I PLorg/thoughtcrime/securesms/util/ViewUtil;->getTopMargin(Landroid/view/View;)I +PLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/view/View;)Z PLorg/thoughtcrime/securesms/util/ViewUtil;->mirrorIfRtl(Landroid/view/View;Landroid/content/Context;)V PLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingBottom(Landroid/view/View;I)V PLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingTop(Landroid/view/View;I)V @@ -49304,7 +49651,6 @@ PLorg/thoughtcrime/securesms/util/WindowUtil;->setLightStatusBarFromTheme(Landro PLorg/thoughtcrime/securesms/util/WindowUtil;->setSystemUiFlags(Landroid/view/Window;I)V PLorg/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->getItemTypes()Ljava/util/Map; -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;I)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;ILjava/util/List;)V diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java index b03279c122..676cc05200 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -28,6 +28,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.components.ContactFilterView; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; @@ -127,12 +128,12 @@ public void onRefresh() { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { callback.accept(true); } @Override - public void onContactDeselected(@NonNull Optional recipientId, String number) {} + public void onContactDeselected(@NonNull Optional recipientId, String number, @NonNull Optional chatType) {} @Override public void onBeginScroll() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 2a9df86a22..1a9978b5ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -29,7 +29,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.widget.Button; import android.widget.TextView; import android.widget.Toast; @@ -47,7 +46,6 @@ import androidx.transition.TransitionManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.pnikosis.materialishprogress.ProgressWheel; import org.signal.core.util.concurrent.LifecycleDisposable; import org.signal.core.util.concurrent.RxExtensions; @@ -61,6 +59,7 @@ import org.thoughtcrime.securesms.contacts.LetterHeaderDecoration; import org.thoughtcrime.securesms.contacts.SelectedContact; import org.thoughtcrime.securesms.contacts.SelectedContacts; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.contacts.paged.ContactSearchAdapter; import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration; import org.thoughtcrime.securesms.contacts.paged.ContactSearchData; @@ -111,16 +110,17 @@ public final class ContactSelectionListFragment extends LoggingFragment { public static final int NO_LIMIT = Integer.MAX_VALUE; - public static final String DISPLAY_MODE = "display_mode"; - public static final String REFRESHABLE = "refreshable"; - public static final String RECENTS = "recents"; - public static final String SELECTION_LIMITS = "selection_limits"; - public static final String CURRENT_SELECTION = "current_selection"; - public static final String HIDE_COUNT = "hide_count"; - public static final String CAN_SELECT_SELF = "can_select_self"; - public static final String DISPLAY_CHIPS = "display_chips"; - public static final String RV_PADDING_BOTTOM = "recycler_view_padding_bottom"; - public static final String RV_CLIP = "recycler_view_clipping"; + public static final String DISPLAY_MODE = "display_mode"; + public static final String REFRESHABLE = "refreshable"; + public static final String RECENTS = "recents"; + public static final String SELECTION_LIMITS = "selection_limits"; + public static final String CURRENT_SELECTION = "current_selection"; + public static final String HIDE_COUNT = "hide_count"; + public static final String CAN_SELECT_SELF = "can_select_self"; + public static final String DISPLAY_CHIPS = "display_chips"; + public static final String RV_PADDING_BOTTOM = "recycler_view_padding_bottom"; + public static final String RV_CLIP = "recycler_view_clipping"; + public static final String INCLUDE_CHAT_TYPES = "include_chat_types"; private ConstraintLayout constraintLayout; private TextView emptyText; @@ -421,6 +421,11 @@ public void onExpandClicked(@NonNull ContactSearchData.Expand expand) { public void onUnknownRecipientClicked(@NonNull View view, @NonNull ContactSearchData.UnknownRecipient unknownRecipient, boolean isSelected) { listClickListener.onItemClick(unknownRecipient.getContactSearchKey()); } + + @Override + public void onChatTypeClicked(@NonNull View view, @NonNull ContactSearchData.ChatTypeRow chatTypeRow, boolean isSelected) { + listClickListener.onItemClick(chatTypeRow.getContactSearchKey()); + } }, (anchorView, data) -> listClickListener.onItemLongClick(anchorView, data.getContactSearchKey()), storyContextMenuCallbacks, @@ -679,6 +684,23 @@ public void onItemClick(ContactSearchKey contact) { return; } + if (selectedContact.hasChatType() && !contactSearchMediator.getSelectedContacts().contains(selectedContact.toContactSearchKey())) { + if (onContactSelectedListener != null) { + onContactSelectedListener.onBeforeContactSelected(true, Optional.empty(), null, Optional.of(selectedContact.getChatType()), allowed -> { + if (allowed) { + markContactSelected(selectedContact); + } + }); + } + return; + } else if (selectedContact.hasChatType()) { + markContactUnselected(selectedContact); + if (onContactSelectedListener != null) { + onContactSelectedListener.onContactDeselected(Optional.ofNullable(selectedContact.getRecipientId()), selectedContact.getNumber(), Optional.of(selectedContact.getChatType())); + } + return; + } + if (!isMulti || !contactSearchMediator.getSelectedContacts().contains(selectedContact.toContactSearchKey())) { if (selectionHardLimitReached()) { if (onSelectionLimitReachedListener != null) { @@ -709,7 +731,7 @@ public void onItemClick(ContactSearchKey contact) { SelectedContact selected = SelectedContact.forUsername(recipient.getId(), username); if (onContactSelectedListener != null) { - onContactSelectedListener.onBeforeContactSelected(true, Optional.of(recipient.getId()), null, allowed -> { + onContactSelectedListener.onBeforeContactSelected(true, Optional.of(recipient.getId()), null, Optional.empty(), allowed -> { if (allowed) { markContactSelected(selected); } @@ -731,6 +753,7 @@ public void onItemClick(ContactSearchKey contact) { isUnknown, Optional.ofNullable(selectedContact.getRecipientId()), selectedContact.getNumber(), + Optional.empty(), allowed -> { if (allowed) { markContactSelected(selectedContact); @@ -744,7 +767,7 @@ public void onItemClick(ContactSearchKey contact) { markContactUnselected(selectedContact); if (onContactSelectedListener != null) { - onContactSelectedListener.onContactDeselected(Optional.ofNullable(selectedContact.getRecipientId()), selectedContact.getNumber()); + onContactSelectedListener.onContactDeselected(Optional.ofNullable(selectedContact.getRecipientId()), selectedContact.getNumber(), Optional.empty()); } } } @@ -770,7 +793,7 @@ private boolean selectionWarningLimitExceeded() { return getChipCount() + currentSelection.size() > selectionLimit.getRecommendedLimit(); } - private void markContactSelected(@NonNull SelectedContact selectedContact) { + public void markContactSelected(@NonNull SelectedContact selectedContact) { contactSearchMediator.setKeysSelected(Collections.singleton(selectedContact.toContactSearchKey())); if (isMulti) { addChipForSelectedContact(selectedContact); @@ -789,7 +812,7 @@ private void markContactUnselected(@NonNull SelectedContact selectedContact) { } } - private void handleSelectedContactsChanged(@NonNull List selectedContacts) { + private void handleSelectedContactsChanged(@NonNull List> selectedContacts) { contactChipAdapter.submitList(new MappingModelList(selectedContacts), this::smoothScrollChipsToEnd); if (selectedContacts.isEmpty()) { @@ -808,15 +831,23 @@ private void handleSelectedContactsChanged(@NonNull List } private void addChipForSelectedContact(@NonNull SelectedContact selectedContact) { - SimpleTask.run(getViewLifecycleOwner().getLifecycle(), - () -> Recipient.resolved(selectedContact.getOrCreateRecipientId(requireContext())), - resolved -> contactChipViewModel.add(selectedContact)); + if (selectedContact.hasChatType()) { + contactChipViewModel.add(selectedContact); + } else { + SimpleTask.run(getViewLifecycleOwner().getLifecycle(), + () -> Recipient.resolved(selectedContact.getOrCreateRecipientId(requireContext())), + resolved -> contactChipViewModel.add(selectedContact)); + } } - private Unit onChipCloseIconClicked(SelectedContacts.Model model) { + private Unit onChipCloseIconClicked(SelectedContacts.Model model) { markContactUnselected(model.getSelectedContact()); if (onContactSelectedListener != null) { - onContactSelectedListener.onContactDeselected(Optional.of(model.getRecipient().getId()), model.getRecipient().getE164().orElse(null)); + if (model instanceof SelectedContacts.ChatTypeModel) { + onContactSelectedListener.onContactDeselected(Optional.empty(), null, Optional.of(model.getSelectedContact().getChatType())); + } else { + onContactSelectedListener.onContactDeselected(Optional.of(((SelectedContacts.RecipientModel) model).getRecipient().getId()), ((SelectedContacts.RecipientModel) model).getRecipient().getE164().orElse(null), Optional.empty()); + } } return Unit.INSTANCE; @@ -870,6 +901,7 @@ private void smoothScrollChipsToEnd() { boolean includeGroupsAfterContacts = flagSet(displayMode, ContactSelectionDisplayMode.FLAG_GROUPS_AFTER_CONTACTS); boolean blocked = flagSet(displayMode, ContactSelectionDisplayMode.FLAG_BLOCK); boolean includeGroupMembers = flagSet(displayMode, ContactSelectionDisplayMode.FLAG_GROUP_MEMBERS); + boolean includeChatTypes = safeArguments().getBoolean(INCLUDE_CHAT_TYPES); boolean hasQuery = !TextUtils.isEmpty(contactSearchState.getQuery()); ContactSearchConfiguration.TransportType transportType = resolveTransportType(includePushContacts, includeSmsContacts); @@ -895,6 +927,10 @@ private void smoothScrollChipsToEnd() { builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.FIND_BY_PHONE_NUMBER.getCode()); } + if (includeChatTypes && !hasQuery) { + builder.addSection(new ContactSearchConfiguration.Section.ChatTypes(true, null)); + } + if (transportType != null) { if (!hasQuery && includeRecents) { builder.addSection(new ContactSearchConfiguration.Section.Recents( @@ -1027,9 +1063,9 @@ public interface OnContactSelectedListener { /** * Provides an opportunity to disallow selecting an item. Call the callback with false to disallow, or true to allow it. */ - void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, @Nullable String number, @NonNull Consumer callback); + void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, @Nullable String number, @NonNull Optional chatType, @NonNull Consumer callback); - void onContactDeselected(@NonNull Optional recipientId, @Nullable String number); + void onContactDeselected(@NonNull Optional recipientId, @Nullable String number, @NonNull Optional chatType); void onSelectionChanged(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java b/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java index e249c38eb6..aabdefa56f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java @@ -27,15 +27,14 @@ import org.thoughtcrime.securesms.components.ContactFilterView.OnFilterChangedListener; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.SelectedContact; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.groups.SelectionLimits; -import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.mms.OutgoingMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.DynamicNoActionBarInviteTheme; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.thoughtcrime.securesms.util.text.AfterTextChanged; @@ -131,13 +130,13 @@ private Animation loadAnimation(@AnimRes int animResId) { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { updateSmsButtonText(contactsFragment.getSelectedContacts().size() + 1); callback.accept(true); } @Override - public void onContactDeselected(@NonNull Optional recipientId, String number) { + public void onContactDeselected(@NonNull Optional recipientId, String number, @NonNull Optional chatType) { updateSmsButtonText(contactsFragment.getSelectedContacts().size()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 319ca042cf..2dfb02dd8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -44,8 +44,8 @@ import org.thoughtcrime.securesms.components.menu.SignalContextMenu; import org.thoughtcrime.securesms.contacts.management.ContactsManagementRepository; import org.thoughtcrime.securesms.contacts.management.ContactsManagementViewModel; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey; -import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity; import org.thoughtcrime.securesms.keyvalue.SignalStore; @@ -57,11 +57,9 @@ import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; -import java.io.IOException; import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -121,7 +119,7 @@ public void onCreate(Bundle bundle, boolean ready) { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { if (recipientId.isPresent()) { launch(Recipient.resolved(recipientId.get())); } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java index 3c9e7b6590..8bb1b3197c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -92,8 +92,11 @@ import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.events.WebRtcViewModel; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.messagerequests.CalleeMustAcceptMessageRequestActivity; import org.thoughtcrime.securesms.permissions.Permissions; +import org.thoughtcrime.securesms.ratelimit.RecaptchaProofBottomSheetFragment; +import org.thoughtcrime.securesms.ratelimit.RecaptchaRequiredEvent; import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -117,7 +120,6 @@ import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -128,7 +130,7 @@ import static org.thoughtcrime.securesms.components.sensors.Orientation.PORTRAIT_BOTTOM_EDGE; -public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChangeDialog.Callback, ReactWithAnyEmojiBottomSheetDialogFragment.Callback { +public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChangeDialog.Callback, ReactWithAnyEmojiBottomSheetDialogFragment.Callback, RecaptchaProofBottomSheetFragment.Callback { private static final String TAG = Log.tag(WebRtcCallActivity.class); @@ -297,6 +299,9 @@ protected void onPostResume(boolean screenLocked) { case ANSWER_AUDIO -> handleAnswerWithAudio(); case ANSWER_VIDEO -> handleAnswerWithVideo(); } + if (SignalStore.rateLimit().needsRecaptcha()) { + RecaptchaProofBottomSheetFragment.show(getSupportFragmentManager()); + } } } @@ -314,6 +319,8 @@ public void onPause() { Log.i(TAG, "onPause"); super.onPause(); + EventBus.getDefault().unregister(this); + if (!callPermissionsDialogController.isAskingForPermission() && !viewModel.isCallStarting() && !isChangingConfigurations()) { CallParticipantsState state = viewModel.getCallParticipantsStateSnapshot(); if (state != null && state.getCallState().isPreJoinOrNetworkUnavailable()) { @@ -356,6 +363,11 @@ protected void onDestroy() { EventBus.getDefault().unregister(this); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRecaptchaRequiredEvent(RecaptchaRequiredEvent recaptchaRequiredEvent) { + RecaptchaProofBottomSheetFragment.show(getSupportFragmentManager()); + } + @SuppressLint("MissingSuperCall") @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { @@ -430,10 +442,6 @@ private void processIntent(@NonNull CallIntent intent) { } private void initializePendingParticipantFragmentListener() { - if (!RemoteConfig.adHocCalling()) { - return; - } - getSupportFragmentManager().setFragmentResultListener( PendingParticipantsBottomSheet.REQUEST_KEY, this, @@ -528,6 +536,7 @@ private void initializeViewModel() { viewModel.getEvents().observe(this, this::handleViewModelEvent); lifecycleDisposable.add(viewModel.getInCallstatus().subscribe(this::handleInCallStatus)); + lifecycleDisposable.add(viewModel.getRecipientFlowable().subscribe(callScreen::setRecipient)); boolean isStartedFromCallLink = getCallIntent().isStartedFromCallLink(); LiveDataUtil.combineLatest(LiveDataReactiveStreams.fromPublisher(viewModel.getCallParticipantsState().toFlowable(BackpressureStrategy.LATEST)), @@ -946,7 +955,6 @@ public void onEventMainThread(@NonNull WebRtcViewModel event) { previousEvent = event; viewModel.setRecipient(event.getRecipient()); - callScreen.setRecipient(event.getRecipient()); controlsAndInfoViewModel.setRecipient(event.getRecipient()); switch (event.getState()) { @@ -1099,6 +1107,11 @@ public void onReactWithAnyEmojiSelected(@NonNull String emoji) { callOverflowPopupWindow.dismiss(); } + @Override + public void onProofCompleted() { + AppDependencies.getSignalCallManager().resendMediaKeys(); + } + private final class ControlsListener implements WebRtcCallView.ControlsListener { @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index e773119970..0d64251a1d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -11,9 +11,15 @@ import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus import org.signal.core.util.Base64 import org.signal.core.util.EventTimer +import org.signal.core.util.Stopwatch import org.signal.core.util.concurrent.LimitedWorker import org.signal.core.util.concurrent.SignalExecutors +import org.signal.core.util.forceForeignKeyConstraintsEnabled import org.signal.core.util.fullWalCheckpoint +import org.signal.core.util.getAllIndexDefinitions +import org.signal.core.util.getAllTableDefinitions +import org.signal.core.util.getAllTriggerDefinitions +import org.signal.core.util.getForeignKeyViolations import org.signal.core.util.logging.Log import org.signal.core.util.stream.NonClosingOutputStream import org.signal.core.util.withinTransaction @@ -27,8 +33,6 @@ import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.Cdn import org.thoughtcrime.securesms.attachments.DatabaseAttachment -import org.thoughtcrime.securesms.backup.v2.database.clearAllDataForBackup -import org.thoughtcrime.securesms.backup.v2.database.clearAllDataForBackupRestore import org.thoughtcrime.securesms.backup.v2.importer.ChatItemArchiveImporter import org.thoughtcrime.securesms.backup.v2.processor.AccountDataArchiveProcessor import org.thoughtcrime.securesms.backup.v2.processor.AdHocCallArchiveProcessor @@ -49,6 +53,7 @@ import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider import org.thoughtcrime.securesms.database.AttachmentTable import org.thoughtcrime.securesms.database.KeyValueDatabase +import org.thoughtcrime.securesms.database.SearchTable import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.InAppPaymentSubscriberRecord import org.thoughtcrime.securesms.dependencies.AppDependencies @@ -57,6 +62,7 @@ import org.thoughtcrime.securesms.jobs.RequestGroupV2InfoJob import org.thoughtcrime.securesms.keyvalue.KeyValueStore import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.net.SignalNetwork +import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.toMillis import org.whispersystems.signalservice.api.NetworkResult @@ -73,6 +79,7 @@ import org.whispersystems.signalservice.api.crypto.AttachmentCipherStreamUtil import org.whispersystems.signalservice.api.messages.SignalServiceAttachment.ProgressListener import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException import org.whispersystems.signalservice.internal.crypto.PaddingInputStream import org.whispersystems.signalservice.internal.push.AttachmentUploadForm import org.whispersystems.signalservice.internal.push.SubscriptionsConfiguration @@ -113,9 +120,24 @@ object BackupRepository { } @WorkerThread - fun turnOffAndDeleteBackup() { - RecurringInAppPaymentRepository.cancelActiveSubscriptionSync(InAppPaymentSubscriberRecord.Type.BACKUP) - SignalStore.backup.disableBackups() + fun turnOffAndDeleteBackup(): Boolean { + return try { + Log.d(TAG, "Attempting to disable backups.") + getBackupTier().runIfSuccessful { tier -> + if (tier == MessageBackupTier.PAID) { + Log.d(TAG, "User is currently on a paid tier. Canceling.") + RecurringInAppPaymentRepository.cancelActiveSubscriptionSync(InAppPaymentSubscriberRecord.Type.BACKUP) + Log.d(TAG, "Successfully canceled paid tier.") + } + } + + Log.d(TAG, "Disabling backups.") + SignalStore.backup.disableBackups() + true + } catch (e: Exception) { + Log.w(TAG, "Failed to turn off backups.", e) + false + } } private fun createSignalDatabaseSnapshot(baseName: String): SignalDatabase { @@ -358,11 +380,11 @@ object BackupRepository { } return frameReader.use { reader -> - import(backupKey, reader, selfData) + import(backupKey, reader, selfData, cancellationSignal = { false }) } } - fun import(length: Long, inputStreamFactory: () -> InputStream, selfData: SelfData, plaintext: Boolean = false): ImportResult { + fun import(length: Long, inputStreamFactory: () -> InputStream, selfData: SelfData, plaintext: Boolean = false, cancellationSignal: () -> Boolean = { false }): ImportResult { val backupKey = SignalStore.svr.getOrCreateMasterKey().deriveBackupKey() val frameReader = if (plaintext) { @@ -377,79 +399,139 @@ object BackupRepository { } return frameReader.use { reader -> - import(backupKey, reader, selfData) + import(backupKey, reader, selfData, cancellationSignal) } } private fun import( backupKey: BackupKey, frameReader: BackupImportReader, - selfData: SelfData + selfData: SelfData, + cancellationSignal: () -> Boolean ): ImportResult { + val stopwatch = Stopwatch("import") val eventTimer = EventTimer() val header = frameReader.getHeader() if (header == null) { - Log.e(TAG, "Backup is missing header!") + Log.e(TAG, "[import] Backup is missing header!") return ImportResult.Failure } else if (header.version > VERSION) { - Log.e(TAG, "Backup version is newer than we understand: ${header.version}") + Log.e(TAG, "[import] Backup version is newer than we understand: ${header.version}") return ImportResult.Failure } - SignalDatabase.rawDatabase.withinTransaction { - SignalDatabase.recipients.clearAllDataForBackupRestore() - SignalDatabase.distributionLists.clearAllDataForBackupRestore() - SignalDatabase.threads.clearAllDataForBackupRestore() - SignalDatabase.messages.clearAllDataForBackupRestore() - SignalDatabase.attachments.clearAllDataForBackupRestore() - SignalDatabase.stickers.clearAllDataForBackupRestore() - SignalDatabase.reactions.clearAllDataForBackupRestore() - SignalDatabase.inAppPayments.clearAllDataForBackupRestore() - SignalDatabase.chatColors.clearAllDataForBackupRestore() - SignalDatabase.calls.clearAllDataForBackup() - SignalDatabase.callLinks.clearAllDataForBackup() + try { + // Removing all the data from the various tables is *very* expensive (i.e. can take *several* minutes) if we don't do some pre-work. + // SQLite optimizes deletes if there's no foreign keys, triggers, or WHERE clause, so that's the environment we're gonna create. + + Log.d(TAG, "[import] Disabling foreign keys...") + SignalDatabase.rawDatabase.forceForeignKeyConstraintsEnabled(false) + + Log.d(TAG, "[import] Acquiring transaction...") + SignalDatabase.rawDatabase.beginTransaction() + + Log.d(TAG, "[import] Inside transaction.") + stopwatch.split("get-transaction") + + Log.d(TAG, "[import] --- Dropping all indices ---") + val indexMetadata = SignalDatabase.rawDatabase.getAllIndexDefinitions() + for (index in indexMetadata) { + Log.d(TAG, "[import] Dropping index ${index.name}...") + SignalDatabase.rawDatabase.execSQL("DROP INDEX IF EXISTS ${index.name}") + } + stopwatch.split("drop-indices") + + if (cancellationSignal()) { + return ImportResult.Failure + } + + Log.d(TAG, "[import] --- Dropping all triggers ---") + val triggerMetadata = SignalDatabase.rawDatabase.getAllTriggerDefinitions() + for (trigger in triggerMetadata) { + Log.d(TAG, "[import] Dropping trigger ${trigger.name}...") + SignalDatabase.rawDatabase.execSQL("DROP TRIGGER IF EXISTS ${trigger.name}") + } + stopwatch.split("drop-triggers") + + if (cancellationSignal()) { + return ImportResult.Failure + } + + Log.d(TAG, "[import] --- Recreating all tables ---") + val tableMetadata = SignalDatabase.rawDatabase.getAllTableDefinitions().filter { !it.name.startsWith(SearchTable.FTS_TABLE_NAME + "_") } + for (table in tableMetadata) { + Log.d(TAG, "[import] Dropping table ${table.name}...") + SignalDatabase.rawDatabase.execSQL("DROP TABLE IF EXISTS ${table.name}") + + Log.d(TAG, "[import] Creating table ${table.name}...") + SignalDatabase.rawDatabase.execSQL(table.statement) + } + + RecipientId.clearCache() + AppDependencies.recipientCache.clear() + AppDependencies.recipientCache.clearSelf() + + stopwatch.split("drop-data") + + if (cancellationSignal()) { + return ImportResult.Failure + } // Add back self after clearing data val selfId: RecipientId = SignalDatabase.recipients.getAndPossiblyMerge(selfData.aci, selfData.pni, selfData.e164, pniVerified = true, changeSelf = true) SignalDatabase.recipients.setProfileKey(selfId, selfData.profileKey) SignalDatabase.recipients.setProfileSharing(selfId, true) - eventTimer.emit("setup") val importState = ImportState(backupKey) val chatItemInserter: ChatItemArchiveImporter = ChatItemArchiveProcessor.beginImport(importState) + Log.d(TAG, "[import] Beginning to read frames.") val totalLength = frameReader.getStreamLength() + var frameCount = 0 for (frame in frameReader) { when { frame.account != null -> { AccountDataArchiveProcessor.import(frame.account, selfId, importState) eventTimer.emit("account") + frameCount++ } frame.recipient != null -> { RecipientArchiveProcessor.import(frame.recipient, importState) eventTimer.emit("recipient") + frameCount++ } frame.chat != null -> { ChatArchiveProcessor.import(frame.chat, importState) eventTimer.emit("chat") + frameCount++ } frame.adHocCall != null -> { AdHocCallArchiveProcessor.import(frame.adHocCall, importState) eventTimer.emit("call") + frameCount++ } frame.stickerPack != null -> { StickerArchiveProcessor.import(frame.stickerPack) eventTimer.emit("sticker-pack") + frameCount++ } frame.chatItem != null -> { chatItemInserter.import(frame.chatItem) eventTimer.emit("chatItem") + frameCount++ + + if (frameCount % 1000 == 0) { + if (cancellationSignal()) { + return ImportResult.Failure + } + Log.d(TAG, "Imported $frameCount frames so far.") + } // TODO if there's stuff in the stream after chatItems, we need to flush the inserter before going to the next phase } @@ -462,16 +544,50 @@ object BackupRepository { eventTimer.emit("chatItem") } + stopwatch.split("frames") + + Log.d(TAG, "[import] Rebuilding FTS index...") + SignalDatabase.messageSearch.rebuildIndex() + + Log.d(TAG, "[import] --- Recreating indices ---") + for (index in indexMetadata) { + Log.d(TAG, "[import] Creating index ${index.name}...") + SignalDatabase.rawDatabase.execSQL(index.statement) + } + stopwatch.split("recreate-indices") + + Log.d(TAG, "[import] --- Recreating triggers ---") + for (trigger in triggerMetadata) { + Log.d(TAG, "[import] Creating trigger ${trigger.name}...") + SignalDatabase.rawDatabase.execSQL(trigger.statement) + } + stopwatch.split("recreate-triggers") + + Log.d(TAG, "[import] Updating threads...") importState.chatIdToLocalThreadId.values.forEach { SignalDatabase.threads.update(it, unarchive = false, allowDeletion = false) } + stopwatch.split("thread-updates") + + val foreignKeyViolations = SignalDatabase.rawDatabase.getForeignKeyViolations() + if (foreignKeyViolations.isNotEmpty()) { + throw IllegalStateException("Foreign key check failed! Violations: $foreignKeyViolations") + } + stopwatch.split("fk-check") + + SignalDatabase.rawDatabase.setTransactionSuccessful() + } finally { + if (SignalDatabase.rawDatabase.inTransaction()) { + SignalDatabase.rawDatabase.endTransaction() + } + + Log.d(TAG, "[import] Re-enabling foreign keys...") + SignalDatabase.rawDatabase.forceForeignKeyConstraintsEnabled(true) } AppDependencies.recipientCache.clear() AppDependencies.recipientCache.warmUp() - Log.d(TAG, "import() ${eventTimer.stop().summary}") - val groupJobs = SignalDatabase.groups.getGroups().use { groups -> groups .asSequence() @@ -485,6 +601,10 @@ object BackupRepository { .toList() } AppDependencies.jobManager.addAll(groupJobs) + stopwatch.split("group-jobs") + + Log.d(TAG, "[import] Finished! ${eventTimer.stop().summary}") + stopwatch.stop(TAG) return ImportResult.Success(backupTime = header.backupTimeMs) } @@ -515,6 +635,25 @@ object BackupRepository { } } + /** + * If backups are initialized, this method will query the server for the current backup level. + * If backups are not initialized, this method will return either the stored tier or a 404 result. + */ + fun getBackupTier(): NetworkResult { + return if (SignalStore.backup.backupsInitialized) { + getBackupTier(Recipient.self().requireAci()) + } else if (SignalStore.backup.backupTier != null) { + NetworkResult.Success(SignalStore.backup.backupTier!!) + } else { + NetworkResult.StatusCodeError(NonSuccessfulResponseCodeException(404)) + } + } + + /** + * Grabs the backup tier for the given ACI. Note that this will set the user's backup + * tier to FREE if they are not on PAID, so avoid this method if you don't intend that + * to be the case. + */ private fun getBackupTier(aci: ACI): NetworkResult { val backupKey = SignalStore.svr.getOrCreateMasterKey().deriveBackupKey() @@ -1055,6 +1194,10 @@ class ImportState(val backupKey: BackupKey) { val chatIdToLocalRecipientId: MutableMap = hashMapOf() val chatIdToBackupRecipientId: MutableMap = hashMapOf() val remoteToLocalColorId: MutableMap = hashMapOf() + + fun requireLocalRecipientId(remoteId: Long): RecipientId { + return remoteToLocalRecipientId[remoteId] ?: throw IllegalArgumentException("There is no local recipientId for remote recipientId $remoteId!") + } } class BackupMetadata( diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableArchiveExtensions.kt index 52394176ce..b100df773c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableArchiveExtensions.kt @@ -5,17 +5,10 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.database.AttachmentTable -fun AttachmentTable.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(AttachmentTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, AttachmentTable.TABLE_NAME) -} - fun AttachmentTable.restoreWallpaperAttachment(attachment: Attachment): AttachmentId? { return insertAttachmentsForMessage(AttachmentTable.WALLPAPER_MESSAGE_ID, listOf(attachment), emptyList()).values.firstOrNull() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallLinkTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallLinkTableArchiveExtensions.kt index 0ed2e934a4..28c499f983 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallLinkTableArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallLinkTableArchiveExtensions.kt @@ -5,8 +5,6 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll import org.signal.core.util.select import org.thoughtcrime.securesms.database.CallLinkTable @@ -14,12 +12,8 @@ fun CallLinkTable.getCallLinksForBackup(): CallLinkArchiveExporter { val cursor = readableDatabase .select() .from(CallLinkTable.TABLE_NAME) + .where("${CallLinkTable.ROOT_KEY} NOT NULL") .run() return CallLinkArchiveExporter(cursor) } - -fun CallLinkTable.clearAllDataForBackup() { - writableDatabase.deleteAll(CallLinkTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, CallLinkTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallTableArchiveExtensions.kt index 5ed0cfe8b2..1c780545d6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallTableArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/CallTableArchiveExtensions.kt @@ -5,8 +5,6 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll import org.signal.core.util.select import org.thoughtcrime.securesms.database.CallTable @@ -19,8 +17,3 @@ fun CallTable.getAdhocCallsForBackup(): AdHocCallArchiveExporter { .run() ) } - -fun CallTable.clearAllDataForBackup() { - writableDatabase.deleteAll(CallTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, CallTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatColorsTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatColorsTableArchiveExtensions.kt deleted file mode 100644 index e4458492c9..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatColorsTableArchiveExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2024 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.backup.v2.database - -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll -import org.thoughtcrime.securesms.database.ChatColorsTable - -fun ChatColorsTable.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(ChatColorsTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, ChatColorsTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt index ec13aa231f..2bd60d1f90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt @@ -5,8 +5,6 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll import org.signal.core.util.select import org.signal.core.util.withinTransaction import org.thoughtcrime.securesms.backup.v2.exporters.DistributionListArchiveExporter @@ -39,10 +37,3 @@ fun DistributionListTables.getMembersForBackup(id: DistributionListId): List rawMembers } } - -fun DistributionListTables.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(DistributionListTables.ListTable.TABLE_NAME) - writableDatabase.deleteAll(DistributionListTables.MembershipTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, DistributionListTables.ListTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, DistributionListTables.MembershipTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/InAppPaymentTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/InAppPaymentTableArchiveExtensions.kt deleted file mode 100644 index 3ed4bcd030..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/InAppPaymentTableArchiveExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2024 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.backup.v2.database - -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll -import org.thoughtcrime.securesms.database.InAppPaymentTable - -fun InAppPaymentTable.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(InAppPaymentTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, InAppPaymentTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/MessageTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/MessageTableArchiveExtensions.kt index 98a77f044c..a460f9c44c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/MessageTableArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/MessageTableArchiveExtensions.kt @@ -5,7 +5,6 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.SqlUtil import org.signal.core.util.select import org.thoughtcrime.securesms.backup.v2.ImportState import org.thoughtcrime.securesms.backup.v2.exporters.ChatItemArchiveExporter @@ -78,8 +77,3 @@ fun MessageTable.getMessagesForBackup(db: SignalDatabase, backupTime: Long, medi fun MessageTable.createChatItemInserter(importState: ImportState): ChatItemArchiveImporter { return ChatItemArchiveImporter(writableDatabase, importState, 500) } - -fun MessageTable.clearAllDataForBackupRestore() { - writableDatabase.delete(MessageTable.TABLE_NAME, null, null) - SqlUtil.resetAutoIncrementValue(writableDatabase, MessageTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ReactionTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ReactionTableArchiveExtensions.kt deleted file mode 100644 index cd5e8690b5..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ReactionTableArchiveExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2023 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.backup.v2.database - -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll -import org.thoughtcrime.securesms.database.ReactionTable - -fun ReactionTable.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(ReactionTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, ReactionTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableArchiveExtensions.kt index 4928136022..0bef7777e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableArchiveExtensions.kt @@ -7,8 +7,6 @@ package org.thoughtcrime.securesms.backup.v2.database import android.content.ContentValues import org.signal.core.util.Base64 -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.nullIfBlank import org.signal.core.util.select @@ -20,7 +18,6 @@ import org.thoughtcrime.securesms.backup.v2.proto.AccountData import org.thoughtcrime.securesms.database.GroupTable import org.thoughtcrime.securesms.database.RecipientTable import org.thoughtcrime.securesms.database.model.databaseprotos.RecipientExtras -import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.recipients.RecipientId @@ -123,15 +120,6 @@ fun RecipientTable.restoreSelfFromBackup(accountData: AccountData, selfId: Recip .run() } -fun RecipientTable.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(RecipientTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, RecipientTable.TABLE_NAME) - - RecipientId.clearCache() - AppDependencies.recipientCache.clear() - AppDependencies.recipientCache.clearSelf() -} - fun RecipientTable.restoreReleaseNotes(): RecipientId { val releaseChannelId: RecipientId = insertReleaseChannelRecipient() SignalStore.releaseChannel.setReleaseChannelRecipientId(releaseChannelId) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/StickerTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/StickerTableArchiveExtensions.kt deleted file mode 100644 index a9f5edf249..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/StickerTableArchiveExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2023 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.backup.v2.database - -import org.signal.core.util.SqlUtil -import org.signal.core.util.deleteAll -import org.thoughtcrime.securesms.database.StickerTable - -fun StickerTable.clearAllDataForBackupRestore() { - writableDatabase.deleteAll(StickerTable.TABLE_NAME) - SqlUtil.resetAutoIncrementValue(writableDatabase, StickerTable.TABLE_NAME) -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ThreadTableArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ThreadTableArchiveExtensions.kt index 6874572bb1..21b0f08150 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ThreadTableArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ThreadTableArchiveExtensions.kt @@ -5,7 +5,6 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.SqlUtil import org.thoughtcrime.securesms.backup.v2.exporters.ChatArchiveExporter import org.thoughtcrime.securesms.database.RecipientTable import org.thoughtcrime.securesms.database.SignalDatabase @@ -35,9 +34,3 @@ fun ThreadTable.getThreadsForBackup(db: SignalDatabase): ChatArchiveExporter { return ChatArchiveExporter(cursor, db) } - -fun ThreadTable.clearAllDataForBackupRestore() { - writableDatabase.delete(ThreadTable.TABLE_NAME, null, null) - SqlUtil.resetAutoIncrementValue(writableDatabase, ThreadTable.TABLE_NAME) - clearCache() -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/CallLinkArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/CallLinkArchiveExporter.kt index 90c0fb4da3..0da7cd2ca4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/CallLinkArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/CallLinkArchiveExporter.kt @@ -6,7 +6,6 @@ package org.thoughtcrime.securesms.backup.v2.database import android.database.Cursor -import okio.ByteString import okio.ByteString.Companion.toByteString import org.signal.ringrtc.CallLinkState import org.thoughtcrime.securesms.backup.v2.ArchiveRecipient @@ -32,8 +31,8 @@ class CallLinkArchiveExporter(private val cursor: Cursor) : Iterator CallTable.Event.GENERIC_GROUP_CALL AdHocCall.State.UNKNOWN_STATE -> CallTable.Event.GENERIC_GROUP_CALL } + val peer = importState.remoteToLocalRecipientId[call.recipientId] ?: run { + Log.w(TAG, "Failed to find matching recipientId for peer with remote recipientId ${call.recipientId}! Skipping.") + return + } + SignalDatabase.writableDatabase .insertInto(CallTable.TABLE_NAME) .values( CallTable.CALL_ID to call.callId, - CallTable.PEER to importState.remoteToLocalRecipientId[call.recipientId]!!.serialize(), + CallTable.PEER to peer.serialize(), CallTable.TYPE to CallTable.Type.serialize(CallTable.Type.AD_HOC_CALL), CallTable.DIRECTION to CallTable.Direction.serialize(CallTable.Direction.OUTGOING), CallTable.EVENT to CallTable.Event.serialize(event), diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/CallLinkArchiveImporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/CallLinkArchiveImporter.kt index c1d7d1bad5..8cfc1ee2ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/CallLinkArchiveImporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/CallLinkArchiveImporter.kt @@ -5,6 +5,8 @@ package org.thoughtcrime.securesms.backup.v2.importer +import org.signal.core.util.isEmpty +import org.signal.core.util.logging.Log import org.signal.ringrtc.CallLinkRootKey import org.signal.ringrtc.CallLinkState import org.thoughtcrime.securesms.backup.v2.ArchiveCallLink @@ -21,13 +23,21 @@ import java.time.Instant * Handles the importing of [ArchiveCallLink] models into the local database. */ object CallLinkArchiveImporter { + + private val TAG = Log.tag(CallLinkArchiveImporter::class) + fun import(callLink: ArchiveCallLink): RecipientId? { - val rootKey: CallLinkRootKey - try { - rootKey = CallLinkRootKey(callLink.rootKey.toByteArray()) + val rootKey: CallLinkRootKey = try { + CallLinkRootKey(callLink.rootKey.toByteArray()) } catch (e: Exception) { + if (callLink.rootKey.isEmpty()) { + Log.w(TAG, "Missing root key!") + } else { + Log.w(TAG, "Failed to parse a non-empty root key!") + } return null } + return SignalDatabase.callLinks.insertCallLink( CallLinkTable.CallLink( recipientId = RecipientId.UNKNOWN, diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt index b633cd7e2b..20b89080b4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt @@ -875,7 +875,7 @@ class ChatItemArchiveImporter( private fun ContentValues.addQuote(quote: Quote) { this.put(MessageTable.QUOTE_ID, quote.targetSentTimestamp ?: MessageTable.QUOTE_TARGET_MISSING_ID) - this.put(MessageTable.QUOTE_AUTHOR, importState.remoteToLocalRecipientId[quote.authorId]!!.serialize()) + this.put(MessageTable.QUOTE_AUTHOR, importState.requireLocalRecipientId(quote.authorId).serialize()) this.put(MessageTable.QUOTE_BODY, quote.text?.body) this.put(MessageTable.QUOTE_TYPE, quote.type.toLocalQuoteType()) this.put(MessageTable.QUOTE_BODY_RANGES, quote.text?.bodyRanges?.toLocalBodyRanges()?.encode()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatus.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatusBanner.kt similarity index 91% rename from app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatus.kt rename to app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatusBanner.kt index 43122837f2..d955da0ef8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatus.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatusBanner.kt @@ -55,7 +55,7 @@ private const val NONE = -1 */ @OptIn(ExperimentalLayoutApi::class) @Composable -fun BackupStatus( +fun BackupStatusBanner( data: BackupStatusData, onSkipClick: () -> Unit = {}, onDismissClick: () -> Unit = {}, @@ -147,16 +147,36 @@ fun BackupStatus( @SignalPreview @Composable -fun BackupStatusPreview() { +fun BackupStatusBannerPreview() { Previews.Preview { Column { - BackupStatus( + BackupStatusBanner( data = BackupStatusData.RestoringMedia(5755000.bytes, 1253.mebiBytes) ) HorizontalDivider() - BackupStatus( + BackupStatusBanner( + data = BackupStatusData.RestoringMedia( + bytesDownloaded = 55000.bytes, + bytesTotal = 1253.mebiBytes, + restoreStatus = BackupStatusData.RestoreStatus.WAITING_FOR_WIFI + ) + ) + + HorizontalDivider() + + BackupStatusBanner( + data = BackupStatusData.RestoringMedia( + bytesDownloaded = 55000.bytes, + bytesTotal = 1253.mebiBytes, + restoreStatus = BackupStatusData.RestoreStatus.WAITING_FOR_INTERNET + ) + ) + + HorizontalDivider() + + BackupStatusBanner( data = BackupStatusData.RestoringMedia( bytesDownloaded = 55000.bytes, bytesTotal = 1253.mebiBytes, @@ -166,13 +186,13 @@ fun BackupStatusPreview() { HorizontalDivider() - BackupStatus( + BackupStatusBanner( data = BackupStatusData.NotEnoughFreeSpace(40900.kibiBytes) ) HorizontalDivider() - BackupStatus( + BackupStatusBanner( data = BackupStatusData.CouldNotCompleteBackup ) } @@ -221,7 +241,7 @@ sealed interface BackupStatusData { class NotEnoughFreeSpace( requiredSpace: ByteSize ) : BackupStatusData { - private val requiredSpace = requiredSpace.toUnitString(maxPlaces = 2) + val requiredSpace = requiredSpace.toUnitString(maxPlaces = 2) override val iconRes: Int = R.drawable.symbol_backup_error_24 diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatusRow.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatusRow.kt new file mode 100644 index 0000000000..31a51a5aea --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/status/BackupStatusRow.kt @@ -0,0 +1,240 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui.status + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.text.InlineTextContent +import androidx.compose.foundation.text.appendInlineContent +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.Placeholder +import androidx.compose.ui.text.PlaceholderVerticalAlign +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.signal.core.ui.Previews +import org.signal.core.ui.Rows +import org.signal.core.ui.SignalPreview +import org.signal.core.util.ByteSize +import org.thoughtcrime.securesms.R +import kotlin.math.roundToInt + +/** + * Backup status displayable as a row on a settings page. + */ +@Composable +fun BackupStatusRow( + backupStatusData: BackupStatusData, + onSkipClick: () -> Unit = {}, + onCancelClick: () -> Unit = {} +) { + Column { + if (backupStatusData !is BackupStatusData.CouldNotCompleteBackup) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.core_ui__gutter)) + ) { + LinearProgressIndicator( + color = progressColor(backupStatusData), + progress = { backupStatusData.progress }, + modifier = Modifier.weight(1f) + ) + + IconButton( + onClick = onCancelClick + ) { + Icon( + painter = painterResource(R.drawable.symbol_x_24), + contentDescription = stringResource(R.string.BackupStatusRow__cancel_download) + ) + } + } + } + + when (backupStatusData) { + is BackupStatusData.RestoringMedia -> { + Text( + text = getRestoringMediaString(backupStatusData), + modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.core_ui__gutter)) + ) + } + + is BackupStatusData.NotEnoughFreeSpace -> { + Text( + text = stringResource( + R.string.BackupStatusRow__not_enough_space, + backupStatusData.requiredSpace, + "%d".format((backupStatusData.progress * 100).roundToInt()) + ), + modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.core_ui__gutter)) + ) + + Rows.TextRow( + text = stringResource(R.string.BackupStatusRow__skip_download), + onClick = onSkipClick + ) + } + + BackupStatusData.CouldNotCompleteBackup -> { + val inlineContentMap = mapOf( + "yellow_bullet" to InlineTextContent( + Placeholder(12.sp, 12.sp, PlaceholderVerticalAlign.TextCenter) + ) { + Box( + modifier = Modifier + .size(12.dp) + .background(color = backupStatusData.iconColors.foreground, shape = CircleShape) + ) + } + ) + + Text( + text = buildAnnotatedString { + appendInlineContent("yellow_bullet") + append(" ") + append(stringResource(R.string.BackupStatusRow__your_last_backup)) + }, + inlineContent = inlineContentMap, + modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.core_ui__gutter)) + ) + } + } + } +} + +@Composable +private fun getRestoringMediaString(backupStatusData: BackupStatusData.RestoringMedia): String { + return when (backupStatusData.restoreStatus) { + BackupStatusData.RestoreStatus.NORMAL -> { + stringResource( + R.string.BackupStatusRow__downloading_s_of_s_s, + backupStatusData.bytesDownloaded.toUnitString(2), + backupStatusData.bytesTotal.toUnitString(2), + "%d".format((backupStatusData.progress * 100).roundToInt()) + ) + } + BackupStatusData.RestoreStatus.LOW_BATTERY -> stringResource(R.string.BackupStatus__status_device_has_low_battery) + BackupStatusData.RestoreStatus.WAITING_FOR_INTERNET -> stringResource(R.string.BackupStatus__status_no_internet) + BackupStatusData.RestoreStatus.WAITING_FOR_WIFI -> stringResource(R.string.BackupStatus__status_waiting_for_wifi) + BackupStatusData.RestoreStatus.FINISHED -> stringResource(R.string.BackupStatus__restore_complete) + } +} + +@Composable +private fun progressColor(backupStatusData: BackupStatusData): Color { + return when (backupStatusData) { + is BackupStatusData.RestoringMedia -> MaterialTheme.colorScheme.primary + else -> backupStatusData.iconColors.foreground + } +} + +@SignalPreview +@Composable +fun BackupStatusRowNormalPreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.RestoringMedia( + bytesTotal = ByteSize(100), + bytesDownloaded = ByteSize(50), + restoreStatus = BackupStatusData.RestoreStatus.NORMAL + ) + ) + } +} + +@SignalPreview +@Composable +fun BackupStatusRowWaitingForWifiPreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.RestoringMedia( + bytesTotal = ByteSize(100), + bytesDownloaded = ByteSize(50), + restoreStatus = BackupStatusData.RestoreStatus.WAITING_FOR_WIFI + ) + ) + } +} + +@SignalPreview +@Composable +fun BackupStatusRowWaitingForInternetPreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.RestoringMedia( + bytesTotal = ByteSize(100), + bytesDownloaded = ByteSize(50), + restoreStatus = BackupStatusData.RestoreStatus.WAITING_FOR_INTERNET + ) + ) + } +} + +@SignalPreview +@Composable +fun BackupStatusRowLowBatteryPreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.RestoringMedia( + bytesTotal = ByteSize(100), + bytesDownloaded = ByteSize(50), + restoreStatus = BackupStatusData.RestoreStatus.LOW_BATTERY + ) + ) + } +} + +@SignalPreview +@Composable +fun BackupStatusRowFinishedPreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.RestoringMedia( + bytesTotal = ByteSize(100), + bytesDownloaded = ByteSize(50), + restoreStatus = BackupStatusData.RestoreStatus.FINISHED + ) + ) + } +} + +@SignalPreview +@Composable +fun BackupStatusRowNotEnoughFreeSpacePreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.NotEnoughFreeSpace( + requiredSpace = ByteSize(50) + ) + ) + } +} + +@SignalPreview +@Composable +fun BackupStatusRowCouldNotCompleteBackupPreview() { + Previews.Preview { + BackupStatusRow( + backupStatusData = BackupStatusData.CouldNotCompleteBackup + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner.kt b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner.kt index 88124836ca..aad635e31c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/MediaRestoreProgressBanner.kt @@ -23,7 +23,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import org.signal.core.util.bytes import org.signal.core.util.throttleLatest -import org.thoughtcrime.securesms.backup.v2.ui.status.BackupStatus +import org.thoughtcrime.securesms.backup.v2.ui.status.BackupStatusBanner import org.thoughtcrime.securesms.backup.v2.ui.status.BackupStatusData import org.thoughtcrime.securesms.banner.Banner import org.thoughtcrime.securesms.database.DatabaseObserver @@ -71,7 +71,7 @@ class MediaRestoreProgressBanner(private val listener: RestoreProgressBannerList @Composable override fun DisplayBanner(model: BackupStatusData, contentPadding: PaddingValues) { - BackupStatus( + BackupStatusBanner( data = model, onSkipClick = listener::onSkip, onDismissClick = listener::onDismissComplete diff --git a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java index ce6489879d..3c5492f053 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ContactFilterView; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; @@ -97,7 +98,7 @@ protected void onResume() { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { final String displayName = recipientId.map(id -> Recipient.resolved(id).getDisplayName(this)).orElse(number); AlertDialog confirmationDialog = new MaterialAlertDialogBuilder(this) @@ -126,7 +127,7 @@ public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Opt } @Override - public void onContactDeselected(@NonNull Optional recipientId, String number) { + public void onContactDeselected(@NonNull Optional recipientId, String number, @NonNull Optional chatType) { } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt index aaaa90b57a..8e954c6b9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt @@ -63,7 +63,6 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.stories.tabs.ConversationListTab import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel import org.thoughtcrime.securesms.util.CommunicationActions -import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.doAfterNextLayout import org.thoughtcrime.securesms.util.fragments.requireListener @@ -259,13 +258,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal val count = callLogActionMode.getCount() MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getQuantityString(R.plurals.CallLogFragment__delete_d_calls, count, count)) - .setMessage( - if (RemoteConfig.adHocCalling) { - getString(R.string.CallLogFragment__call_links_youve_created) - } else { - null - } - ) + .setMessage(getString(R.string.CallLogFragment__call_links_youve_created)) .setPositiveButton(R.string.CallLogFragment__delete) { _, _ -> performDeletion(count, viewModel.stageSelectionDeletion()) callLogActionMode.end() @@ -416,13 +409,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal override fun deleteCall(call: CallLogRow) { MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getQuantityString(R.plurals.CallLogFragment__delete_d_calls, 1, 1)) - .setMessage( - if (RemoteConfig.adHocCalling) { - getString(R.string.CallLogFragment__call_links_youve_created) - } else { - null - } - ) + .setMessage(getString(R.string.CallLogFragment__call_links_youve_created)) .setPositiveButton(R.string.CallLogFragment__delete) { _, _ -> performDeletion(1, viewModel.stageCallDeletion(call)) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt index 635ce62046..3da5392b5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt @@ -1,7 +1,8 @@ package org.thoughtcrime.securesms.calls.log +import org.signal.core.util.Stopwatch +import org.signal.core.util.logging.Log import org.signal.paging.PagedDataSource -import org.thoughtcrime.securesms.util.RemoteConfig class CallLogPagedDataSource( private val query: String?, @@ -9,19 +10,32 @@ class CallLogPagedDataSource( private val repository: CallRepository ) : PagedDataSource { + companion object { + private val TAG = Log.tag(CallLogPagedDataSource::class) + } + private val hasFilter = filter == CallLogFilter.MISSED - private val hasCallLinkRow = RemoteConfig.adHocCalling && filter == CallLogFilter.ALL && query.isNullOrEmpty() + private val hasCallLinkRow = filter == CallLogFilter.ALL && query.isNullOrEmpty() private var callEventsCount = 0 private var callLinksCount = 0 override fun size(): Int { + val stopwatch = Stopwatch("size") + callEventsCount = repository.getCallsCount(query, filter) + stopwatch.split("calls") + callLinksCount = repository.getCallLinksCount(query, filter) + stopwatch.split("call-links") + stopwatch.stop(TAG) + return callEventsCount + callLinksCount + hasFilter.toInt() + hasCallLinkRow.toInt() } override fun load(start: Int, length: Int, totalSize: Int, cancellationSignal: PagedDataSource.CancellationSignal): MutableList { + val stopwatch = Stopwatch("load($start, $length)") + val callLogRows = mutableListOf() if (length <= 0) { return callLogRows @@ -36,6 +50,7 @@ class CallLogPagedDataSource( callLogRows.add(CallLogRow.CreateCallLink) remaining -= 1 } + stopwatch.split("init") if (start < callEventStart && remaining > 0) { val callLinks = repository.getCallLinks( @@ -49,6 +64,7 @@ class CallLogPagedDataSource( remaining -= callLinks.size } + stopwatch.split("call-links") if (start < clearFilterStart && remaining > 0) { val callEvents = repository.getCalls( @@ -62,12 +78,16 @@ class CallLogPagedDataSource( remaining -= callEvents.size } + stopwatch.split("calls") if (hasFilter && start <= clearFilterStart && remaining > 0) { callLogRows.add(CallLogRow.ClearFilter) } repository.onCallTabPageLoaded(callLogRows) + stopwatch.split("callback") + stopwatch.stop(TAG) + return callLogRows } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogRepository.kt index 5a6003d76b..5c137d4205 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogRepository.kt @@ -66,7 +66,6 @@ class CallLogRepository( refresh() } - AppDependencies.databaseObserver.registerConversationListObserver(databaseObserver) AppDependencies.databaseObserver.registerCallUpdateObserver(databaseObserver) emitter.setCancellable { diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt index 860709564c..6cdd69ca95 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt @@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.InviteActivity import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.calls.YouAreAlreadyInACallSnackbar import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode +import org.thoughtcrime.securesms.contacts.paged.ChatType import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId @@ -38,7 +39,7 @@ class NewCallActivity : ContactSelectionActivity(), ContactSelectionListFragment override fun onSelectionChanged() = Unit - override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, callback: Consumer) { + override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, chatType: Optional, callback: Consumer) { if (recipientId.isPresent) { launch(Recipient.resolved(recipientId.get())) } else { 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 b254011987..b1f4fdbed2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java @@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.ContextUtil; import org.thoughtcrime.securesms.util.DrawableUtil; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SpanUtil; import org.thoughtcrime.securesms.util.ViewUtil; @@ -44,6 +45,10 @@ public void setText(Recipient recipient, @Nullable CharSequence fromString, @Nul } public void setText(Recipient recipient, @Nullable CharSequence fromString, @Nullable CharSequence suffix, boolean asThread, boolean showSelfAsYou) { + setText(recipient, fromString, suffix, asThread, showSelfAsYou, false); + } + + public void setText(Recipient recipient, @Nullable CharSequence fromString, @Nullable CharSequence suffix, boolean asThread, boolean showSelfAsYou, boolean isPinned) { SpannableStringBuilder builder = new SpannableStringBuilder(); if (asThread && recipient.isSelf() && showSelfAsYou) { @@ -66,25 +71,34 @@ public void setText(Recipient recipient, @Nullable CharSequence fromString, @Nul .append(SpanUtil.buildCenteredImageSpan(official)); } + if (recipient.isMuted()) { + builder.append(" ") + .append(SpanUtil.buildCenteredImageSpan(getMuted())); + } + setText(builder); - if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(getBlocked(), null, null, null); - else if (recipient.isMuted()) setCompoundDrawablesRelativeWithIntrinsicBounds(getMuted(), null, null, null); - else setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0); + if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(getBlocked(), null, null, null); + else if (RemoteConfig.getShowChatFolders() && isPinned) setCompoundDrawablesRelativeWithIntrinsicBounds(getPinned(), null, null, null); + else setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0); } private Drawable getBlocked() { - return getDrawable(R.drawable.symbol_block_16); + return getDrawable(R.drawable.symbol_block_16, R.color.signal_icon_tint_secondary); } private Drawable getMuted() { - return getDrawable(R.drawable.ic_bell_disabled_16); + return getDrawable(R.drawable.ic_bell_disabled_16, R.color.signal_icon_tint_secondary); + } + + private Drawable getPinned() { + return getDrawable(R.drawable.symbol_pin_16, R.color.signal_colorOnSurface); } - private Drawable getDrawable(@DrawableRes int drawable) { + private Drawable getDrawable(@DrawableRes int drawable, int colorRes) { Drawable mutedDrawable = ContextUtil.requireDrawable(getContext(), drawable); - mutedDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); - DrawableUtil.tint(mutedDrawable, ContextCompat.getColor(getContext(), R.color.signal_icon_tint_secondary)); + mutedDrawable.setBounds(0, 0, ViewUtil.dpToPx(16), ViewUtil.dpToPx(16)); + DrawableUtil.tint(mutedDrawable, ContextCompat.getColor(getContext(), colorRes)); return mutedDrawable; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt index 3f69b31b1b..5459f3d515 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt @@ -11,6 +11,8 @@ import org.signal.donations.InAppPaymentType import org.thoughtcrime.securesms.MainActivity import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLSettingsActivity +import org.thoughtcrime.securesms.components.settings.app.chats.folders.CreateFoldersFragmentArgs +import org.thoughtcrime.securesms.components.settings.app.notifications.NotificationsSettingsFragmentArgs import org.thoughtcrime.securesms.components.settings.app.notifications.profiles.EditNotificationProfileScheduleFragmentArgs import org.thoughtcrime.securesms.components.settings.app.subscription.InAppPaymentComponent import org.thoughtcrime.securesms.components.settings.app.subscription.StripeRepository @@ -54,7 +56,7 @@ class AppSettingsActivity : DSLSettingsActivity(), InAppPaymentComponent { .setStartCategoryIndex(intent.getIntExtra(HelpFragment.START_CATEGORY_INDEX, 0)) StartLocation.PROXY -> AppSettingsFragmentDirections.actionDirectToNetworkPreferenceFragment() StartLocation.NOTIFICATIONS -> AppSettingsFragmentDirections.actionDirectToNotificationsSettingsFragment() - StartLocation.PUSH_NOTIFICATIONS -> AppSettingsFragmentDirections.actionDirectToNotificationsSettingsFragment().setScrollToPushServices(true) + .setPlayServicesErrorCode(NotificationsSettingsFragmentArgs.fromBundle(intent.getBundleExtra(START_ARGUMENTS)!!).playServicesErrorCode) StartLocation.CHANGE_NUMBER -> AppSettingsFragmentDirections.actionDirectToChangeNumberFragment() StartLocation.SUBSCRIPTIONS -> AppSettingsFragmentDirections.actionDirectToManageDonations().setDirectToCheckoutType(InAppPaymentType.RECURRING_DONATION) StartLocation.MANAGE_SUBSCRIPTIONS -> AppSettingsFragmentDirections.actionDirectToManageDonations() @@ -68,6 +70,10 @@ class AppSettingsActivity : DSLSettingsActivity(), InAppPaymentComponent { StartLocation.USERNAME_LINK -> AppSettingsFragmentDirections.actionDirectToUsernameLinkSettings() StartLocation.RECOVER_USERNAME -> AppSettingsFragmentDirections.actionDirectToUsernameRecovery() StartLocation.REMOTE_BACKUPS -> AppSettingsFragmentDirections.actionDirectToRemoteBackupsSettingsFragment() + StartLocation.CHAT_FOLDERS -> AppSettingsFragmentDirections.actionDirectToChatFoldersFragment() + StartLocation.CREATE_CHAT_FOLDER -> AppSettingsFragmentDirections.actionDirectToCreateFoldersFragment( + CreateFoldersFragmentArgs.fromBundle(intent.getBundleExtra(START_ARGUMENTS)!!).folderId + ) } } @@ -156,7 +162,14 @@ class AppSettingsActivity : DSLSettingsActivity(), InAppPaymentComponent { fun notifications(context: Context): Intent = getIntentForStartLocation(context, StartLocation.NOTIFICATIONS) @JvmStatic - fun pushNotifications(context: Context): Intent = getIntentForStartLocation(context, StartLocation.PUSH_NOTIFICATIONS) + fun playServicesProblem(context: Context, errorCode: Int): Intent { + val arguments = NotificationsSettingsFragmentArgs.Builder() + .setPlayServicesErrorCode(errorCode) + .build() + .toBundle() + + return getIntentForStartLocation(context, StartLocation.NOTIFICATIONS).putExtra(START_ARGUMENTS, arguments) + } @JvmStatic fun changeNumber(context: Context): Intent = getIntentForStartLocation(context, StartLocation.CHANGE_NUMBER) @@ -198,6 +211,18 @@ class AppSettingsActivity : DSLSettingsActivity(), InAppPaymentComponent { @JvmStatic fun remoteBackups(context: Context): Intent = getIntentForStartLocation(context, StartLocation.REMOTE_BACKUPS) + @JvmStatic + fun chatFolders(context: Context): Intent = getIntentForStartLocation(context, StartLocation.CHAT_FOLDERS) + + @JvmStatic + fun createChatFolder(context: Context, id: Long = -1): Intent { + val arguments = CreateFoldersFragmentArgs.Builder(id) + .build() + .toBundle() + + return getIntentForStartLocation(context, StartLocation.CREATE_CHAT_FOLDER).putExtra(START_ARGUMENTS, arguments) + } + private fun getIntentForStartLocation(context: Context, startLocation: StartLocation): Intent { return Intent(context, AppSettingsActivity::class.java) .putExtra(ARG_NAV_GRAPH, R.navigation.app_settings_with_change_number) @@ -211,7 +236,6 @@ class AppSettingsActivity : DSLSettingsActivity(), InAppPaymentComponent { HELP(2), PROXY(3), NOTIFICATIONS(4), - PUSH_NOTIFICATIONS(1004), CHANGE_NUMBER(5), SUBSCRIPTIONS(6), // BOOST(7), @@ -223,7 +247,9 @@ class AppSettingsActivity : DSLSettingsActivity(), InAppPaymentComponent { LINKED_DEVICES(13), USERNAME_LINK(14), RECOVER_USERNAME(15), - REMOTE_BACKUPS(16); + REMOTE_BACKUPS(16), + CHAT_FOLDERS(17), + CREATE_CHAT_FOLDER(18); companion object { fun fromCode(code: Int?): StartLocation { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt index 668d46ac7b..967d7474ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt @@ -23,6 +23,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialogDefaults @@ -66,6 +67,7 @@ import org.signal.core.ui.Scaffolds import org.signal.core.ui.SignalPreview import org.signal.core.ui.Snackbars import org.signal.core.ui.Texts +import org.signal.core.ui.horizontalGutters import org.signal.core.ui.theme.SignalTheme import org.signal.core.util.logging.Log import org.signal.core.util.money.FiatMoney @@ -119,6 +121,7 @@ class RemoteBackupsSettingsFragment : ComposeFragment() { val callbacks = remember { Callbacks() } RemoteBackupsSettingsContent( + backupsInitialized = state.backupsInitialized, messageBackupsType = state.messageBackupsType, lastBackupTimestamp = state.lastBackupTimestamp, canBackUpUsingCellular = state.canBackUpUsingCellular, @@ -128,7 +131,8 @@ class RemoteBackupsSettingsFragment : ComposeFragment() { contentCallbacks = callbacks, backupProgress = backupProgress, backupSize = state.backupSize, - renewalTime = state.renewalTime + renewalTime = state.renewalTime, + backupState = state.backupState ) } @@ -145,6 +149,10 @@ class RemoteBackupsSettingsFragment : ComposeFragment() { } } + override fun onLaunchBackupsCheckoutFlow() { + checkoutLauncher.launch(null) + } + override fun onBackUpUsingCellularClick(canUseCellular: Boolean) { viewModel.setCanBackUpUsingCellular(canUseCellular) } @@ -245,6 +253,7 @@ class RemoteBackupsSettingsFragment : ComposeFragment() { */ private interface ContentCallbacks { fun onNavigationClick() = Unit + fun onLaunchBackupsCheckoutFlow() = Unit fun onBackupTypeActionClick(tier: MessageBackupTier) = Unit fun onBackUpUsingCellularClick(canUseCellular: Boolean) = Unit fun onBackupNowClick() = Unit @@ -259,7 +268,9 @@ private interface ContentCallbacks { @Composable private fun RemoteBackupsSettingsContent( + backupsInitialized: Boolean, messageBackupsType: MessageBackupsType?, + backupState: RemoteBackupsSettingsState.BackupState, renewalTime: Duration, lastBackupTimestamp: Long, canBackUpUsingCellular: Boolean, @@ -286,101 +297,65 @@ private fun RemoteBackupsSettingsContent( modifier = Modifier .padding(it) ) { - if (messageBackupsType != null) { + if (backupState == RemoteBackupsSettingsState.BackupState.LOADING) { + item { + LoadingCard() + } + } else if (backupState == RemoteBackupsSettingsState.BackupState.ERROR) { + item { + ErrorCard() + } + } else if (messageBackupsType != null) { item { - BackupTypeRow( + BackupCard( messageBackupsType = messageBackupsType, renewalTime = renewalTime, + backupState = backupState, onBackupTypeActionButtonClicked = contentCallbacks::onBackupTypeActionClick ) } } - item { - Texts.SectionHeader(text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_details)) - } + if (backupsInitialized) { + appendBackupDetailsItems( + backupProgress = backupProgress, + lastBackupTimestamp = lastBackupTimestamp, + backupSize = backupSize, + backupsFrequency = backupsFrequency, + canBackUpUsingCellular = canBackUpUsingCellular, + contentCallbacks = contentCallbacks + ) + } else { + // TODO [backups] -- Download progress bar / state if required. - if (backupProgress == null || backupProgress.state == ArchiveUploadProgressState.State.None) { item { - LastBackupRow( - lastBackupTimestamp = lastBackupTimestamp, - onBackupNowClick = contentCallbacks::onBackupNowClick + Text( + text = stringResource(R.string.RemoteBackupsSettingsFragment__backups_have_been_turned_off), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(top = 24.dp, bottom = 20.dp) ) } - } else { - item { - InProgressBackupRow(progress = backupProgress.completedAttachments.toInt(), totalProgress = backupProgress.totalAttachments.toInt()) - } - } - item { - Rows.TextRow(text = { - Column { - Text( - text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_size), - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurface - ) - Text( - text = Util.getPrettyFileSize(backupSize), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) + item { + Buttons.LargePrimary( + onClick = { contentCallbacks.onBackupTypeActionClick(MessageBackupTier.FREE) }, + modifier = Modifier.horizontalGutters() + ) { + Text(text = stringResource(R.string.RemoteBackupsSettingsFragment__reenable_backups)) } - }) - } - - item { - Rows.TextRow( - text = { - Column { - Text( - text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_frequency), - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurface - ) - Text( - text = getTextForFrequency(backupsFrequency = backupsFrequency), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } - }, - onClick = contentCallbacks::onChangeBackupFrequencyClick - ) - } - - item { - Rows.ToggleRow( - checked = canBackUpUsingCellular, - text = stringResource(id = R.string.RemoteBackupsSettingsFragment__back_up_using_cellular), - onCheckChanged = contentCallbacks::onBackUpUsingCellularClick - ) - } - - item { - Rows.TextRow( - text = stringResource(R.string.RemoteBackupsSettingsFragment__view_backup_key), - onClick = contentCallbacks::onViewBackupKeyClick - ) - } - - item { - Dividers.Default() - } - - item { - Rows.TextRow( - text = stringResource(id = R.string.RemoteBackupsSettingsFragment__turn_off_and_delete_backup), - foregroundTint = MaterialTheme.colorScheme.error, - onClick = contentCallbacks::onTurnOffAndDeleteBackupsClick - ) + } } } } when (requestedDialog) { RemoteBackupsSettingsState.Dialog.NONE -> {} + RemoteBackupsSettingsState.Dialog.TURN_OFF_FAILED -> { + FailedToTurnOffBackupDialog( + onDismiss = contentCallbacks::onDialogDismissed + ) + } + RemoteBackupsSettingsState.Dialog.TURN_OFF_AND_DELETE_BACKUPS -> { TurnOffAndDeleteBackupsDialog( onConfirm = contentCallbacks::onTurnOffAndDeleteBackupsConfirm, @@ -431,9 +406,104 @@ private fun RemoteBackupsSettingsContent( } } +private fun LazyListScope.appendBackupDetailsItems( + backupProgress: ArchiveUploadProgressState?, + lastBackupTimestamp: Long, + backupSize: Long, + backupsFrequency: BackupFrequency, + canBackUpUsingCellular: Boolean, + contentCallbacks: ContentCallbacks +) { + item { + Dividers.Default() + } + + item { + Texts.SectionHeader(text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_details)) + } + + if (backupProgress == null || backupProgress.state == ArchiveUploadProgressState.State.None) { + item { + LastBackupRow( + lastBackupTimestamp = lastBackupTimestamp, + onBackupNowClick = contentCallbacks::onBackupNowClick + ) + } + } else { + item { + InProgressBackupRow(progress = backupProgress.completedAttachments.toInt(), totalProgress = backupProgress.totalAttachments.toInt()) + } + } + + item { + Rows.TextRow(text = { + Column { + Text( + text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_size), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface + ) + Text( + text = Util.getPrettyFileSize(backupSize), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + }) + } + + item { + Rows.TextRow( + text = { + Column { + Text( + text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_frequency), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface + ) + Text( + text = getTextForFrequency(backupsFrequency = backupsFrequency), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + }, + onClick = contentCallbacks::onChangeBackupFrequencyClick + ) + } + + item { + Rows.ToggleRow( + checked = canBackUpUsingCellular, + text = stringResource(id = R.string.RemoteBackupsSettingsFragment__back_up_using_cellular), + onCheckChanged = contentCallbacks::onBackUpUsingCellularClick + ) + } + + item { + Rows.TextRow( + text = stringResource(R.string.RemoteBackupsSettingsFragment__view_backup_key), + onClick = contentCallbacks::onViewBackupKeyClick + ) + } + + item { + Dividers.Default() + } + + item { + Rows.TextRow( + text = stringResource(id = R.string.RemoteBackupsSettingsFragment__turn_off_and_delete_backup), + foregroundTint = MaterialTheme.colorScheme.error, + onClick = contentCallbacks::onTurnOffAndDeleteBackupsClick + ) + } +} + @Composable -private fun BackupTypeRow( +private fun BackupCard( messageBackupsType: MessageBackupsType, + backupState: RemoteBackupsSettingsState.BackupState, renewalTime: Duration, onBackupTypeActionButtonClicked: (MessageBackupTier) -> Unit = {} ) { @@ -453,28 +523,63 @@ private fun BackupTypeRow( Text( text = buildAnnotatedString { - SignalSymbol(SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.CHECKMARK) - append(" ") + if (backupState == RemoteBackupsSettingsState.BackupState.ACTIVE) { + SignalSymbol(SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.CHECKMARK) + append(" ") + } + append(title) }, color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) - val cost = when (messageBackupsType) { - is MessageBackupsType.Paid -> stringResource(R.string.RemoteBackupsSettingsFragment__s_per_month, FiatMoneyUtil.format(LocalContext.current.resources, messageBackupsType.pricePerMonth)) - is MessageBackupsType.Free -> stringResource(R.string.RemoteBackupsSettingsFragment__your_backup_plan_is_free) - } + when (backupState) { + RemoteBackupsSettingsState.BackupState.ACTIVE -> { + val cost = when (messageBackupsType) { + is MessageBackupsType.Paid -> stringResource(R.string.RemoteBackupsSettingsFragment__s_per_month, FiatMoneyUtil.format(LocalContext.current.resources, messageBackupsType.pricePerMonth)) + is MessageBackupsType.Free -> stringResource(R.string.RemoteBackupsSettingsFragment__your_backup_plan_is_free) + } - Text( - text = cost, - modifier = Modifier.padding(top = 12.dp) - ) + Text( + text = cost, + modifier = Modifier.padding(top = 12.dp) + ) + } + + RemoteBackupsSettingsState.BackupState.INACTIVE -> { + Text( + text = stringResource(R.string.RemoteBackupsSettingsFragment__subscription_inactive), + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(top = 8.dp) + ) + } + + RemoteBackupsSettingsState.BackupState.CANCELED -> { + Text( + text = stringResource(R.string.RemoteBackupsSettingsFragment__subscription_cancelled), + color = MaterialTheme.colorScheme.error, + style = MaterialTheme.typography.labelLarge, + modifier = Modifier.padding(top = 8.dp) + ) + } + + else -> error("Not supported here.") + } if (messageBackupsType is MessageBackupsType.Paid) { + @Suppress("KotlinConstantConditions") + val resource = when (backupState) { + RemoteBackupsSettingsState.BackupState.ACTIVE -> R.string.RemoteBackupsSettingsFragment__renews_s + RemoteBackupsSettingsState.BackupState.INACTIVE -> R.string.RemoteBackupsSettingsFragment__expired_on_s + RemoteBackupsSettingsState.BackupState.CANCELED -> R.string.RemoteBackupsSettingsFragment__expires_on_s + else -> error("Not supported here.") + } + if (renewalTime > 0.seconds) { Text( - text = stringResource(R.string.RemoteBackupsSettingsFragment__renews_s, DateUtils.formatDateWithYear(Locale.getDefault(), renewalTime.inWholeMilliseconds)) + text = stringResource(resource, DateUtils.formatDateWithYear(Locale.getDefault(), renewalTime.inWholeMilliseconds)) ) } } @@ -494,21 +599,52 @@ private fun BackupTypeRow( is MessageBackupsType.Free -> stringResource(R.string.RemoteBackupsSettingsFragment__upgrade) } - Buttons.LargeTonal( - onClick = { onBackupTypeActionButtonClicked(messageBackupsType.tier) }, - colors = ButtonDefaults.filledTonalButtonColors().copy( - containerColor = SignalTheme.colors.colorTransparent5, - contentColor = colorResource(R.color.signal_light_colorOnSurface) - ), - modifier = Modifier.padding(top = 12.dp) - ) { - Text( - text = buttonText - ) + if (backupState == RemoteBackupsSettingsState.BackupState.ACTIVE) { + Buttons.LargeTonal( + onClick = { onBackupTypeActionButtonClicked(messageBackupsType.tier) }, + colors = ButtonDefaults.filledTonalButtonColors().copy( + containerColor = SignalTheme.colors.colorTransparent5, + contentColor = colorResource(R.color.signal_light_colorOnSurface) + ), + modifier = Modifier.padding(top = 12.dp) + ) { + Text( + text = buttonText + ) + } } } } +@Composable +private fun BoxCard(content: @Composable () -> Unit) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minHeight = 150.dp) + .padding(horizontal = 16.dp, vertical = 12.dp) + .background(color = SignalTheme.colors.colorSurface2, shape = RoundedCornerShape(12.dp)) + .padding(24.dp) + ) { + content() + } +} + +@Composable +private fun LoadingCard() { + BoxCard { + CircularProgressIndicator() + } +} + +@Composable +private fun ErrorCard() { + BoxCard { + Text(text = "Error") // TODO [alex] -- Finalized error card + } +} + @Composable private fun InProgressBackupRow( progress: Int?, @@ -590,6 +726,19 @@ private fun LastBackupRow( } } +@Composable +private fun FailedToTurnOffBackupDialog( + onDismiss: () -> Unit +) { + Dialogs.SimpleAlertDialog( + title = "TODO", + body = "TODO", + confirm = stringResource(id = android.R.string.ok), + onConfirm = {}, + onDismiss = onDismiss + ) +} + @Composable private fun TurnOffAndDeleteBackupsDialog( onConfirm: () -> Unit, @@ -733,6 +882,7 @@ private fun getTextForFrequency(backupsFrequency: BackupFrequency): String { private fun RemoteBackupsSettingsContentPreview() { Previews.Preview { RemoteBackupsSettingsContent( + backupsInitialized = true, messageBackupsType = MessageBackupsType.Free(mediaRetentionDays = 30), lastBackupTimestamp = -1, canBackUpUsingCellular = false, @@ -742,28 +892,65 @@ private fun RemoteBackupsSettingsContentPreview() { contentCallbacks = object : ContentCallbacks {}, backupProgress = null, renewalTime = 1727193018.seconds, - backupSize = 2300000 + backupSize = 2300000, + backupState = RemoteBackupsSettingsState.BackupState.ACTIVE ) } } @SignalPreview @Composable -private fun BackupTypeRowPreview() { +private fun LoadingCardPreview() { + Previews.Preview { + LoadingCard() + } +} + +@SignalPreview +@Composable +private fun ErrorCardPreview() { + Previews.Preview { + ErrorCard() + } +} + +@SignalPreview +@Composable +private fun BackupCardPreview() { Previews.Preview { Column { - BackupTypeRow( + BackupCard( messageBackupsType = MessageBackupsType.Paid( pricePerMonth = FiatMoney(BigDecimal.valueOf(3), Currency.getInstance("CAD")), storageAllowanceBytes = 100_000_000 ), + backupState = RemoteBackupsSettingsState.BackupState.ACTIVE, renewalTime = 1727193018.seconds ) - BackupTypeRow( + BackupCard( + messageBackupsType = MessageBackupsType.Paid( + pricePerMonth = FiatMoney(BigDecimal.valueOf(3), Currency.getInstance("CAD")), + storageAllowanceBytes = 100_000_000 + ), + backupState = RemoteBackupsSettingsState.BackupState.CANCELED, + renewalTime = 1727193018.seconds + ) + + BackupCard( + messageBackupsType = MessageBackupsType.Paid( + pricePerMonth = FiatMoney(BigDecimal.valueOf(3), Currency.getInstance("CAD")), + storageAllowanceBytes = 100_000_000 + ), + backupState = RemoteBackupsSettingsState.BackupState.INACTIVE, + renewalTime = 1727193018.seconds + ) + + BackupCard( messageBackupsType = MessageBackupsType.Free( mediaRetentionDays = 30 ), + backupState = RemoteBackupsSettingsState.BackupState.ACTIVE, renewalTime = 0.seconds ) } @@ -789,6 +976,16 @@ private fun InProgressRowPreview() { } } +@SignalPreview +@Composable +private fun FailedToTurnOffBackupDialogPreview() { + Previews.Preview { + FailedToTurnOffBackupDialog( + onDismiss = {} + ) + } +} + @SignalPreview @Composable private fun TurnOffAndDeleteBackupsDialogPreview() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsState.kt index b70706b578..446cfd20db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsState.kt @@ -11,8 +11,10 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds data class RemoteBackupsSettingsState( + val backupsInitialized: Boolean, val messageBackupsType: MessageBackupsType? = null, val canBackUpUsingCellular: Boolean = false, + val backupState: BackupState = BackupState.LOADING, val backupSize: Long = 0, val backupsFrequency: BackupFrequency = BackupFrequency.DAILY, val lastBackupTimestamp: Long = 0, @@ -20,12 +22,43 @@ data class RemoteBackupsSettingsState( val dialog: Dialog = Dialog.NONE, val snackbar: Snackbar = Snackbar.NONE ) { + /** + * Describes the state of the user's selected backup tier. + */ + enum class BackupState { + /** + * The exact backup state is being loaded from the network. + */ + LOADING, + + /** + * User has an active backup + */ + ACTIVE, + + /** + * User has an inactive paid tier backup + */ + INACTIVE, + + /** + * User has a canceled paid tier backup + */ + CANCELED, + + /** + * An error occurred retrieving the network state + */ + ERROR + } + enum class Dialog { NONE, TURN_OFF_AND_DELETE_BACKUPS, BACKUP_FREQUENCY, DELETING_BACKUP, - BACKUP_DELETED + BACKUP_DELETED, + TURN_OFF_FAILED } enum class Snackbar { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsViewModel.kt index 0ae28905e2..815f3e24fe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsViewModel.kt @@ -15,8 +15,10 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.backup.v2.BackupFrequency import org.thoughtcrime.securesms.backup.v2.BackupRepository +import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.thoughtcrime.securesms.components.settings.app.subscription.RecurringInAppPaymentRepository import org.thoughtcrime.securesms.database.model.InAppPaymentSubscriberRecord import org.thoughtcrime.securesms.dependencies.AppDependencies @@ -30,34 +32,24 @@ import kotlin.time.Duration.Companion.seconds * ViewModel for state management of RemoteBackupsSettingsFragment */ class RemoteBackupsSettingsViewModel : ViewModel() { + + companion object { + private val TAG = Log.tag(RemoteBackupsSettingsFragment::class) + } + private val _state = MutableStateFlow( RemoteBackupsSettingsState( + backupsInitialized = SignalStore.backup.backupsInitialized, messageBackupsType = null, lastBackupTimestamp = SignalStore.backup.lastBackupTime, backupSize = SignalStore.backup.totalBackupSize, - backupsFrequency = SignalStore.backup.backupFrequency + backupsFrequency = SignalStore.backup.backupFrequency, + canBackUpUsingCellular = SignalStore.backup.backupWithCellular ) ) val state: StateFlow = _state - init { - refresh() - - viewModelScope.launch { - val activeSubscription = withContext(Dispatchers.IO) { - RecurringInAppPaymentRepository.getActiveSubscriptionSync(InAppPaymentSubscriberRecord.Type.BACKUP) - } - - if (activeSubscription.isSuccess) { - val subscription = activeSubscription.getOrThrow().activeSubscription - if (subscription != null) { - _state.update { it.copy(renewalTime = subscription.endOfCurrentPeriod.seconds) } - } - } - } - } - fun setCanBackUpUsingCellular(canBackUpUsingCellular: Boolean) { SignalStore.backup.backupWithCellular = canBackUpUsingCellular _state.update { it.copy(canBackUpUsingCellular = canBackUpUsingCellular) } @@ -80,17 +72,85 @@ class RemoteBackupsSettingsViewModel : ViewModel() { fun refresh() { viewModelScope.launch { + Log.d(TAG, "Attempting to synchronize backup tier from archive service.") + + val backupTier = withContext(Dispatchers.IO) { + BackupRepository.getBackupTier() + } + + backupTier.runIfSuccessful { + Log.d(TAG, "Setting backup tier to $it") + SignalStore.backup.backupTier = it + } + val tier = SignalStore.backup.backupTier val backupType = if (tier != null) BackupRepository.getBackupsType(tier) else null _state.update { it.copy( + backupsInitialized = SignalStore.backup.backupsInitialized, messageBackupsType = backupType, + backupState = RemoteBackupsSettingsState.BackupState.LOADING, lastBackupTimestamp = SignalStore.backup.lastBackupTime, backupSize = SignalStore.backup.totalBackupSize, - backupsFrequency = SignalStore.backup.backupFrequency + backupsFrequency = SignalStore.backup.backupFrequency, + canBackUpUsingCellular = SignalStore.backup.backupWithCellular ) } + + when (tier) { + MessageBackupTier.PAID -> { + Log.d(TAG, "Attempting to retrieve subscription details for active PAID backup.") + + val activeSubscription = withContext(Dispatchers.IO) { + RecurringInAppPaymentRepository.getActiveSubscriptionSync(InAppPaymentSubscriberRecord.Type.BACKUP) + } + + if (activeSubscription.isSuccess) { + Log.d(TAG, "Retrieved subscription details.") + + val subscription = activeSubscription.getOrThrow().activeSubscription + if (subscription != null) { + Log.d(TAG, "Subscription found. Updating UI state with subscription details.") + _state.update { + it.copy( + renewalTime = subscription.endOfCurrentPeriod.seconds, + backupState = when { + subscription.isActive -> RemoteBackupsSettingsState.BackupState.ACTIVE + subscription.isCanceled -> RemoteBackupsSettingsState.BackupState.CANCELED + else -> RemoteBackupsSettingsState.BackupState.INACTIVE + } + ) + } + } else { + Log.d(TAG, "ActiveSubscription had null subscription object. Updating UI state with INACTIVE subscription.") + _state.update { + it.copy( + renewalTime = 0.seconds, + backupState = RemoteBackupsSettingsState.BackupState.INACTIVE + ) + } + } + } else { + Log.d(TAG, "Failed to load ActiveSubscription data. Updating UI state with error.") + _state.update { + it.copy( + renewalTime = 0.seconds, + backupState = RemoteBackupsSettingsState.BackupState.ERROR + ) + } + } + } + + MessageBackupTier.FREE -> { + Log.d(TAG, "Updating UI state with ACTIVE FREE tier.") + _state.update { it.copy(renewalTime = 0.seconds, backupState = RemoteBackupsSettingsState.BackupState.ACTIVE) } + } + null -> { + Log.d(TAG, "Updating UI state with INACTIVE null tier.") + _state.update { it.copy(renewalTime = 0.seconds, backupState = RemoteBackupsSettingsState.BackupState.INACTIVE) } + } + } } } @@ -98,28 +158,23 @@ class RemoteBackupsSettingsViewModel : ViewModel() { viewModelScope.launch { requestDialog(RemoteBackupsSettingsState.Dialog.DELETING_BACKUP) - withContext(Dispatchers.IO) { + val succeeded = withContext(Dispatchers.IO) { BackupRepository.turnOffAndDeleteBackup() } if (isActive) { - requestDialog(RemoteBackupsSettingsState.Dialog.BACKUP_DELETED) - delay(2000.milliseconds) - requestDialog(RemoteBackupsSettingsState.Dialog.NONE) - refresh() + if (succeeded) { + requestDialog(RemoteBackupsSettingsState.Dialog.BACKUP_DELETED) + delay(2000.milliseconds) + requestDialog(RemoteBackupsSettingsState.Dialog.NONE) + refresh() + } else { + requestDialog(RemoteBackupsSettingsState.Dialog.TURN_OFF_FAILED) + } } } } - private fun refreshBackupState() { - _state.update { - it.copy( - lastBackupTimestamp = SignalStore.backup.lastBackupTime, - backupSize = SignalStore.backup.totalBackupSize - ) - } - } - fun onBackupNowClick() { BackupMessagesJob.enqueue() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt index 92b3aaaf01..9083fb6941 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.components.settings.app.chats import androidx.lifecycle.ViewModelProvider import androidx.navigation.Navigation -import androidx.navigation.fragment.findNavController import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLConfiguration import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment @@ -62,6 +61,19 @@ class ChatsSettingsFragment : DSLSettingsFragment(R.string.preferences_chats__ch dividerPref() + if (RemoteConfig.showChatFolders) { + sectionHeaderPref(R.string.ChatsSettingsFragment__chat_folders) + + clickPref( + title = DSLSettingsText.from(R.string.ChatsSettingsFragment__add_chat_folder), + onClick = { + Navigation.findNavController(requireView()).safeNavigate(R.id.action_chatsSettingsFragment_to_chatFoldersFragment) + } + ) + + dividerPref() + } + sectionHeaderPref(R.string.ChatsSettingsFragment__keyboard) switchPref( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderContextMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderContextMenu.kt new file mode 100644 index 0000000000..e80a1df2f4 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderContextMenu.kt @@ -0,0 +1,122 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import org.signal.core.util.DimensionUnit +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.menu.ActionItem +import org.thoughtcrime.securesms.components.menu.SignalContextMenu + +/** + * A context menu shown when long pressing on a chat folder. + */ +object ChatFolderContextMenu { + + fun show( + context: Context, + anchorView: View, + rootView: ViewGroup = anchorView.rootView as ViewGroup, + folderType: ChatFolderRecord.FolderType, + onEdit: () -> Unit = {}, + onAdd: () -> Unit = {}, + onMuteAll: () -> Unit = {}, + onReadAll: () -> Unit = {}, + onDelete: () -> Unit = {}, + onReorder: () -> Unit = {} + ) { + show( + context = context, + anchorView = anchorView, + rootView = rootView, + folderType = folderType, + callbacks = object : Callbacks { + override fun onEdit() = onEdit() + override fun onAdd() = onAdd() + override fun onMuteAll() = onMuteAll() + override fun onReadAll() = onReadAll() + override fun onDelete() = onDelete() + override fun onReorder() = onReorder() + } + ) + } + + private fun show( + context: Context, + anchorView: View, + rootView: ViewGroup, + folderType: ChatFolderRecord.FolderType, + callbacks: Callbacks + ) { + val actions = mutableListOf().apply { + if (folderType == ChatFolderRecord.FolderType.ALL) { + add( + ActionItem(R.drawable.symbol_plus_24, context.getString(R.string.ChatFoldersFragment__add_new_folder)) { + callbacks.onAdd() + } + ) + add( + ActionItem(R.drawable.symbol_bell_slash_24, context.getString(R.string.ChatFoldersFragment__mute_all)) { + callbacks.onMuteAll() + } + ) + add( + ActionItem(R.drawable.symbol_chat_check, context.getString(R.string.ChatFoldersFragment__mark_all_read)) { + callbacks.onReadAll() + } + ) + add( + ActionItem(R.drawable.symbol_exchange_24, context.getString(R.string.ChatFoldersFragment__reorder_folder)) { + callbacks.onReorder() + } + ) + } else { + add( + ActionItem(R.drawable.symbol_edit_24, context.getString(R.string.ChatFoldersFragment__edit_folder)) { + callbacks.onEdit() + } + ) + add( + ActionItem(R.drawable.symbol_plus_24, context.getString(R.string.ChatFoldersFragment__add_new_folder)) { + callbacks.onAdd() + } + ) + add( + ActionItem(R.drawable.symbol_bell_slash_24, context.getString(R.string.ChatFoldersFragment__mute_all)) { + callbacks.onMuteAll() + } + ) + add( + ActionItem(R.drawable.symbol_chat_check, context.getString(R.string.ChatFoldersFragment__mark_all_read)) { + callbacks.onReadAll() + } + ) + add( + ActionItem(R.drawable.symbol_trash_24, context.getString(R.string.ChatFoldersFragment__delete_folder)) { + callbacks.onDelete() + } + ) + add( + ActionItem(R.drawable.symbol_exchange_24, context.getString(R.string.ChatFoldersFragment__reorder_folder)) { + callbacks.onReorder() + } + ) + } + } + + SignalContextMenu.Builder(anchorView, rootView) + .preferredHorizontalPosition(SignalContextMenu.HorizontalPosition.START) + .preferredVerticalPosition(SignalContextMenu.VerticalPosition.BELOW) + .offsetY(DimensionUnit.DP.toPixels(8f).toInt()) + .show(actions) + } + + private interface Callbacks { + fun onEdit() + fun onAdd() + fun onMuteAll() + fun onReadAll() + fun onDelete() + fun onReorder() + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord.kt new file mode 100644 index 0000000000..9acc3be55f --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFolderRecord.kt @@ -0,0 +1,46 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import org.thoughtcrime.securesms.recipients.Recipient + +/** + * Represents an entry in the [org.thoughtcrime.securesms.database.ChatFolderTables]. + */ +data class ChatFolderRecord( + val id: Long = -1, + val name: String = "", + val position: Int = -1, + val includedChats: List = emptyList(), + val excludedChats: List = emptyList(), + val includedRecipients: Set = emptySet(), + val excludedRecipients: Set = emptySet(), + val showUnread: Boolean = false, + val showMutedChats: Boolean = true, + val showIndividualChats: Boolean = false, + val showGroupChats: Boolean = false, + val isMuted: Boolean = false, + val folderType: FolderType = FolderType.CUSTOM, + val unreadCount: Int = 0 +) { + enum class FolderType(val value: Int) { + /** Folder containing all chats */ + ALL(0), + + /** Folder containing all 1:1 chats */ + INDIVIDUAL(1), + + /** Folder containing group chats */ + GROUP(2), + + /** Folder containing unread chats. */ + UNREAD(3), + + /** Folder containing custom chosen chats */ + CUSTOM(4); + + companion object { + fun deserialize(value: Int): FolderType { + return entries.firstOrNull { it.value == value } ?: CUSTOM + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersFragment.kt new file mode 100644 index 0000000000..0e2a342685 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersFragment.kt @@ -0,0 +1,329 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import android.widget.Toast +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.pluralStringResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.fragment.app.activityViewModels +import androidx.navigation.NavController +import androidx.navigation.fragment.findNavController +import org.signal.core.ui.Buttons +import org.signal.core.ui.Dividers +import org.signal.core.ui.Previews +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.SignalPreview +import org.signal.core.ui.copied.androidx.compose.DraggableItem +import org.signal.core.ui.copied.androidx.compose.dragContainer +import org.signal.core.ui.copied.androidx.compose.rememberDragDropState +import org.signal.core.util.toInt +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.compose.ComposeFragment +import org.thoughtcrime.securesms.util.navigation.safeNavigate + +/** + * Fragment that displays current and suggested chat folders + */ +class ChatFoldersFragment : ComposeFragment() { + + private val viewModel: ChatFoldersViewModel by activityViewModels() + + @Composable + override fun FragmentContent() { + val state by viewModel.state.collectAsState() + val navController: NavController by remember { mutableStateOf(findNavController()) } + viewModel.loadCurrentFolders(requireContext()) + + Scaffolds.Settings( + title = stringResource(id = R.string.ChatsSettingsFragment__chat_folders), + onNavigationClick = { navController.popBackStack() }, + navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), + navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close) + ) { contentPadding: PaddingValues -> + FoldersScreen( + state = state, + modifier = Modifier.padding(contentPadding), + onFolderClicked = { + navController.safeNavigate(ChatFoldersFragmentDirections.actionChatFoldersFragmentToCreateFoldersFragment(it.id)) + }, + onAdd = { folder -> + Toast.makeText(requireContext(), getString(R.string.ChatFoldersFragment__folder_added, folder.name), Toast.LENGTH_SHORT).show() + viewModel.createFolder(requireContext(), folder) + }, + onPositionUpdated = { fromIndex, toIndex -> viewModel.updatePosition(fromIndex, toIndex) } + ) + } + } +} + +@Composable +fun FoldersScreen( + state: ChatFoldersSettingsState, + modifier: Modifier = Modifier, + onFolderClicked: (ChatFolderRecord) -> Unit = {}, + onAdd: (ChatFolderRecord) -> Unit = {}, + onPositionUpdated: (Int, Int) -> Unit = { _, _ -> } +) { + val listState = rememberLazyListState() + val dragDropState = + rememberDragDropState(listState) { fromIndex, toIndex -> + onPositionUpdated(fromIndex, toIndex) + } + + Column(modifier = modifier.verticalScroll(rememberScrollState())) { + Column(modifier = Modifier.padding(start = 24.dp)) { + Text( + text = stringResource(id = R.string.ChatFoldersFragment__organize_your_chats), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 12.dp, bottom = 12.dp, end = 12.dp) + ) + Text( + text = stringResource(id = R.string.ChatFoldersFragment__folders), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(top = 16.dp, bottom = 12.dp) + ) + FolderRow( + icon = R.drawable.symbol_plus_compact_16, + title = stringResource(R.string.ChatFoldersFragment__create_a_folder), + onClick = { onFolderClicked(ChatFolderRecord()) } + ) + } + + val columnHeight = dimensionResource(id = R.dimen.chat_folder_row_height).value * state.folders.size + LazyColumn( + modifier = Modifier + .height(columnHeight.dp) + .dragContainer(dragDropState), + state = listState + ) { + itemsIndexed(state.folders) { index, folder -> + DraggableItem(dragDropState, index) { isDragging -> + val elevation = if (isDragging) 1.dp else 0.dp + val isAllChats = folder.folderType == ChatFolderRecord.FolderType.ALL + FolderRow( + icon = R.drawable.ic_chat_folder_24, + title = if (isAllChats) stringResource(R.string.ChatFoldersFragment__all_chats) else folder.name, + subtitle = getFolderDescription(folder), + onClick = if (!isAllChats) { + { onFolderClicked(folder) } + } else null, + elevation = elevation, + showDragHandle = true, + modifier = Modifier.padding(start = 12.dp) + ) + } + } + } + + if (state.suggestedFolders.isNotEmpty()) { + Dividers.Default() + + Text( + text = stringResource(id = R.string.ChatFoldersFragment__suggested_folders), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(top = 16.dp, bottom = 12.dp, start = 24.dp) + ) + } + + state.suggestedFolders.forEach { chatFolder -> + when (chatFolder.folderType) { + ChatFolderRecord.FolderType.UNREAD -> { + val title: String = stringResource(R.string.ChatFoldersFragment__unreads) + FolderRow( + icon = R.drawable.symbol_chat_badge_24, + title = title, + subtitle = stringResource(R.string.ChatFoldersFragment__unread_messages), + onAdd = { onAdd(chatFolder) }, + modifier = Modifier.padding(start = 12.dp) + ) + } + ChatFolderRecord.FolderType.INDIVIDUAL -> { + val title: String = stringResource(R.string.ChatFoldersFragment__one_on_one_chats) + FolderRow( + icon = R.drawable.symbol_person_light_24, + title = title, + subtitle = stringResource(R.string.ChatFoldersFragment__only_direct_messages), + onAdd = { onAdd(chatFolder) }, + modifier = Modifier.padding(start = 12.dp) + ) + } + ChatFolderRecord.FolderType.GROUP -> { + val title: String = stringResource(R.string.ChatFoldersFragment__groups) + FolderRow( + icon = R.drawable.symbol_group_light_20, + title = title, + subtitle = stringResource(R.string.ChatFoldersFragment__only_group_messages), + onAdd = { onAdd(chatFolder) }, + modifier = Modifier.padding(start = 12.dp) + ) + } + ChatFolderRecord.FolderType.ALL -> { + throw IllegalStateException("All chats should not be suggested") + } + ChatFolderRecord.FolderType.CUSTOM -> { + throw IllegalStateException("Custom folders should not be suggested") + } + } + } + } +} + +@Composable +private fun getFolderDescription(folder: ChatFolderRecord): String { + val chatTypeCount = folder.showIndividualChats.toInt() + folder.showGroupChats.toInt() + val chatTypes = pluralStringResource(id = R.plurals.ChatFoldersFragment__d_chat_types, count = chatTypeCount, chatTypeCount) + val includedChats = pluralStringResource(id = R.plurals.ChatFoldersFragment__d_chats, count = folder.includedChats.size, folder.includedChats.size) + val excludedChats = pluralStringResource(id = R.plurals.ChatFoldersFragment__d_chats_excluded, count = folder.excludedChats.size, folder.excludedChats.size) + + return remember(chatTypeCount, folder.includedChats.size, folder.excludedChats.size) { + val description = mutableListOf() + if (chatTypeCount != 0) { + description.add(chatTypes) + } + if (folder.includedChats.isNotEmpty()) { + description.add(includedChats) + } + if (folder.excludedChats.isNotEmpty()) { + description.add(excludedChats) + } + description.joinToString(separator = ", ") + } +} + +@Composable +fun FolderRow( + modifier: Modifier = Modifier, + icon: Int, + title: String, + subtitle: String = "", + onClick: (() -> Unit)? = null, + onAdd: (() -> Unit)? = null, + elevation: Dp = 0.dp, + showDragHandle: Boolean = false +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = if (onClick != null) { + modifier + .padding(end = 12.dp) + .clickable(onClick = onClick) + .fillMaxWidth() + .defaultMinSize(minHeight = dimensionResource(id = R.dimen.chat_folder_row_height)) + .shadow(elevation = elevation) + } else { + modifier + .padding(end = 12.dp) + .fillMaxWidth() + .defaultMinSize(minHeight = dimensionResource(id = R.dimen.chat_folder_row_height)) + .shadow(elevation = elevation) + } + ) { + Image( + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface), + imageVector = ImageVector.vectorResource(id = icon), + contentDescription = null, + modifier = modifier + .size(40.dp) + .background(color = MaterialTheme.colorScheme.surfaceVariant, shape = CircleShape) + .padding(8.dp) + ) + Column( + modifier = Modifier + .padding(start = 12.dp) + .weight(1f) + ) { + Text(text = title) + if (subtitle.isNotEmpty()) { + Text( + text = subtitle, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + if (onAdd != null) { + Buttons.Small(onClick = onAdd, modifier = modifier.padding(end = 12.dp)) { + Text(stringResource(id = R.string.ChatFoldersFragment__add)) + } + } else if (showDragHandle) { + Icon( + painter = painterResource(id = R.drawable.ic_drag_handle), + contentDescription = null, + modifier = modifier.padding(end = 12.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } +} + +@SignalPreview +@Composable +private fun ChatFolderPreview() { + val previewFolders = listOf( + ChatFolderRecord( + id = 1, + name = "Work", + position = 1, + showUnread = true, + showIndividualChats = true, + showGroupChats = true, + showMutedChats = true, + isMuted = false, + folderType = ChatFolderRecord.FolderType.CUSTOM + ), + ChatFolderRecord( + id = 2, + name = "Fun People", + position = 2, + showUnread = true, + showIndividualChats = true, + showGroupChats = false, + showMutedChats = false, + isMuted = false, + folderType = ChatFolderRecord.FolderType.CUSTOM + ) + ) + + Previews.Preview { + FoldersScreen( + ChatFoldersSettingsState( + folders = previewFolders + ) + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository.kt new file mode 100644 index 0000000000..c8fb037850 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersRepository.kt @@ -0,0 +1,47 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import org.thoughtcrime.securesms.database.SignalDatabase + +/** + * Repository for chat folders that handles creation, deletion, listing, etc., + */ +object ChatFoldersRepository { + + fun getCurrentFolders(includeUnreadCount: Boolean = false): List { + return SignalDatabase.chatFolders.getChatFolders(includeUnreadCount) + } + + fun createFolder(folder: ChatFolderRecord) { + val includedChats = folder.includedRecipients.map { recipient -> SignalDatabase.threads.getOrCreateThreadIdFor(recipient) } + val excludedChats = folder.excludedRecipients.map { recipient -> SignalDatabase.threads.getOrCreateThreadIdFor(recipient) } + val updatedFolder = folder.copy( + includedChats = includedChats, + excludedChats = excludedChats + ) + + SignalDatabase.chatFolders.createFolder(updatedFolder) + } + + fun updateFolder(folder: ChatFolderRecord) { + val includedChats = folder.includedRecipients.map { recipient -> SignalDatabase.threads.getOrCreateThreadIdFor(recipient) } + val excludedChats = folder.excludedRecipients.map { recipient -> SignalDatabase.threads.getOrCreateThreadIdFor(recipient) } + val updatedFolder = folder.copy( + includedChats = includedChats, + excludedChats = excludedChats + ) + + SignalDatabase.chatFolders.updateFolder(updatedFolder) + } + + fun deleteFolder(folder: ChatFolderRecord) { + SignalDatabase.chatFolders.deleteChatFolder(folder) + } + + fun updatePositions(folders: List) { + SignalDatabase.chatFolders.updatePositions(folders) + } + + fun getFolder(id: Long): ChatFolderRecord { + return SignalDatabase.chatFolders.getChatFolder(id) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersSettingsState.kt new file mode 100644 index 0000000000..07a48338cb --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersSettingsState.kt @@ -0,0 +1,19 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import org.thoughtcrime.securesms.contacts.paged.ChatType +import org.thoughtcrime.securesms.recipients.RecipientId + +/** + * Information about chat folders. Used in [ChatFoldersViewModel]. + */ +data class ChatFoldersSettingsState( + val folders: List = emptyList(), + val suggestedFolders: List = emptyList(), + val originalFolder: ChatFolderRecord = ChatFolderRecord(), + val currentFolder: ChatFolderRecord = ChatFolderRecord(), + val showDeleteDialog: Boolean = false, + val showConfirmationDialog: Boolean = false, + val pendingIncludedRecipients: Set = emptySet(), + val pendingExcludedRecipients: Set = emptySet(), + val pendingChatTypes: Set = emptySet() +) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersViewModel.kt new file mode 100644 index 0000000000..420db6e0f5 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChatFoldersViewModel.kt @@ -0,0 +1,327 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.contacts.paged.ChatType +import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId + +/** + * Maintains the state of the [ChatFoldersFragment] and [CreateFoldersFragment] + */ +class ChatFoldersViewModel : ViewModel() { + + private val internalState = MutableStateFlow(ChatFoldersSettingsState()) + val state = internalState.asStateFlow() + + fun loadCurrentFolders(context: Context) { + viewModelScope.launch(Dispatchers.IO) { + val folders = ChatFoldersRepository.getCurrentFolders(includeUnreadCount = false) + val suggestedFolders = getSuggestedFolders(context, folders) + + internalState.update { + it.copy( + folders = folders, + suggestedFolders = suggestedFolders, + currentFolder = ChatFolderRecord(), + originalFolder = ChatFolderRecord() + ) + } + } + } + + private fun getSuggestedFolders(context: Context, currentFolders: List): List { + var showIndividualSuggestion = true + var showGroupSuggestion = true + var showUnreadSuggestion = true + + currentFolders + .filter { folder -> folder.includedChats.isEmpty() && folder.excludedChats.isEmpty() } + .forEach { folder -> + if (folder.showIndividualChats && !folder.showGroupChats) { + showIndividualSuggestion = false + } else if (folder.showGroupChats && !folder.showIndividualChats) { + showGroupSuggestion = false + } else if (folder.showUnread && folder.showIndividualChats && folder.showGroupChats) { + showUnreadSuggestion = false + } + } + + val suggestions: MutableList = mutableListOf() + if (showIndividualSuggestion) { + suggestions.add( + ChatFolderRecord( + name = context.getString(R.string.ChatFoldersFragment__one_on_one_chats), + showIndividualChats = true, + folderType = ChatFolderRecord.FolderType.INDIVIDUAL, + showMutedChats = true + ) + ) + } + if (showGroupSuggestion) { + suggestions.add( + ChatFolderRecord( + name = context.getString(R.string.ChatFoldersFragment__groups), + showGroupChats = true, + folderType = ChatFolderRecord.FolderType.GROUP, + showMutedChats = true + ) + ) + } + if (showUnreadSuggestion) { + suggestions.add( + ChatFolderRecord( + name = context.getString(R.string.ChatFoldersFragment__unreads), + showUnread = true, + showIndividualChats = true, + showGroupChats = true, + showMutedChats = true, + folderType = ChatFolderRecord.FolderType.UNREAD + ) + ) + } + return suggestions + } + + fun setCurrentFolder(folder: ChatFolderRecord) { + viewModelScope.launch(Dispatchers.IO) { + val includedRecipients = folder.includedChats.mapNotNull { threadId -> + SignalDatabase.threads.getRecipientForThreadId(threadId) + } + val excludedRecipients = folder.excludedChats.mapNotNull { threadId -> + SignalDatabase.threads.getRecipientForThreadId(threadId) + } + + val updatedFolder = folder.copy( + includedRecipients = includedRecipients.toSet(), + excludedRecipients = excludedRecipients.toSet() + ) + + internalState.update { + it.copy(originalFolder = updatedFolder, currentFolder = updatedFolder) + } + } + } + + fun updateName(name: String) { + val updatedFolder = internalState.value.currentFolder.copy( + name = name.substring(0, minOf(name.length, 32)) + ) + + internalState.update { + it.copy(currentFolder = updatedFolder) + } + } + + fun toggleShowUnread(showUnread: Boolean) { + val updatedFolder = internalState.value.currentFolder.copy( + showUnread = showUnread + ) + + internalState.update { + it.copy(currentFolder = updatedFolder) + } + } + + fun toggleShowMutedChats(showMuted: Boolean) { + val updatedFolder = internalState.value.currentFolder.copy( + showMutedChats = showMuted + ) + + internalState.update { + it.copy(currentFolder = updatedFolder) + } + } + + fun showDeleteDialog(show: Boolean) { + internalState.update { + it.copy(showDeleteDialog = show) + } + } + + fun deleteFolder() { + viewModelScope.launch(Dispatchers.IO) { + ChatFoldersRepository.deleteFolder(internalState.value.originalFolder) + + internalState.update { + it.copy(showDeleteDialog = false) + } + } + } + + fun showConfirmationDialog(show: Boolean) { + internalState.update { + it.copy(showConfirmationDialog = show) + } + } + + fun createFolder(context: Context, folder: ChatFolderRecord? = null) { + viewModelScope.launch(Dispatchers.IO) { + val currentFolder = folder ?: internalState.value.currentFolder + ChatFoldersRepository.createFolder(currentFolder) + loadCurrentFolders(context) + + internalState.update { + it.copy(showConfirmationDialog = false) + } + } + } + + fun updatePosition(fromIndex: Int, toIndex: Int) { + viewModelScope.launch(Dispatchers.IO) { + val folders = state.value.folders.toMutableList().apply { add(toIndex, removeAt(fromIndex)) } + val updatedFolders = folders.mapIndexed { index, chatFolderRecord -> + chatFolderRecord.copy(position = index) + } + ChatFoldersRepository.updatePositions(updatedFolders) + + internalState.update { + it.copy(folders = updatedFolders) + } + } + } + + fun updateFolder(context: Context) { + viewModelScope.launch(Dispatchers.IO) { + ChatFoldersRepository.updateFolder(internalState.value.currentFolder) + loadCurrentFolders(context) + + internalState.update { + it.copy(showConfirmationDialog = false) + } + } + } + + fun setPendingChats() { + viewModelScope.launch(Dispatchers.IO) { + val currentFolder = internalState.value.currentFolder + val includedChats = currentFolder.includedRecipients.map { recipient -> recipient.id }.toMutableSet() + val excludedChats = currentFolder.excludedRecipients.map { recipient -> recipient.id }.toMutableSet() + + val chatTypes: MutableSet = mutableSetOf() + if (currentFolder.showIndividualChats) { + chatTypes.add(ChatType.INDIVIDUAL) + } + if (currentFolder.showGroupChats) { + chatTypes.add(ChatType.GROUPS) + } + + internalState.update { + it.copy( + pendingIncludedRecipients = includedChats, + pendingExcludedRecipients = excludedChats, + pendingChatTypes = chatTypes + ) + } + } + } + + fun addIncludedChat(recipientId: RecipientId) { + val includedChats = internalState.value.pendingIncludedRecipients.plus(recipientId) + internalState.update { + it.copy(pendingIncludedRecipients = includedChats) + } + } + + fun addExcludedChat(recipientId: RecipientId) { + val excludedChats = internalState.value.pendingExcludedRecipients.plus(recipientId) + internalState.update { + it.copy(pendingExcludedRecipients = excludedChats) + } + } + + fun removeIncludedChat(recipientId: RecipientId) { + val includedChats = internalState.value.pendingIncludedRecipients.minus(recipientId) + internalState.update { + it.copy(pendingIncludedRecipients = includedChats) + } + } + + fun removeExcludedChat(recipientId: RecipientId) { + val excludedChats = internalState.value.pendingExcludedRecipients.minus(recipientId) + internalState.update { + it.copy(pendingExcludedRecipients = excludedChats) + } + } + + fun addChatType(chatType: ChatType) { + val updatedChatTypes = internalState.value.pendingChatTypes.plus(chatType) + internalState.update { + it.copy( + pendingChatTypes = updatedChatTypes + ) + } + } + + fun removeChatType(chatType: ChatType) { + val updatedChatTypes = internalState.value.pendingChatTypes.minus(chatType) + internalState.update { + it.copy( + pendingChatTypes = updatedChatTypes + ) + } + } + + fun savePendingChats() { + viewModelScope.launch(Dispatchers.IO) { + val updatedFolder = internalState.value.currentFolder + val includedChatIds = internalState.value.pendingIncludedRecipients + val excludedChatIds = internalState.value.pendingExcludedRecipients + val showIndividualChats = internalState.value.pendingChatTypes.contains(ChatType.INDIVIDUAL) + val showGroupChats = internalState.value.pendingChatTypes.contains(ChatType.GROUPS) + + val includedRecipients = includedChatIds.map(Recipient::resolved).toSet() + val excludedRecipients = excludedChatIds.map(Recipient::resolved).toSet() + + internalState.update { + it.copy( + currentFolder = updatedFolder.copy( + includedRecipients = includedRecipients, + excludedRecipients = excludedRecipients, + showIndividualChats = showIndividualChats, + showGroupChats = showGroupChats + ), + pendingIncludedRecipients = emptySet(), + pendingExcludedRecipients = emptySet() + ) + } + } + } + + fun enableButton(): Boolean { + return internalState.value.pendingIncludedRecipients.isNotEmpty() || + internalState.value.pendingChatTypes.isNotEmpty() || + internalState.value.pendingExcludedRecipients.isNotEmpty() + } + + fun hasChanges(): Boolean { + val currentFolder = state.value.currentFolder + val originalFolder = state.value.originalFolder + + return if (currentFolder.id == -1L) { + currentFolder.name.isNotEmpty() && + (currentFolder.includedRecipients.isNotEmpty() || currentFolder.showIndividualChats || currentFolder.showGroupChats) + } else { + originalFolder != currentFolder || + originalFolder.includedRecipients != currentFolder.includedRecipients || + originalFolder.excludedRecipients != currentFolder.excludedRecipients + } + } + + fun setCurrentFolderId(folderId: Long) { + if (folderId != -1L) { + viewModelScope.launch(Dispatchers.IO) { + val folder = ChatFoldersRepository.getFolder(folderId) + setCurrentFolder(folder) + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChooseChatsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChooseChatsFragment.kt new file mode 100644 index 0000000000..cf4ccde1c2 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/ChooseChatsFragment.kt @@ -0,0 +1,158 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.activityViewModels +import androidx.navigation.fragment.findNavController +import com.google.android.material.button.MaterialButton +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.ContactSelectionListFragment +import org.thoughtcrime.securesms.LoggingFragment +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.ContactFilterView +import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode +import org.thoughtcrime.securesms.contacts.SelectedContact +import org.thoughtcrime.securesms.contacts.paged.ChatType +import org.thoughtcrime.securesms.groups.SelectionLimits +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.util.ViewUtil +import java.util.Optional +import java.util.function.Consumer + +class ChooseChatsFragment : LoggingFragment(), ContactSelectionListFragment.OnContactSelectedListener { + + private val viewModel: ChatFoldersViewModel by activityViewModels() + + private var includeChatsMode: Boolean = true + + private lateinit var contactFilterView: ContactFilterView + private lateinit var doneButton: MaterialButton + private lateinit var selectionFragment: ContactSelectionListFragment + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + includeChatsMode = arguments?.getBoolean(KEY_INCLUDE_CHATS) ?: true + val currentSelection: Set = if (includeChatsMode) { + viewModel.state.value.pendingExcludedRecipients + } else { + viewModel.state.value.pendingIncludedRecipients + } + + childFragmentManager.addFragmentOnAttachListener { _, fragment -> + fragment.arguments = Bundle().apply { + putInt(ContactSelectionListFragment.DISPLAY_MODE, getDefaultDisplayMode()) + putBoolean(ContactSelectionListFragment.REFRESHABLE, false) + putBoolean(ContactSelectionListFragment.RECENTS, true) + putParcelable(ContactSelectionListFragment.SELECTION_LIMITS, SelectionLimits.NO_LIMITS) + putParcelableArrayList(ContactSelectionListFragment.CURRENT_SELECTION, ArrayList(currentSelection)) + putBoolean(ContactSelectionListFragment.INCLUDE_CHAT_TYPES, includeChatsMode) + putBoolean(ContactSelectionListFragment.HIDE_COUNT, true) + putBoolean(ContactSelectionListFragment.DISPLAY_CHIPS, true) + putBoolean(ContactSelectionListFragment.CAN_SELECT_SELF, true) + putBoolean(ContactSelectionListFragment.RV_CLIP, false) + putInt(ContactSelectionListFragment.RV_PADDING_BOTTOM, ViewUtil.dpToPx(60)) + } + } + + return inflater.inflate(R.layout.choose_chats_fragment, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + val toolbar: Toolbar = view.findViewById(R.id.toolbar) + + if (includeChatsMode) { + toolbar.setTitle(R.string.CreateFoldersFragment__included_chats) + } else { + toolbar.setTitle(R.string.CreateFoldersFragment__exceptions) + } + toolbar.setNavigationOnClickListener { findNavController().popBackStack() } + + selectionFragment = childFragmentManager.findFragmentById(R.id.contact_selection_list) as ContactSelectionListFragment + contactFilterView = view.findViewById(R.id.contact_filter_edit_text) + contactFilterView.setOnFilterChangedListener { + if (it.isNullOrEmpty()) { + selectionFragment.resetQueryFilter() + } else { + selectionFragment.setQueryFilter(it) + } + } + + doneButton = view.findViewById(R.id.done_button) + doneButton.setOnClickListener { + viewModel.savePendingChats() + findNavController().popBackStack() + } + updateEnabledButton() + } + + override fun onStart() { + super.onStart() + + if (includeChatsMode && viewModel.state.value.pendingChatTypes.contains(ChatType.INDIVIDUAL)) { + selectionFragment.markContactSelected(SelectedContact.forChatType(ChatType.INDIVIDUAL)) + } + if (includeChatsMode && viewModel.state.value.pendingChatTypes.contains(ChatType.GROUPS)) { + selectionFragment.markContactSelected(SelectedContact.forChatType(ChatType.GROUPS)) + } + + val activeSelection: Set = if (includeChatsMode) { + viewModel.state.value.pendingIncludedRecipients + } else { + viewModel.state.value.pendingExcludedRecipients + } + + selectionFragment.markSelected(activeSelection) + } + + override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, chatType: Optional, callback: Consumer) { + if (recipientId.isPresent) { + if (includeChatsMode) { + viewModel.addIncludedChat(recipientId.get()) + } else { + viewModel.addExcludedChat(recipientId.get()) + } + callback.accept(true) + } else if (chatType.isPresent) { + viewModel.addChatType(chatType.get()) + callback.accept(true) + } else { + callback.accept(false) + } + updateEnabledButton() + } + + override fun onContactDeselected(recipientId: Optional, number: String?, chatType: Optional) { + if (recipientId.isPresent) { + if (includeChatsMode) { + viewModel.removeIncludedChat(recipientId.get()) + } else { + viewModel.removeExcludedChat(recipientId.get()) + } + } else if (chatType.isPresent) { + viewModel.removeChatType(chatType.get()) + } + updateEnabledButton() + } + + override fun onSelectionChanged() = Unit + + private fun getDefaultDisplayMode(): Int { + return ContactSelectionDisplayMode.FLAG_PUSH or + ContactSelectionDisplayMode.FLAG_ACTIVE_GROUPS or + ContactSelectionDisplayMode.FLAG_HIDE_NEW or + ContactSelectionDisplayMode.FLAG_GROUPS_AFTER_CONTACTS or + ContactSelectionDisplayMode.FLAG_HIDE_GROUPS_V1 or + ContactSelectionDisplayMode.FLAG_SELF + } + + private fun updateEnabledButton() { + doneButton.isEnabled = viewModel.enableButton() + } + + companion object { + private val TAG = Log.tag(ChooseChatsFragment::class.java) + private val KEY_INCLUDE_CHATS = "include_chats" + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/CreateFoldersFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/CreateFoldersFragment.kt new file mode 100644 index 0000000000..1b907ac69b --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/folders/CreateFoldersFragment.kt @@ -0,0 +1,460 @@ +package org.thoughtcrime.securesms.components.settings.app.chats.folders + +import android.os.Bundle +import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Person +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.fragment.app.activityViewModels +import androidx.navigation.NavController +import androidx.navigation.fragment.findNavController +import org.signal.core.ui.Buttons +import org.signal.core.ui.Dialogs +import org.signal.core.ui.Dividers +import org.signal.core.ui.Previews +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.SignalPreview +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.avatar.AvatarImage +import org.thoughtcrime.securesms.compose.ComposeFragment +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.util.navigation.safeNavigate + +/** + * Fragment that allows user to create, edit, or delete an individual folder + */ +class CreateFoldersFragment : ComposeFragment() { + + private val viewModel: ChatFoldersViewModel by activityViewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (viewModel.hasChanges()) { + viewModel.showConfirmationDialog(true) + } else { + findNavController().popBackStack() + } + } + } + ) + } + + @Composable + override fun FragmentContent() { + val state by viewModel.state.collectAsState() + val navController: NavController by remember { mutableStateOf(findNavController()) } + val focusRequester = remember { FocusRequester() } + val isNewFolder = state.originalFolder.id == -1L + + LaunchedEffect(Unit) { + if (state.originalFolder == state.currentFolder) { + viewModel.setCurrentFolderId(arguments?.getLong(KEY_FOLDER_ID) ?: -1) + } + } + + Scaffolds.Settings( + title = if (isNewFolder) stringResource(id = R.string.CreateFoldersFragment__create_a_folder) else stringResource(id = R.string.CreateFoldersFragment__edit_folder), + onNavigationClick = { + if (viewModel.hasChanges()) { + viewModel.showConfirmationDialog(true) + } else { + navController.popBackStack() + } + }, + navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), + navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close) + ) { contentPadding: PaddingValues -> + CreateFolderScreen( + state = state, + focusRequester = focusRequester, + modifier = Modifier.padding(contentPadding), + isNewFolder = isNewFolder, + hasChanges = viewModel.hasChanges(), + onAddChat = { + viewModel.setPendingChats() + navController.safeNavigate(CreateFoldersFragmentDirections.actionCreateFoldersFragmentToChooseChatsFragment(true)) + }, + onRemoveChat = { + viewModel.setPendingChats() + navController.safeNavigate(CreateFoldersFragmentDirections.actionCreateFoldersFragmentToChooseChatsFragment(false)) + }, + onNameChange = { viewModel.updateName(it) }, + onToggleShowUnread = { viewModel.toggleShowUnread(it) }, + onToggleShowMuted = { viewModel.toggleShowMutedChats(it) }, + onDeleteClicked = { viewModel.showDeleteDialog(true) }, + onDeleteConfirmed = { + viewModel.deleteFolder() + navController.popBackStack() + }, + onDeleteDismissed = { + viewModel.showDeleteDialog(false) + }, + onCreateConfirmed = { shouldExit -> + if (isNewFolder) { + viewModel.createFolder(requireContext()) + } else { + viewModel.updateFolder(requireContext()) + } + if (shouldExit) { + navController.popBackStack() + } + }, + onCreateDismissed = { shouldExit -> + viewModel.showConfirmationDialog(false) + if (shouldExit) { + navController.popBackStack() + } + } + ) + } + } + + companion object { + private val KEY_FOLDER_ID = "folder_id" + } +} + +@Composable +fun CreateFolderScreen( + state: ChatFoldersSettingsState, + focusRequester: FocusRequester, + modifier: Modifier = Modifier, + isNewFolder: Boolean = true, + hasChanges: Boolean = false, + onAddChat: () -> Unit = {}, + onRemoveChat: () -> Unit = {}, + onNameChange: (String) -> Unit = {}, + onToggleShowUnread: (Boolean) -> Unit = {}, + onToggleShowMuted: (Boolean) -> Unit = {}, + onDeleteClicked: () -> Unit = {}, + onDeleteConfirmed: () -> Unit = {}, + onDeleteDismissed: () -> Unit = {}, + onCreateConfirmed: (Boolean) -> Unit = {}, + onCreateDismissed: (Boolean) -> Unit = {} +) { + if (state.showDeleteDialog) { + Dialogs.SimpleAlertDialog( + title = "", + body = stringResource(id = R.string.CreateFoldersFragment__delete_this_chat_folder), + confirm = stringResource(id = R.string.delete), + onConfirm = onDeleteConfirmed, + dismiss = stringResource(id = android.R.string.cancel), + onDismiss = onDeleteDismissed + ) + } else if (state.showConfirmationDialog && isNewFolder) { + Dialogs.SimpleAlertDialog( + title = stringResource(id = R.string.CreateFoldersFragment__create_folder_title), + body = stringResource(id = R.string.CreateFoldersFragment__do_you_want_to_create, state.currentFolder.name), + confirm = stringResource(id = R.string.CreateFoldersFragment__create_folder), + onConfirm = { onCreateConfirmed(false) }, + dismiss = stringResource(id = R.string.CreateFoldersFragment__discard), + onDismiss = { onCreateDismissed(true) }, + onDismissRequest = { onCreateDismissed(false) } + ) + } else if (state.showConfirmationDialog) { + Dialogs.SimpleAlertDialog( + title = stringResource(id = R.string.CreateFoldersFragment__save_changes_title), + body = stringResource(id = R.string.CreateFoldersFragment__do_you_want_to_save), + confirm = stringResource(id = R.string.CreateFoldersFragment__save_changes), + onConfirm = { onCreateConfirmed(false) }, + dismiss = stringResource(id = R.string.CreateFoldersFragment__discard), + onDismiss = { onCreateDismissed(true) }, + onDismissRequest = { onCreateDismissed(false) } + ) + } + + Box(modifier = Modifier.fillMaxSize()) { + LazyColumn { + item { + TextField( + value = state.currentFolder.name, + label = { Text(text = stringResource(id = R.string.CreateFoldersFragment__folder_name)) }, + onValueChange = onNameChange, + singleLine = true, + modifier = modifier + .fillMaxWidth() + .focusRequester(focusRequester) + .padding(top = 16.dp, bottom = 12.dp, start = 20.dp, end = 28.dp) + ) + } + + item { + Text( + text = stringResource(id = R.string.CreateFoldersFragment__included_chats), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(top = 16.dp, bottom = 12.dp, start = 24.dp) + ) + FolderRow( + icon = R.drawable.symbol_plus_compact_16, + title = stringResource(R.string.CreateFoldersFragment__add_chats), + onClick = onAddChat, + modifier = Modifier.padding(start = 12.dp) + ) + + if (state.currentFolder.showIndividualChats) { + FolderRow( + icon = R.drawable.symbol_person_light_24, + title = stringResource(R.string.ChatFoldersFragment__one_on_one_chats), + onClick = onAddChat, + modifier = Modifier.padding(start = 12.dp) + ) + } + + if (state.currentFolder.showGroupChats) { + FolderRow( + icon = R.drawable.symbol_group_light_20, + title = stringResource(R.string.ChatFoldersFragment__groups), + onClick = onAddChat, + modifier = Modifier.padding(start = 12.dp) + ) + } + } + + items(state.currentFolder.includedRecipients.toList()) { recipient -> + ChatRow( + recipient = recipient, + onClick = onAddChat + ) + } + + item { + Text( + text = stringResource(id = R.string.CreateFoldersFragment__choose_chats_you_want), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 12.dp, bottom = 12.dp, start = 24.dp) + ) + } + + item { + Text( + text = stringResource(id = R.string.CreateFoldersFragment__exceptions), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(top = 24.dp, bottom = 12.dp, end = 12.dp, start = 24.dp) + ) + FolderRow( + icon = R.drawable.symbol_plus_compact_16, + title = stringResource(R.string.CreateFoldersFragment__exclude_chats), + onClick = onRemoveChat, + modifier = Modifier.padding(start = 12.dp) + ) + } + + items(state.currentFolder.excludedRecipients.toList()) { recipient -> + ChatRow( + recipient = recipient, + onClick = onRemoveChat + ) + } + + item { + Text( + text = stringResource(id = R.string.CreateFoldersFragment__choose_chats_you_do_not_want), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 12.dp, bottom = 12.dp, start = 24.dp, end = 12.dp) + ) + } + + item { + Dividers.Default() + ShowUnreadSection(state, onToggleShowUnread) + ShowMutedSection(state, onToggleShowMuted) + + if (!isNewFolder) { + Dividers.Default() + + Text( + text = stringResource(id = R.string.CreateFoldersFragment__delete_folder), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.error, + modifier = Modifier + .clickable { onDeleteClicked() } + .fillMaxWidth() + .padding(start = 24.dp, top = 16.dp, bottom = 32.dp) + ) + } + } + + if (hasChanges) { + item { Spacer(modifier = Modifier.height(60.dp)) } + } + } + + if (hasChanges && isNewFolder) { + Buttons.MediumTonal( + onClick = { onCreateConfirmed(true) }, + modifier = modifier + .align(Alignment.BottomEnd) + .padding(end = 16.dp, bottom = 16.dp) + ) { + Text(text = stringResource(R.string.CreateFoldersFragment__create)) + } + } else if (!isNewFolder) { + Buttons.MediumTonal( + enabled = hasChanges, + onClick = { onCreateConfirmed(true) }, + modifier = modifier + .align(Alignment.BottomEnd) + .padding(end = 16.dp, bottom = 16.dp) + ) { + Text(text = stringResource(R.string.CreateFoldersFragment__save)) + } + } + } +} + +@Composable +private fun ShowUnreadSection(state: ChatFoldersSettingsState, onToggleShowUnread: (Boolean) -> Unit) { + Row( + modifier = Modifier + .padding(horizontal = 24.dp) + .defaultMinSize(minHeight = 92.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = stringResource(id = R.string.CreateFoldersFragment__only_show_unread_chats), + style = MaterialTheme.typography.bodyLarge + ) + Text( + text = stringResource(id = R.string.CreateFoldersFragment__when_enabled_only_chats), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + Switch( + checked = state.currentFolder.showUnread, + onCheckedChange = onToggleShowUnread + ) + } +} + +@Composable +private fun ShowMutedSection(state: ChatFoldersSettingsState, onToggleShowMuted: (Boolean) -> Unit) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(horizontal = 24.dp) + .defaultMinSize(minHeight = 56.dp) + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = stringResource(id = R.string.CreateFoldersFragment__include_muted_chats), + style = MaterialTheme.typography.bodyLarge + ) + } + Switch( + checked = state.currentFolder.showMutedChats, + onCheckedChange = onToggleShowMuted + ) + } +} + +@SignalPreview +@Composable +private fun CreateFolderPreview() { + val previewFolder = ChatFolderRecord(id = 1, name = "WIP") + + Previews.Preview { + CreateFolderScreen( + state = ChatFoldersSettingsState(currentFolder = previewFolder), + focusRequester = FocusRequester(), + isNewFolder = true + ) + } +} + +@SignalPreview +@Composable +private fun EditFolderPreview() { + val previewFolder = ChatFolderRecord(id = 1, name = "Work") + + Previews.Preview { + CreateFolderScreen( + state = ChatFoldersSettingsState(originalFolder = previewFolder), + focusRequester = FocusRequester(), + isNewFolder = false + ) + } +} + +@Composable +fun ChatRow( + recipient: Recipient, + modifier: Modifier = Modifier, + onClick: (() -> Unit) +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .clickable(onClick = onClick) + .fillMaxWidth() + .defaultMinSize(minHeight = 64.dp) + ) { + if (LocalInspectionMode.current) { + Icon( + imageVector = Icons.Default.Person, + contentDescription = null, + modifier = Modifier + .padding(start = 24.dp, end = 16.dp) + .size(40.dp) + .background( + color = Color.Red, + shape = CircleShape + ) + ) + } else { + AvatarImage( + recipient = recipient, + modifier = Modifier + .padding(start = 24.dp, end = 16.dp) + .size(40.dp) + ) + } + + Text(text = recipient.getShortDisplayName(LocalContext.current)) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt index 69f35ee7d8..7ed8302521 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt @@ -90,6 +90,7 @@ class InternalBackupPlaygroundFragment : ComposeFragment() { private lateinit var exportFileLauncher: ActivityResultLauncher private lateinit var importFileLauncher: ActivityResultLauncher private lateinit var validateFileLauncher: ActivityResultLauncher + private lateinit var savePlaintextcopyLauncher: ActivityResultLauncher override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -124,6 +125,15 @@ class InternalBackupPlaygroundFragment : ComposeFragment() { } ?: Toast.makeText(requireContext(), "No URI selected", Toast.LENGTH_SHORT).show() } } + + savePlaintextcopyLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> + viewModel.fetchRemoteBackupAndWritePlaintext(requireContext().contentResolver.openOutputStream(uri)) + Toast.makeText(requireContext(), "Check logs for progress.", Toast.LENGTH_SHORT).show() + } ?: Toast.makeText(requireContext(), "No URI selected", Toast.LENGTH_SHORT).show() + } + } } @Composable @@ -188,7 +198,17 @@ class InternalBackupPlaygroundFragment : ComposeFragment() { .show() }, onBackupTierSelected = { tier -> viewModel.onBackupTierSelected(tier) }, - onHaltAllJobs = { viewModel.haltAllJobs() } + onHaltAllJobs = { viewModel.haltAllJobs() }, + onSavePlaintextCopy = { + val intent = Intent().apply { + action = Intent.ACTION_CREATE_DOCUMENT + type = "application/octet-stream" + addCategory(Intent.CATEGORY_OPENABLE) + putExtra(Intent.EXTRA_TITLE, "backup-plaintext-${System.currentTimeMillis()}.binproto") + } + + savePlaintextcopyLauncher.launch(intent) + } ) }, mediaContent = { snackbarHostState -> @@ -283,7 +303,8 @@ fun Screen( onTriggerBackupJobClicked: () -> Unit = {}, onWipeDataAndRestoreClicked: () -> Unit = {}, onBackupTierSelected: (MessageBackupTier?) -> Unit = {}, - onHaltAllJobs: () -> Unit = {} + onHaltAllJobs: () -> Unit = {}, + onSavePlaintextCopy: () -> Unit = {} ) { val scrollState = rememberScrollState() val options = remember { @@ -337,6 +358,12 @@ fun Screen( Text("Halt all backup jobs") } + Buttons.LargeTonal( + onClick = onSavePlaintextCopy + ) { + Text("Save plaintext copy of remote backup") + } + Dividers.Default() Row( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt index df69c7ea44..c57309afed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt @@ -19,6 +19,10 @@ import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.concurrent.SignalExecutors +import org.signal.core.util.copyTo +import org.signal.core.util.logging.Log +import org.signal.core.util.readNBytesOrThrow +import org.signal.core.util.stream.LimitedInputStream import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.DatabaseAttachment @@ -30,6 +34,7 @@ import org.thoughtcrime.securesms.backup.v2.local.ArchiveResult import org.thoughtcrime.securesms.backup.v2.local.LocalArchiver import org.thoughtcrime.securesms.backup.v2.local.LocalArchiver.FailureCause import org.thoughtcrime.securesms.backup.v2.local.SnapshotFileSystem +import org.thoughtcrime.securesms.backup.v2.stream.EncryptedBackupReader.Companion.MAC_SIZE import org.thoughtcrime.securesms.database.MessageType import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.AppDependencies @@ -45,16 +50,28 @@ import org.thoughtcrime.securesms.jobs.RestoreLocalAttachmentJob import org.thoughtcrime.securesms.jobs.SyncArchivedMediaJob import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mms.IncomingMessage +import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.recipients.Recipient import org.whispersystems.signalservice.api.NetworkResult import org.whispersystems.signalservice.api.backup.MediaName import java.io.ByteArrayInputStream +import java.io.IOException import java.io.InputStream +import java.io.OutputStream import java.util.UUID +import java.util.zip.GZIPInputStream +import javax.crypto.Cipher +import javax.crypto.CipherInputStream +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec import kotlin.time.Duration.Companion.seconds class InternalBackupPlaygroundViewModel : ViewModel() { + companion object { + private val TAG = Log.tag(InternalBackupPlaygroundViewModel::class) + } + var backupData: ByteArray? = null val disposables = CompositeDisposable() @@ -519,5 +536,41 @@ class InternalBackupPlaygroundViewModel : ViewModel() { AppDependencies.jobManager.cancelAllInQueue("ArchiveAttachmentJobs_0") AppDependencies.jobManager.cancelAllInQueue("ArchiveAttachmentJobs_1") AppDependencies.jobManager.cancelAllInQueue("ArchiveThumbnailUploadJob") + AppDependencies.jobManager.cancelAllInQueue("BackupRestoreJob") + } + + fun fetchRemoteBackupAndWritePlaintext(outputStream: OutputStream?) { + check(outputStream != null) + + SignalExecutors.BOUNDED_IO.execute { + Log.d(TAG, "Downloading file...") + val tempBackupFile = BlobProvider.getInstance().forNonAutoEncryptingSingleSessionOnDisk(AppDependencies.application) + if (!BackupRepository.downloadBackupFile(tempBackupFile)) { + Log.e(TAG, "Failed to download backup file") + throw IOException() + } + + val encryptedStream = tempBackupFile.inputStream() + val iv = encryptedStream.readNBytesOrThrow(16) + val backupKey = SignalStore.svr.orCreateMasterKey.deriveBackupKey() + val keyMaterial = backupKey.deriveBackupSecrets(Recipient.self().aci.get()) + val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding").apply { + init(Cipher.DECRYPT_MODE, SecretKeySpec(keyMaterial.cipherKey, "AES"), IvParameterSpec(iv)) + } + + val plaintextStream = GZIPInputStream( + CipherInputStream( + LimitedInputStream( + wrapped = encryptedStream, + maxBytes = tempBackupFile.length() - MAC_SIZE + ), + cipher + ) + ) + + Log.d(TAG, "Copying...") + plaintextStream.copyTo(outputStream) + Log.d(TAG, "Done!") + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt index 0dc37d962c..e3b80d8b27 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.gms.common.ConnectionResult import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -87,6 +88,8 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ private val layoutManager: LinearLayoutManager? get() = recyclerView?.layoutManager as? LinearLayoutManager + private var hasShownPlayServicesError = false + override fun onResume() { super.onResume() viewModel.refresh() @@ -117,11 +120,17 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ viewModel.state.observe(viewLifecycleOwner) { adapter.submitList(getConfiguration(it).toMappingModelList()) - if (args.scrollToPushServices) { + + val errorCode = viewModel.state.value?.playServicesErrorCode + if (errorCode != null && errorCode != ConnectionResult.SUCCESS) { layoutManager?.scrollToPosition(adapter.itemCount - 1) + showPlayServicesErrorDialog(errorCode) + viewModel.setPlayServicesErrorCode(null) } } + viewModel.setPlayServicesErrorCode(args.playServicesErrorCode) + EventBus.getDefault().registerForLifecycle(subscriber = this, lifecycleOwner = viewLifecycleOwner) } @@ -364,35 +373,31 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ isEnabled = !state.isLinkedDevice, // MOLLY: TODO iconEnd = if (showAlertIcon) DSLSettingsIcon.from(R.drawable.ic_alert, R.color.signal_alert_primary) else null, onSelected = { - onNotificationMethodChanged(notificationMethodValues[it], state.preferredNotificationMethod) + viewModel.setPreferredNotificationMethod(notificationMethodValues[it]) } ) } } - private fun onNotificationMethodChanged( - method: NotificationDeliveryMethod, - previousMethod: NotificationDeliveryMethod - ) { - when (method) { - NotificationDeliveryMethod.FCM -> { - viewModel.setPreferredNotificationMethod(method) - val msgId = when (viewModel.fcmState) { - PlayServicesUtil.PlayServicesStatus.SUCCESS -> null - PlayServicesUtil.PlayServicesStatus.DISABLED -> R.string.RegistrationActivity_missing_google_play_services - PlayServicesUtil.PlayServicesStatus.MISSING -> R.string.RegistrationActivity_missing_google_play_services - PlayServicesUtil.PlayServicesStatus.NEEDS_UPDATE -> R.string.RegistrationActivity_google_play_services_is_updating_or_unavailable - PlayServicesUtil.PlayServicesStatus.TRANSIENT_ERROR -> R.string.RegistrationActivity_play_services_error - } - if (msgId != null) { - Toast.makeText(requireContext(), getString(msgId), Toast.LENGTH_LONG).show() + private fun showPlayServicesErrorDialog(errorCode: Int) { + val causeId = when (errorCode) { + ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED -> { + if (PlayServicesUtil.isGooglePlayPackageEnabled(context)) { + R.string.RegistrationActivity_google_play_services_is_updating_or_unavailable + } else { + R.string.NotificationsSettingsFragment__please_check_if_google_play_services_is_installed_and_enabled } } - NotificationDeliveryMethod.WEBSOCKET -> { - viewModel.setPreferredNotificationMethod(method) - } + else -> R.string.NotificationsSettingsFragment__please_check_if_google_play_services_is_installed_and_enabled } + + MaterialAlertDialogBuilder(requireContext()) + .setNegativeButton(android.R.string.ok, null) + .setMessage( + getString(R.string.NotificationsSettingsFragment__an_error_occurred_while_registering_for_push_notifications_s, getString(causeId)) + ) + .show() } private fun getRingtoneSummary(uri: Uri): String { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsState.kt index 24f958ce9f..d6dce0440d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsState.kt @@ -11,6 +11,7 @@ data class NotificationsSettingsState( val notifyWhenContactJoinsSignal: Boolean, val isLinkedDevice: Boolean, val preferredNotificationMethod: NotificationDeliveryMethod, + val playServicesErrorCode: Int?, val canReceiveFcm: Boolean ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsViewModel.kt index 8dd5807299..8cb9b7f758 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsViewModel.kt @@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.notifications.DeviceSpecificNotificationConfig import org.thoughtcrime.securesms.notifications.NotificationChannels import org.thoughtcrime.securesms.notifications.SlowNotificationHeuristics import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference -import org.thoughtcrime.securesms.util.PlayServicesUtil import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.livedata.Store @@ -117,12 +116,12 @@ class NotificationsSettingsViewModel(private val sharedPreferences: SharedPrefer TextSecurePreferences.setPromptedOptimizeDoze(AppDependencies.application, false) ApplicationContext.getInstance().updatePushNotificationServices() AppDependencies.resetNetwork(true) - // Avoid calling refresh() here to prevent updating canReceiveFcm - // while the FCM token is still being refreshed. - store.update { it.copy(preferredNotificationMethod = method) } + refresh() } - val fcmState get() = PlayServicesUtil.getPlayServicesStatus(AppDependencies.application) + fun setPlayServicesErrorCode(errorCode: Int?) { + store.update { it.copy(playServicesErrorCode = errorCode) } + } /** * @param currentState If provided and [calculateSlowNotifications] = false, then we will copy the slow notification state from it @@ -161,7 +160,8 @@ class NotificationsSettingsViewModel(private val sharedPreferences: SharedPrefer notifyWhenContactJoinsSignal = SignalStore.settings.isNotifyWhenContactJoinsSignal, isLinkedDevice = SignalStore.account.isLinkedDevice, preferredNotificationMethod = SignalStore.settings.preferredNotificationMethod, - canReceiveFcm = SignalStore.account.canReceiveFcm, + playServicesErrorCode = currentState?.playServicesErrorCode, + canReceiveFcm = SignalStore.account.canReceiveFcm ) private fun canEnableNotifications(): Boolean { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/SelectRecipientsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/SelectRecipientsFragment.kt index e24b620033..c3bb74bc93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/SelectRecipientsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/SelectRecipientsFragment.kt @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.LoggingFragment import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ContactFilterView import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode +import org.thoughtcrime.securesms.contacts.paged.ChatType import org.thoughtcrime.securesms.groups.SelectionLimits import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.ViewUtil @@ -106,7 +107,7 @@ class SelectRecipientsFragment : LoggingFragment(), ContactSelectionListFragment ContactSelectionDisplayMode.FLAG_HIDE_GROUPS_V1 } - override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, callback: Consumer) { + override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, chatType: Optional, callback: Consumer) { if (recipientId.isPresent) { viewModel.select(recipientId.get()) callback.accept(true) @@ -116,7 +117,7 @@ class SelectRecipientsFragment : LoggingFragment(), ContactSelectionListFragment } } - override fun onContactDeselected(recipientId: Optional, number: String?) { + override fun onContactDeselected(recipientId: Optional, number: String?, chatType: Optional) { if (recipientId.isPresent) { viewModel.deselect(recipientId.get()) updateAddToProfile() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java index f5f280bb94..768aca7ca5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java @@ -107,8 +107,6 @@ public void onTaskRemoved(Intent rootIntent) { @Override public void onDestroy() { - AppDependencies.getDatabaseObserver().unregisterObserver(attachmentDeletionObserver); - final VoiceNotePlayer voiceNotePlayer = player; if (voiceNotePlayer != null) { voiceNotePlayer.release(); @@ -116,6 +114,7 @@ public void onDestroy() { MediaSession session = mediaSession; if (session != null) { + AppDependencies.getDatabaseObserver().unregisterObserver(attachmentDeletionObserver); session.release(); mediaSession = null; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java index 038d0b8ae0..296f237709 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java @@ -622,14 +622,15 @@ public void updateLocalCallParticipant(@NonNull WebRtcLocalRenderState state, } public void setRecipient(@NonNull Recipient recipient) { + collapsedToolbar.setTitle(recipient.getDisplayName(getContext())); + recipientName.setText(recipient.getDisplayName(getContext())); + if (recipient.getId() == recipientId) { return; } recipientId = recipient.getId(); largeHeaderAvatar.setRecipient(recipient, false); - collapsedToolbar.setTitle(recipient.getDisplayName(getContext())); - recipientName.setText(recipient.getDisplayName(getContext())); } public void setStatus(@Nullable String status) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java index 4d15cd6f73..2ed97cc02c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java @@ -116,6 +116,10 @@ public LiveRecipient getRecipient() { return liveRecipient.getValue(); } + public Flowable getRecipientFlowable() { + return recipientId.switchMap(id -> Recipient.observable(id).toFlowable(BackpressureStrategy.LATEST)).observeOn(AndroidSchedulers.mainThread()); + } + public void setRecipient(@NonNull Recipient recipient) { recipientId.onNext(recipient.getId()); liveRecipient.setValue(recipient.live()); 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 191df68b2b..15ae8b2a8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChipViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChipViewModel.kt @@ -20,9 +20,9 @@ import org.thoughtcrime.securesms.util.rx.RxStore */ class ContactChipViewModel : ViewModel() { - private val store = RxStore(emptyList()) + private val store = RxStore(emptyList>()) - val state: Flowable> = store.stateFlowable + val state: Flowable>> = store.stateFlowable .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) @@ -39,20 +39,27 @@ class ContactChipViewModel : ViewModel() { } fun add(selectedContact: SelectedContact) { - disposables += getOrCreateRecipientId(selectedContact).map { Recipient.resolved(it) }.observeOn(Schedulers.io()).subscribe { recipient -> - store.update { it + SelectedContacts.Model(selectedContact, recipient) } - disposableMap[recipient.id]?.dispose() - disposableMap[recipient.id] = store.update(recipient.live().observable().toFlowable(BackpressureStrategy.LATEST)) { changedRecipient, state -> - val index = state.indexOfFirst { it.selectedContact.matches(selectedContact) } - when { - index == 0 -> { - listOf(SelectedContacts.Model(selectedContact, changedRecipient)) + state.drop(index + 1) - } - index > 0 -> { - state.take(index) + SelectedContacts.Model(selectedContact, changedRecipient) + state.drop(index + 1) - } - else -> { - state + if (selectedContact.hasChatType()) { + store.update { it + SelectedContacts.ChatTypeModel(selectedContact) } + } else { + disposables += getOrCreateRecipientId(selectedContact).map { Recipient.resolved(it) }.observeOn(Schedulers.io()).subscribe { recipient -> + store.update { it + SelectedContacts.RecipientModel(selectedContact, recipient) } + disposableMap[recipient.id]?.dispose() + disposableMap[recipient.id] = store.update(recipient.live().observable().toFlowable(BackpressureStrategy.LATEST)) { changedRecipient, state -> + val index = state.indexOfFirst { it.selectedContact.matches(selectedContact) } + + when { + index == 0 -> { + listOf(SelectedContacts.RecipientModel(selectedContact, changedRecipient)) + state.drop(index + 1) + } + + index > 0 -> { + state.take(index) + SelectedContacts.RecipientModel(selectedContact, changedRecipient) + state.drop(index + 1) + } + + else -> { + state + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContact.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContact.java index 9957082356..c5ff892426 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContact.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContact.java @@ -5,6 +5,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration; import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey; import org.thoughtcrime.securesms.recipients.Recipient; @@ -19,23 +20,29 @@ public final class SelectedContact { private final RecipientId recipientId; private final String number; private final String username; + private final ChatType chatType; public static @NonNull SelectedContact forPhone(@Nullable RecipientId recipientId, @NonNull String number) { - return new SelectedContact(recipientId, number, null); + return new SelectedContact(recipientId, number, null, null); } public static @NonNull SelectedContact forUsername(@Nullable RecipientId recipientId, @NonNull String username) { - return new SelectedContact(recipientId, null, username); + return new SelectedContact(recipientId, null, username, null); + } + + public static @NonNull SelectedContact forChatType(@NonNull ChatType chatType) { + return new SelectedContact(null, null, null, chatType); } public static @NonNull SelectedContact forRecipientId(@NonNull RecipientId recipientId) { - return new SelectedContact(recipientId, null, null); + return new SelectedContact(recipientId, null, null, null); } - private SelectedContact(@Nullable RecipientId recipientId, @Nullable String number, @Nullable String username) { + private SelectedContact(@Nullable RecipientId recipientId, @Nullable String number, @Nullable String username, @Nullable ChatType chatType) { this.recipientId = recipientId; this.number = number; this.username = username; + this.chatType = chatType; } public @NonNull RecipientId getOrCreateRecipientId(@NonNull Context context) { @@ -60,6 +67,14 @@ public boolean hasUsername() { return username != null; } + public boolean hasChatType() { + return chatType != null; + } + + public ChatType getChatType() { + return chatType; + } + public @NonNull ContactSearchKey toContactSearchKey() { if (recipientId != null) { return new ContactSearchKey.RecipientSearchKey(recipientId, false); @@ -67,6 +82,8 @@ public boolean hasUsername() { return new ContactSearchKey.UnknownRecipientKey(ContactSearchConfiguration.SectionKey.PHONE_NUMBER, number); } else if (username != null) { return new ContactSearchKey.UnknownRecipientKey(ContactSearchConfiguration.SectionKey.USERNAME, username); + } else if (chatType != null) { + return new ContactSearchKey.ChatTypeSearchKey(chatType); } else { throw new IllegalStateException("Nothing to map!"); } @@ -86,6 +103,7 @@ public boolean matches(@Nullable SelectedContact other) { } return number != null && number .equals(other.number) || - username != null && username.equals(other.username); + username != null && username.equals(other.username) || + chatType != null && chatType.equals(other.chatType); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt index 243b97f7c1..85024b5257 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt @@ -1,8 +1,12 @@ package org.thoughtcrime.securesms.contacts +import android.content.res.ColorStateList import android.view.View +import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.ContextCompat import com.bumptech.glide.Glide import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.contacts.paged.ChatType import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -11,25 +15,28 @@ import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder object SelectedContacts { @JvmStatic - fun register(adapter: MappingAdapter, onCloseIconClicked: (Model) -> Unit) { - adapter.registerFactory(Model::class.java, LayoutFactory({ ViewHolder(it, onCloseIconClicked) }, R.layout.contact_selection_list_chip)) + fun register(adapter: MappingAdapter, onCloseIconClicked: (Model<*>) -> Unit) { + adapter.registerFactory(RecipientModel::class.java, LayoutFactory({ RecipientViewHolder(it, onCloseIconClicked) }, R.layout.contact_selection_list_chip)) + adapter.registerFactory(ChatTypeModel::class.java, LayoutFactory({ ChatTypeViewHolder(it, onCloseIconClicked) }, R.layout.contact_selection_list_chip)) } - class Model(val selectedContact: SelectedContact, val recipient: Recipient) : MappingModel { - override fun areItemsTheSame(newItem: Model): Boolean { + sealed class Model(val selectedContact: SelectedContact) : MappingModel + + class RecipientModel(selectedContact: SelectedContact, val recipient: Recipient) : Model(selectedContact = selectedContact) { + override fun areItemsTheSame(newItem: RecipientModel): Boolean { return newItem.selectedContact.matches(selectedContact) && recipient == newItem.recipient } - override fun areContentsTheSame(newItem: Model): Boolean { + override fun areContentsTheSame(newItem: RecipientModel): Boolean { return areItemsTheSame(newItem) && recipient.hasSameContent(newItem.recipient) } } - private class ViewHolder(itemView: View, private val onCloseIconClicked: (Model) -> Unit) : MappingViewHolder(itemView) { + private class RecipientViewHolder(itemView: View, private val onCloseIconClicked: (RecipientModel) -> Unit) : MappingViewHolder(itemView) { private val chip: ContactChip = itemView.findViewById(R.id.contact_chip) - override fun bind(model: Model) { + override fun bind(model: RecipientModel) { chip.text = model.recipient.getShortDisplayName(context) chip.setContact(model.selectedContact) chip.isCloseIconVisible = true @@ -39,4 +46,36 @@ object SelectedContacts { chip.setAvatar(Glide.with(itemView), model.recipient, null) } } + + class ChatTypeModel(selectedContact: SelectedContact) : Model(selectedContact = selectedContact) { + override fun areItemsTheSame(newItem: ChatTypeModel): Boolean { + return newItem.selectedContact.matches(selectedContact) && newItem.selectedContact.chatType == selectedContact.chatType + } + + override fun areContentsTheSame(newItem: ChatTypeModel): Boolean { + return areItemsTheSame(newItem) + } + } + + private class ChatTypeViewHolder(itemView: View, private val onCloseIconClicked: (ChatTypeModel) -> Unit) : MappingViewHolder(itemView) { + + private val chip: ContactChip = itemView.findViewById(R.id.contact_chip) + + override fun bind(model: ChatTypeModel) { + if (model.selectedContact.chatType == ChatType.INDIVIDUAL) { + chip.text = context.getString(R.string.ChatFoldersFragment__one_on_one_chats) + chip.chipIcon = AppCompatResources.getDrawable(context, R.drawable.symbol_person_light_24) + chip.chipIconTint = ColorStateList.valueOf(ContextCompat.getColor(context, R.color.signal_colorOnSurface)) + } else { + chip.text = context.getString(R.string.ChatFoldersFragment__groups) + chip.chipIcon = AppCompatResources.getDrawable(context, R.drawable.symbol_group_light_20) + chip.chipIconTint = ColorStateList.valueOf(ContextCompat.getColor(context, R.color.signal_colorOnSurface)) + } + chip.setContact(model.selectedContact) + chip.isCloseIconVisible = true + chip.setOnCloseIconClickListener { + onCloseIconClicked(model) + } + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ChatType.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ChatType.kt new file mode 100644 index 0000000000..14b3ca536c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ChatType.kt @@ -0,0 +1,9 @@ +package org.thoughtcrime.securesms.contacts.paged + +/** + * Enum class that represents the different chat types a chat folder can have + */ +enum class ChatType { + INDIVIDUAL, + GROUPS +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt index 193d622fed..23a3bc3022 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt @@ -5,6 +5,7 @@ import android.text.SpannableStringBuilder import android.view.View import android.view.ViewGroup import android.widget.CheckBox +import android.widget.ImageView import android.widget.TextView import androidx.appcompat.widget.AppCompatImageView import androidx.core.content.ContextCompat @@ -57,6 +58,7 @@ open class ContactSearchAdapter( registerKnownRecipientItems(this, fixedContacts, displayOptions, onClickCallbacks::onKnownRecipientClicked, longClickCallbacks::onKnownRecipientLongClick, callButtonClickCallbacks) registerHeaders(this) registerExpands(this, onClickCallbacks::onExpandClicked) + registerChatTypeItems(this, onClickCallbacks::onChatTypeClicked) registerFactory(UnknownRecipientModel::class.java, LayoutFactory({ UnknownRecipientViewHolder(it, onClickCallbacks::onUnknownRecipientClicked, displayOptions.displayCheckBox) }, R.layout.contact_search_unknown_item)) } @@ -117,6 +119,13 @@ open class ContactSearchAdapter( ) } + fun registerChatTypeItems(mappingAdapter: MappingAdapter, chatTypeRowListener: OnClickedCallback) { + mappingAdapter.registerFactory( + ChatTypeModel::class.java, + LayoutFactory({ ChatTypeViewHolder(it, chatTypeRowListener) }, R.layout.contact_search_chat_type_item) + ) + } + fun toMappingModelList(contactSearchData: List, selection: Set, arbitraryRepository: ArbitraryRepository?): MappingModelList { return MappingModelList( contactSearchData.filterNotNull().map { @@ -132,6 +141,7 @@ open class ContactSearchAdapter( is ContactSearchData.Empty -> EmptyModel(it) is ContactSearchData.GroupWithMembers -> GroupWithMembersModel(it) is ContactSearchData.UnknownRecipient -> UnknownRecipientModel(it) + is ContactSearchData.ChatTypeRow -> ChatTypeModel(it, selection.contains(it.contactSearchKey)) } } ) @@ -675,6 +685,7 @@ open class ContactSearchAdapter( ContactSearchConfiguration.SectionKey.MESSAGES -> R.string.ContactsCursorLoader__messages ContactSearchConfiguration.SectionKey.GROUPS_WITH_MEMBERS -> R.string.ContactsCursorLoader_group_members ContactSearchConfiguration.SectionKey.CONTACTS_WITHOUT_THREADS -> R.string.ContactsCursorLoader_contacts + ContactSearchConfiguration.SectionKey.CHAT_TYPES -> R.string.ContactsCursorLoader__chat_types else -> error("This section does not support HEADER") } ) @@ -712,6 +723,42 @@ open class ContactSearchAdapter( } } + /** + * Mapping Model for chat types. + */ + class ChatTypeModel(val data: ContactSearchData.ChatTypeRow, val isSelected: Boolean) : MappingModel { + override fun areItemsTheSame(newItem: ChatTypeModel): Boolean = data == newItem.data + override fun areContentsTheSame(newItem: ChatTypeModel): Boolean = data == newItem.data && isSelected == newItem.isSelected + } + + /** + * View Holder for chat types + */ + private class ChatTypeViewHolder( + itemView: View, + val onClick: OnClickedCallback + ) : MappingViewHolder(itemView) { + + val image: ImageView = itemView.findViewById(R.id.image) + val name: TextView = itemView.findViewById(R.id.name) + val checkbox: CheckBox = itemView.findViewById(R.id.check_box) + + override fun bind(model: ChatTypeModel) { + itemView.setOnClickListener { onClick.onClicked(itemView, model.data, model.isSelected) } + + image.setImageResource(model.data.imageResId) + + if (model.data.chatType == ChatType.INDIVIDUAL) { + name.text = context.getString(R.string.ChatFoldersFragment__one_on_one_chats) + } + if (model.data.chatType == ChatType.GROUPS) { + name.text = context.getString(R.string.ChatFoldersFragment__groups) + } + + checkbox.isChecked = model.isSelected + } + } + private class IsSelfComparator : Comparator { override fun compare(lhs: Recipient?, rhs: Recipient?): Int { val isLeftSelf = lhs?.isSelf == true @@ -764,6 +811,7 @@ open class ContactSearchAdapter( fun onUnknownRecipientClicked(view: View, unknownRecipient: ContactSearchData.UnknownRecipient, isSelected: Boolean) { throw NotImplementedError() } + fun onChatTypeClicked(view: View, chatTypeRow: ContactSearchData.ChatTypeRow, isSelected: Boolean) } interface CallButtonClickCallbacks { 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 e3006d7e63..e17a2575bc 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 @@ -193,6 +193,18 @@ class ContactSearchConfiguration private constructor( override val includeHeader: Boolean = false override val expandConfig: ExpandConfig? = null } + + /** + * Chat types that are displayed when creating a chat folder. + * + * Key: [ContactSearchKey.ChatType] + * Data: [ContactSearchData.ChatTypeRow] + * Model: [ContactSearchAdapter.ChatTypeModel] + */ + data class ChatTypes( + override val includeHeader: Boolean = true, + override val expandConfig: ExpandConfig? = null + ) : Section(SectionKey.CHAT_TYPES) } /** @@ -234,6 +246,11 @@ class ContactSearchConfiguration private constructor( */ CONTACTS_WITHOUT_THREADS, + /** + * Chat types (ie unreads, 1:1, groups) that are used to customize folders + */ + CHAT_TYPES, + /** * Arbitrary row (think new group button, username row, etc) */ 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 36af4f2aa4..a6e191041f 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 @@ -69,6 +69,14 @@ sealed class ContactSearchData(val contactSearchKey: ContactSearchKey) { val action: HeaderAction? ) : ContactSearchData(ContactSearchKey.Header(sectionKey)) + /** + * A row containing a chat type (filters that can be applied to a chat folders) + */ + class ChatTypeRow( + val imageResId: Int, + val chatType: ChatType + ) : ContactSearchData(ContactSearchKey.ChatTypeSearchKey(chatType)) + /** * A row which the user can click to view all entries for a given section. */ diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchKey.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchKey.kt index 08d91cd8db..bed4eec8a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchKey.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchKey.kt @@ -76,5 +76,14 @@ sealed class ContactSearchKey { */ data class Message(val messageId: Long) : ContactSearchKey() + /** + * Search key for a ChatType + */ + data class ChatTypeSearchKey(val chatType: ChatType) : ContactSearchKey() { + override fun requireSelectedContact(): SelectedContact { + return SelectedContact.forChatType(chatType) + } + } + object Empty : ContactSearchKey() } 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 4ec13532f3..6177759d4c 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 @@ -87,6 +87,11 @@ class ContactSearchMediator( Log.d(TAG, "onExpandClicked()") viewModel.expandSection(expand.sectionKey) } + + override fun onChatTypeClicked(view: View, chatTypeRow: ContactSearchData.ChatTypeRow, isSelected: Boolean) { + Log.d(TAG, "onChatTypeClicked() chatType $chatTypeRow") + toggleChatTypeSelection(view, chatTypeRow, isSelected) + } }, longClickCallbacks = ContactSearchAdapter.LongClickCallbacksAdapter(), storyContextMenuCallbacks = StoryContextMenuCallbacks(), @@ -188,6 +193,16 @@ class ContactSearchMediator( } } + private fun toggleChatTypeSelection(view: View, contactSearchData: ContactSearchData, isSelected: Boolean) { + return if (isSelected) { + Log.d(TAG, "toggleSelection(OFF) ${contactSearchData.contactSearchKey}") + viewModel.setKeysNotSelected(setOf(contactSearchData.contactSearchKey)) + } else { + Log.d(TAG, "toggleSelection(ON) ${contactSearchData.contactSearchKey}") + viewModel.setKeysSelected(callbacks.onBeforeContactsSelected(view, setOf(contactSearchData.contactSearchKey))) + } + } + private inner class StoryContextMenuCallbacks : ContactSearchAdapter.StoryContextMenuCallbacks { override fun onOpenStorySettings(story: ContactSearchData.Story) { if (story.recipient.isMyStory) { 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 8b0a332d68..8deb266076 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 @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.contacts.paged import android.database.Cursor import org.signal.core.util.requireLong import org.signal.paging.PagedDataSource +import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.contacts.ContactRepository import org.thoughtcrime.securesms.contacts.paged.collections.ContactSearchCollection import org.thoughtcrime.securesms.contacts.paged.collections.ContactSearchIterator @@ -142,6 +143,7 @@ class ContactSearchPagedDataSource( is ContactSearchConfiguration.Section.PhoneNumber -> if (isPossiblyPhoneNumber(query)) 1 else 0 is ContactSearchConfiguration.Section.Username -> if (isPossiblyUsername(query)) 1 else 0 is ContactSearchConfiguration.Section.Empty -> 1 + is ContactSearchConfiguration.Section.ChatTypes -> getChatTypesData(section).size } } @@ -181,6 +183,7 @@ class ContactSearchPagedDataSource( is ContactSearchConfiguration.Section.PhoneNumber -> getPossiblePhoneNumber(section, query) is ContactSearchConfiguration.Section.Username -> getPossibleUsername(section, query) is ContactSearchConfiguration.Section.Empty -> listOf(ContactSearchData.Empty(query)) + is ContactSearchConfiguration.Section.ChatTypes -> getChatTypesData(section) } } @@ -348,6 +351,22 @@ class ContactSearchPagedDataSource( } } + // TODO [michelle]: Replace hardcoding chat types after building db + private fun getChatTypesData(section: ContactSearchConfiguration.Section.ChatTypes): List { + val data = mutableListOf() + + if (section.includeHeader) { + data.add(ContactSearchData.Header(section.sectionKey, section.headerAction)) + } + data.addAll( + listOf( + ContactSearchData.ChatTypeRow(R.drawable.symbol_person_light_24, ChatType.INDIVIDUAL), + ContactSearchData.ChatTypeRow(R.drawable.symbol_group_light_20, ChatType.GROUPS) + ) + ) + return data + } + private fun getContactsWithoutThreadsContactData(section: ContactSearchConfiguration.Section.ContactsWithoutThreads, query: String?, startIndex: Int, endIndex: Int): List { return getContactsWithoutThreadsIterator(query).use { records -> readContactData( diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchRepository.kt index b24584a315..917c080889 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchRepository.kt @@ -21,6 +21,7 @@ class ContactSearchRepository { val isSelectable = when (it) { is ContactSearchKey.RecipientSearchKey -> canSelectRecipient(it.recipientId) is ContactSearchKey.UnknownRecipientKey -> it.sectionKey == ContactSearchConfiguration.SectionKey.PHONE_NUMBER + is ContactSearchKey.ChatTypeSearchKey -> true else -> false } ContactSearchSelectionResult(it, isSelectable) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ChatFolderAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ChatFolderAdapter.kt new file mode 100644 index 0000000000..82dd3d9285 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ChatFolderAdapter.kt @@ -0,0 +1,79 @@ +package org.thoughtcrime.securesms.conversationlist + +import android.content.Context +import android.content.res.ColorStateList +import android.view.View +import android.widget.TextView +import androidx.core.content.ContextCompat +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderContextMenu +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord +import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory +import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter +import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder +import org.thoughtcrime.securesms.util.visible + +/** +* RecyclerView adapter for the chat folders displayed on conversation list +*/ +class ChatFolderAdapter(val callbacks: Callbacks) : MappingAdapter() { + + init { + registerFactory(ChatFolderMappingModel::class.java, LayoutFactory({ v -> ViewHolder(v, callbacks) }, R.layout.chat_folder_item)) + } + + class ViewHolder(itemView: View, private val callbacks: Callbacks) : MappingViewHolder(itemView) { + + private val name: TextView = findViewById(R.id.name) + private val unreadCount: TextView = findViewById(R.id.unread_count) + + override fun bind(model: ChatFolderMappingModel) { + itemView.isSelected = model.isSelected + + val folder = model.chatFolder + name.text = getName(itemView.context, folder) + unreadCount.visible = folder.unreadCount > 0 + unreadCount.text = folder.unreadCount.toString() + itemView.setOnClickListener { + callbacks.onChatFolderClicked(model.chatFolder) + } + itemView.setOnLongClickListener { view -> + ChatFolderContextMenu.show( + context = itemView.context, + anchorView = view, + folderType = model.chatFolder.folderType, + onEdit = { callbacks.onEdit(model.chatFolder) }, + onAdd = { callbacks.onAdd() }, + onMuteAll = { callbacks.onMuteAll(model.chatFolder) }, + onReadAll = { callbacks.onReadAll(model.chatFolder) }, + onDelete = { callbacks.onDelete(model.chatFolder) }, + onReorder = { callbacks.onReorder() } + ) + true + } + if (model.isSelected) { + itemView.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.signal_colorSurfaceVariant)) + } else { + itemView.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.transparent)) + } + } + + private fun getName(context: Context, folder: ChatFolderRecord): String { + return if (folder.folderType == ChatFolderRecord.FolderType.ALL) { + context.getString(R.string.ChatFoldersFragment__all_chats) + } else { + folder.name + } + } + } + + interface Callbacks { + fun onChatFolderClicked(chatFolder: ChatFolderRecord) + fun onEdit(chatFolder: ChatFolderRecord) + fun onAdd() + fun onMuteAll(chatFolder: ChatFolderRecord) + fun onReadAll(chatFolder: ChatFolderRecord) + fun onDelete(chatFolder: ChatFolderRecord) + fun onReorder() + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel.kt new file mode 100644 index 0000000000..14d3d0e8d0 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ChatFolderMappingModel.kt @@ -0,0 +1,17 @@ +package org.thoughtcrime.securesms.conversationlist + +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord +import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel + +data class ChatFolderMappingModel( + val chatFolder: ChatFolderRecord, + val isSelected: Boolean +) : MappingModel { + override fun areItemsTheSame(newItem: ChatFolderMappingModel): Boolean { + return chatFolder == newItem.chatFolder + } + + override fun areContentsTheSame(newItem: ChatFolderMappingModel): Boolean { + return areItemsTheSame(newItem) && isSelected == newItem.isSelected + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java index 3e065e3430..17b29dfcf2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java @@ -38,6 +38,7 @@ class ConversationListAdapter extends ListAdapter typingSet = new HashSet<>(); + private final LifecycleOwner lifecycleOwner; + private final RequestManager requestManager; + private final OnConversationClickListener onConversationClickListener; + private final ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked; + private final EmptyFolderViewHolder.OnFolderSettingsClickListener onFolderSettingsClicked; + private final Set typingSet = new HashSet<>(); - private PagingController pagingController; + private ConversationSet selectedConversations = new ConversationSet(); + private PagingController pagingController; protected ConversationListAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull RequestManager requestManager, @NonNull OnConversationClickListener onConversationClickListener, - @NonNull ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked) + @NonNull ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked, + @NonNull EmptyFolderViewHolder.OnFolderSettingsClickListener onFolderSettingsClicked) { super(new ConversationDiffCallback()); @@ -65,6 +68,7 @@ protected ConversationListAdapter(@NonNull LifecycleOwner lifecycleOwner, this.requestManager = requestManager; this.onConversationClickListener = onConversationClickListener; this.onClearFilterClicked = onClearFilterClicked; + this.onFolderSettingsClicked = onFolderSettingsClicked; } @Override @@ -118,6 +122,9 @@ protected ConversationListAdapter(@NonNull LifecycleOwner lifecycleOwner, } else if (viewType == TYPE_CLEAR_FILTER_EMPTY) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.conversation_list_item_clear_filter_empty, parent, false); return new ClearFilterViewHolder(v, onClearFilterClicked); + } else if (viewType == TYPE_CHAT_FOLDER_EMPTY) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.conversation_list_item_folder_empty, parent, false); + return new EmptyFolderViewHolder(v, onFolderSettingsClicked); } else { throw new IllegalStateException("Unknown type! " + viewType); } @@ -229,6 +236,8 @@ public int getItemViewType(int position) { return TYPE_CLEAR_FILTER_FOOTER; case CONVERSATION_FILTER_EMPTY: return TYPE_CLEAR_FILTER_EMPTY; + case CHAT_FOLDER_EMPTY: + return TYPE_CHAT_FOLDER_EMPTY; case THREAD: return TYPE_THREAD; case EMPTY: @@ -281,6 +290,18 @@ public HeaderViewHolder(@NonNull View itemView) { } } + static class EmptyFolderViewHolder extends RecyclerView.ViewHolder { + + public EmptyFolderViewHolder(@NonNull View itemView, OnFolderSettingsClickListener listener) { + super(itemView); + itemView.findViewById(R.id.folder_settings).setOnClickListener(v -> listener.onFolderSettingsClick()); + } + + interface OnFolderSettingsClickListener { + void onFolderSettingsClick(); + } + } + interface OnConversationClickListener { void onConversationClick(@NonNull Conversation conversation); boolean onConversationLongClick(@NonNull Conversation conversation, @NonNull View view); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java index a37a60c5e9..e764da05d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java @@ -47,6 +47,7 @@ public class ConversationListArchiveFragment extends ConversationListFragment im { private View coordinator; private RecyclerView list; + private RecyclerView foldersList; private Stub emptyState; private PulsingFloatingActionButton fab; private PulsingFloatingActionButton cameraFab; @@ -73,12 +74,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat emptyState = new Stub<>(view.findViewById(R.id.empty_state)); fab = view.findViewById(R.id.fab); cameraFab = view.findViewById(R.id.camera_fab); + foldersList = view.findViewById(R.id.chat_folder_list); toolbar.get().setNavigationOnClickListener(v -> NavHostFragment.findNavController(this).popBackStack()); toolbar.get().setTitle(R.string.AndroidManifest_archived_conversations); fab.hide(); cameraFab.hide(); + foldersList.setVisibility(View.GONE); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java index a6b1eed2e6..a1d69e9dbc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java @@ -11,6 +11,7 @@ import org.signal.core.util.Stopwatch; import org.signal.core.util.logging.Log; import org.signal.paging.PagedDataSource; +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord; import org.thoughtcrime.securesms.conversationlist.model.Conversation; import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter; import org.thoughtcrime.securesms.conversationlist.model.ConversationReader; @@ -23,6 +24,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SignalTrace; import java.util.ArrayList; @@ -40,16 +42,18 @@ abstract class ConversationListDataSource implements PagedDataSource cursors = new ArrayList<>(5); long originalLimit = limit; - if (offset == 0 && hasPinnedHeader()) { + if (!RemoteConfig.getShowChatFolders() && offset == 0 && hasPinnedHeader()) { MatrixCursor pinnedHeaderCursor = new MatrixCursor(ConversationReader.HEADER_COLUMN); pinnedHeaderCursor.addRow(ConversationReader.PINNED_HEADER); cursors.add(pinnedHeaderCursor); limit--; } - Cursor pinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, true, offset, limit); + Cursor pinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, true, offset, limit, chatFolder); cursors.add(pinnedCursor); limit -= pinnedCursor.getCount(); - if (offset == 0 && hasUnpinnedHeader()) { + if (!RemoteConfig.getShowChatFolders() && offset == 0 && hasUnpinnedHeader()) { MatrixCursor unpinnedHeaderCursor = new MatrixCursor(ConversationReader.HEADER_COLUMN); unpinnedHeaderCursor.addRow(ConversationReader.UNPINNED_HEADER); cursors.add(unpinnedHeaderCursor); @@ -222,7 +228,7 @@ protected Cursor getCursor(long offset, long limit) { } long unpinnedOffset = Math.max(0, offset - pinnedCount - getHeaderOffset()); - Cursor unpinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, false, unpinnedOffset, limit); + Cursor unpinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, false, unpinnedOffset, limit, chatFolder); cursors.add(unpinnedCursor); boolean shouldInsertConversationFilterFooter = offset + originalLimit >= totalCount && hasConversationFilterFooter(); @@ -244,7 +250,11 @@ protected Cursor getCursor(long offset, long limit) { @VisibleForTesting int getHeaderOffset() { - return (hasPinnedHeader() ? 1 : 0) + (hasUnpinnedHeader() ? 1 : 0); + if (RemoteConfig.getShowChatFolders()) { + return 0; + } else { + return (hasPinnedHeader() ? 1 : 0) + (hasUnpinnedHeader() ? 1 : 0); + } } @VisibleForTesting @@ -259,7 +269,7 @@ boolean hasUnpinnedHeader() { @VisibleForTesting boolean hasArchivedFooter() { - return archivedCount != 0; + return archivedCount != 0 && chatFolder.getFolderType() == ChatFolderRecord.FolderType.ALL; } boolean hasConversationFilterFooter() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 37448647ae..28f8f147b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -110,6 +110,7 @@ import org.thoughtcrime.securesms.components.menu.SignalContextMenu; import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton; import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity; +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord; import org.thoughtcrime.securesms.components.settings.app.notifications.manual.NotificationProfileSelectionFragment; import org.thoughtcrime.securesms.components.spoiler.SpoilerAnnotation; import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaControllerOwner; @@ -161,6 +162,7 @@ import org.thoughtcrime.securesms.util.AppStartup; import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.ConversationUtil; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.thoughtcrime.securesms.util.SnapToTopDataObserver; @@ -193,7 +195,9 @@ public class ConversationListFragment extends MainFragment implements ActionMode.Callback, ConversationListAdapter.OnConversationClickListener, MegaphoneActionController, - ClearFilterViewHolder.OnClearFilterClickListener + ClearFilterViewHolder.OnClearFilterClickListener, + ChatFolderAdapter.Callbacks, + ConversationListAdapter.EmptyFolderViewHolder.OnFolderSettingsClickListener { public static final short MESSAGE_REQUESTS_REQUEST_CODE_CREATE_NAME = 32562; public static final short SMS_ROLE_REQUEST_CODE = 32563; @@ -209,6 +213,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode private ActionMode actionMode; private View coordinator; + private RecyclerView chatFolderList; private RecyclerView list; private Stub bannerView; private PulsingFloatingActionButton fab; @@ -229,6 +234,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode private SignalBottomActionBar bottomActionBar; private SignalContextMenu activeContextMenu; private LifecycleDisposable lifecycleDisposable; + private ChatFolderAdapter chatFolderAdapter; protected ConversationListArchiveItemDecoration archiveDecoration; protected ConversationListItemAnimator itemAnimator; @@ -273,6 +279,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat lifecycleDisposable.bindTo(getViewLifecycleOwner()); coordinator = view.findViewById(R.id.coordinator); + chatFolderList = view.findViewById(R.id.chat_folder_list); list = view.findViewById(R.id.list); bottomActionBar = view.findViewById(R.id.conversation_list_bottom_action_bar); bannerView = new Stub<>(view.findViewById(R.id.banner_compose_view)); @@ -285,6 +292,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat fab.setVisibility(View.VISIBLE); cameraFab.setVisibility(View.VISIBLE); + chatFolderList.setVisibility(RemoteConfig.getShowChatFolders() ? View.VISIBLE : View.GONE); contactSearchMediator = new ContactSearchMediator(this, Collections.emptySet(), @@ -373,6 +381,12 @@ public boolean canStartNestedScroll() { archiveDecoration = new ConversationListArchiveItemDecoration(new ColorDrawable(getResources().getColor(R.color.conversation_list_archive_background_end))); itemAnimator = new ConversationListItemAnimator(); + chatFolderAdapter = new ChatFolderAdapter(this); + + chatFolderList.setLayoutManager(new LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)); + chatFolderList.setAdapter(chatFolderAdapter); + chatFolderList.setItemAnimator(null); + list.setLayoutManager(new LinearLayoutManager(requireActivity())); list.setItemAnimator(itemAnimator); list.addItemDecoration(archiveDecoration); @@ -854,7 +868,7 @@ private void maybeScheduleRefreshProfileJob() { private void initializeListAdapters() { - defaultAdapter = new ConversationListAdapter(getViewLifecycleOwner(), Glide.with(this), this, this); + defaultAdapter = new ConversationListAdapter(getViewLifecycleOwner(), Glide.with(this), this, this, this); setAdapter(defaultAdapter); @@ -923,6 +937,7 @@ private void initializeViewModel() { lifecycleDisposable.add(viewModel.getHasNoConversations().subscribe(this::updateEmptyState)); lifecycleDisposable.add(viewModel.getNotificationProfiles().subscribe(profiles -> requireCallback().updateNotificationProfileStatus(profiles))); lifecycleDisposable.add(viewModel.getWebSocketState().subscribe(pipeState -> requireCallback().updateProxyStatus(pipeState))); + lifecycleDisposable.add(viewModel.getChatFolderState().subscribe(this::onChatFoldersChanged)); appForegroundObserver = new AppForegroundObserver.Listener() { @Override @@ -982,6 +997,10 @@ private void onConversationListChanged(@NonNull List conversations }); } + private void onChatFoldersChanged(List folders) { + chatFolderAdapter.submitList(new ArrayList<>(folders)); + } + private void onMegaphoneChanged(@NonNull Megaphone megaphone) { if (megaphone == Megaphone.NONE || isArchived() || getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { if (megaphoneContainer.resolved()) { @@ -1583,6 +1602,54 @@ public void onClearFilterClick() { pullViewAppBarLayout.setExpanded(false, true); } + @Override + public void onChatFolderClicked(@NonNull ChatFolderRecord chatFolder) { + viewModel.select(chatFolder); + } + + @Override + public void onEdit(@NonNull ChatFolderRecord chatFolder) { + startActivity(AppSettingsActivity.createChatFolder(requireContext(), chatFolder.getId())); + } + + @Override + public void onAdd() { + startActivity(AppSettingsActivity.createChatFolder(requireContext(), -1)); + } + + @Override + public void onMuteAll(@NonNull ChatFolderRecord chatFolder) { + MuteDialog.show(requireContext(), until -> viewModel.onMuteChatFolder(chatFolder, until)); + } + + @Override + public void onReadAll(@NonNull ChatFolderRecord chatFolder) { + if (chatFolder.getFolderType() == ChatFolderRecord.FolderType.ALL) { + handleMarkAllRead(); + } else { + viewModel.markChatFolderRead(chatFolder); + } + } + + @Override + public void onDelete(@NonNull ChatFolderRecord chatFolder) { + new MaterialAlertDialogBuilder(requireActivity()) + .setMessage(getString(R.string.CreateFoldersFragment__delete_this_chat_folder)) + .setPositiveButton(R.string.delete, (dialog, which) -> viewModel.deleteChatFolder(chatFolder)) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + @Override + public void onReorder() { + startActivity(AppSettingsActivity.chatFolders(requireContext())); + } + + @Override + public void onFolderSettingsClick() { + startActivity(AppSettingsActivity.chatFolders(requireContext())); + } + private class ArchiveListenerCallback extends ItemTouchHelper.SimpleCallback { private static final long SWIPE_ANIMATION_DURATION = 175; @@ -1827,6 +1894,11 @@ public void onExpandClicked(@NonNull ContactSearchData.Expand expand) { public void onUnknownRecipientClicked(@NonNull View view, @NonNull ContactSearchData.UnknownRecipient unknownRecipient, boolean isSelected) { throw new UnsupportedOperationException(); } + + @Override + public void onChatTypeClicked(@NonNull View view, @NonNull ContactSearchData.ChatTypeRow chatTypeRow, boolean isSelected) { + throw new UnsupportedOperationException(); + } } public interface Callback extends Material3OnScrollHelperBinder, SearchBinder { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java index d83d05e331..5835d5a5fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java @@ -134,6 +134,7 @@ public final class ConversationListItem extends ConstraintLayout implements Bind private View uncheckedView; private View checkedView; private View unreadMentions; + private View pinnedView; private int thumbSize; private GlideLiveDataTarget thumbTarget; @@ -213,7 +214,7 @@ public void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations) { - bindThread(lifecycleOwner, thread, glideRequests, locale, typingThreads, selectedConversations, null, false); + bindThread(lifecycleOwner, thread, glideRequests, locale, typingThreads, selectedConversations, null, false, true); } public void bindThread(@NonNull LifecycleOwner lifecycleOwner, @@ -223,7 +224,8 @@ public void bindThread(@NonNull LifecycleOwner lifecycleOwner, @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations, @Nullable String highlightSubstring, - boolean appendSystemContactIcon) + boolean appendSystemContactIcon, + boolean showPinned) { this.threadId = thread.getThreadId(); this.requestManager = requestManager; @@ -248,9 +250,9 @@ public void bindThread(@NonNull LifecycleOwner lifecycleOwner, if (highlightSubstring != null) { String name = recipient.get().isSelf() ? getContext().getString(R.string.note_to_self) : recipient.get().getDisplayName(getContext()); - this.fromView.setText(recipient.get(), SearchUtil.getHighlightedSpan(locale, searchStyleFactory, name, highlightSubstring, SearchUtil.MATCH_ALL), suffix); + this.fromView.setText(recipient.get(), SearchUtil.getHighlightedSpan(locale, searchStyleFactory, name, highlightSubstring, SearchUtil.MATCH_ALL), suffix, true, false, showPinned && thread.isPinned()); } else { - this.fromView.setText(recipient.get(), suffix); + this.fromView.setText(recipient.get(), recipient.get().getDisplayName(getContext()), suffix, true, false, showPinned && thread.isPinned()); } this.typingThreads = typingThreads; @@ -562,9 +564,9 @@ private void onRecipientChanged(@NonNull Recipient recipient) { } else { name = recipient.getDisplayName(getContext()); } - fromView.setText(recipient, SearchUtil.getHighlightedSpan(locale, searchStyleFactory, new SpannableString(name), highlightSubstring, SearchUtil.MATCH_ALL), null, thread != null); + fromView.setText(recipient, SearchUtil.getHighlightedSpan(locale, searchStyleFactory, new SpannableString(name), highlightSubstring, SearchUtil.MATCH_ALL), null, thread != null, false, thread != null && thread.isPinned()); } else { - fromView.setText(recipient); + fromView.setText(recipient, recipient.getDisplayName(getContext()), null, true, false, thread != null && thread.isPinned()); } contactPhotoImage.setAvatar(requestManager, recipient, !batchMode, false); setBadgeFromRecipient(recipient); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt index 17c48c4169..11b61bbd1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt @@ -121,7 +121,8 @@ class ConversationListSearchAdapter( emptySet(), ConversationSet(), model.thread.query, - true + true, + false ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.kt index 09ed179957..62a30fb54e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.kt @@ -2,16 +2,22 @@ package org.thoughtcrime.securesms.conversationlist import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.Flowables import io.reactivex.rxjava3.kotlin.addTo import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.signal.paging.PagedData import org.signal.paging.PagingConfig import org.signal.paging.ProxyPagingController +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFoldersRepository import org.thoughtcrime.securesms.components.settings.app.notifications.profiles.NotificationProfilesRepository import org.thoughtcrime.securesms.conversationlist.chatfilter.ConversationFilterRequest import org.thoughtcrime.securesms.conversationlist.chatfilter.ConversationFilterSource @@ -25,7 +31,10 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.megaphone.Megaphone import org.thoughtcrime.securesms.megaphone.MegaphoneRepository import org.thoughtcrime.securesms.megaphone.Megaphones +import org.thoughtcrime.securesms.notifications.MarkReadReceiver import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.rx.RxStore import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState import java.util.concurrent.TimeUnit @@ -53,10 +62,15 @@ class ConversationListViewModel( val megaphoneState: Flowable = store.mapDistinctForUi { it.megaphone } val selectedState: Flowable = store.mapDistinctForUi { it.selectedConversations } val filterRequestState: Flowable = store.mapDistinctForUi { it.filterRequest } + val chatFolderState: Flowable> = store.mapDistinctForUi { it.chatFolders } val hasNoConversations: Flowable val controller = ProxyPagingController() + val folders: List + get() = store.state.chatFolders + val currentFolder: ChatFolderRecord + get() = store.state.currentFolder val conversationFilterRequest: ConversationFilterRequest get() = store.state.filterRequest val megaphone: Megaphone @@ -74,13 +88,14 @@ class ConversationListViewModel( conversationListDataSource = store .stateFlowable .subscribeOn(Schedulers.io()) - .map { it.filterRequest } + .map { it.filterRequest to it.currentFolder } .distinctUntilChanged() - .map { + .map { (filterRequest, folder) -> ConversationListDataSource.create( - it.filter, + folder, + filterRequest.filter, isArchived, - SignalStore.uiHints.canDisplayPullToFilterTip() && it.source === ConversationFilterSource.OVERFLOW + SignalStore.uiHints.canDisplayPullToFilterTip() && filterRequest.source === ConversationFilterSource.OVERFLOW ) } .replay(1) @@ -100,6 +115,17 @@ class ConversationListViewModel( .subscribe { controller.onDataInvalidated() } .addTo(disposables) + Flowables.combineLatest( + RxDatabaseObserver + .conversationList + .debounce(250, TimeUnit.MILLISECONDS), + RxDatabaseObserver + .chatFolders + .throttleLatest(500, TimeUnit.MILLISECONDS) + ) + .subscribe { loadCurrentFolders() } + .addTo(disposables) + val pinnedCount = RxDatabaseObserver .conversationList .map { SignalDatabase.threads.getPinnedConversationListCount(ConversationFilter.OFF) } @@ -191,6 +217,28 @@ class ConversationListViewModel( megaphoneRepository.markVisible(visible.event) } + private fun loadCurrentFolders() { + viewModelScope.launch(Dispatchers.IO) { + val folders = ChatFoldersRepository.getCurrentFolders(includeUnreadCount = true) + + val selectedFolderId = if (currentFolder.id == -1L) { + folders.firstOrNull()?.id + } else { + currentFolder.id + } + val chatFolders = folders.map { folder -> + ChatFolderMappingModel(folder, selectedFolderId == folder.id) + } + + store.update { + it.copy( + currentFolder = folders.find { folder -> folder.id == selectedFolderId } ?: ChatFolderRecord(), + chatFolders = chatFolders + ) + } + } + } + fun getNotificationProfiles(): Flowable> { return notificationProfilesRepository.getProfiles() .observeOn(AndroidSchedulers.mainThread()) @@ -203,7 +251,55 @@ class ConversationListViewModel( } } + fun select(chatFolder: ChatFolderRecord) { + store.update { + it.copy( + currentFolder = chatFolder, + chatFolders = folders.map { model -> + model.copy(isSelected = chatFolder.id == model.chatFolder.id) + } + ) + } + } + + fun onMuteChatFolder(chatFolder: ChatFolderRecord, until: Long) { + viewModelScope.launch(Dispatchers.IO) { + val ids = SignalDatabase.threads.getRecipientIdsByChatFolder(chatFolder) + val recipientIds: List = ids.filter { id -> + Recipient.resolved(id).muteUntil != until + } + if (recipientIds.isNotEmpty()) { + SignalDatabase.recipients.setMuted(recipientIds, until) + } + } + } + + fun deleteChatFolder(chatFolder: ChatFolderRecord) { + viewModelScope.launch(Dispatchers.IO) { + SignalDatabase.chatFolders.deleteChatFolder(chatFolder) + val updatedFolders = folders.filter { folder -> folder.chatFolder.id != chatFolder.id } + + store.update { + it.copy( + currentFolder = updatedFolders.first().chatFolder, + chatFolders = updatedFolders + ) + } + } + } + + fun markChatFolderRead(chatFolder: ChatFolderRecord) { + viewModelScope.launch(Dispatchers.IO) { + val ids = SignalDatabase.threads.getThreadIdsByChatFolder(chatFolder) + val messageIds = SignalDatabase.threads.setRead(ids, false) + AppDependencies.messageNotifier.updateNotification(AppDependencies.application) + MarkReadReceiver.process(messageIds) + } + } + private data class ConversationListState( + val chatFolders: List = emptyList(), + val currentFolder: ChatFolderRecord = ChatFolderRecord(), val conversations: List = emptyList(), val megaphone: Megaphone = Megaphone.NONE, val selectedConversations: ConversationSet = ConversationSet(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java index 42b78e5030..cbf359b096 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java @@ -45,6 +45,7 @@ public enum Type { ARCHIVED_FOOTER, CONVERSATION_FILTER_FOOTER, CONVERSATION_FILTER_EMPTY, + CHAT_FOLDER_EMPTY, EMPTY } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt index f0f42afe6f..1bba9b3c7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt @@ -244,11 +244,20 @@ class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : Database .values( DELETION_TIMESTAMP to deletionTimestamp, ADMIN_KEY to null, + ROOT_KEY to callLinkRootKey.keyBytes, REVOKED to true ) .where("$ROOM_ID = ?", callLink.roomId.serialize()) .run() - } else 0 + } else { + writableDatabase.update(TABLE_NAME) + .values( + ADMIN_KEY to adminPassKey, + ROOT_KEY to callLinkRootKey.keyBytes + ) + .where("$ROOM_ID = ?", callLink.roomId.serialize()) + .run() + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt index becea02040..6dc17a3d53 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt @@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.calls.log.CallLogRow import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.dependencies.AppDependencies +import org.thoughtcrime.securesms.jobs.CallLinkUpdateSendJob import org.thoughtcrime.securesms.jobs.CallSyncEventJob import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId @@ -111,12 +112,15 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl } fun markAllCallEventsRead(timestamp: Long = Long.MAX_VALUE) { - writableDatabase.update(TABLE_NAME) + val updateCount = writableDatabase + .update(TABLE_NAME) .values(READ to ReadState.serialize(ReadState.READ)) - .where("$TIMESTAMP <= ?", timestamp) + .where("$TIMESTAMP <= ? AND $READ != ?", timestamp, ReadState.serialize(ReadState.READ)) .run() - notifyConversationListListeners() + if (updateCount > 0) { + notifyConversationListListeners() + } } fun markAllCallEventsWithPeerBeforeTimestampRead(peer: RecipientId, timestamp: Long): Call? { @@ -606,15 +610,15 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl AppDependencies.databaseObserver.notifyCallUpdateObservers() } - fun insertOrUpdateAdHocCallFromObserveEvent( + fun insertOrUpdateAdHocCallFromRemoteObserveEvent( callRecipient: Recipient, timestamp: Long, callId: Long ) { - handleCallLinkUpdate(callRecipient, timestamp, CallId(callId), Direction.INCOMING) + handleCallLinkUpdate(callRecipient, timestamp, CallId(callId), Direction.INCOMING, skipSyncOnInsert = true) } - fun insertAdHocCallFromObserveEvent( + fun insertAdHocCallFromLocalObserveEvent( callRecipient: Recipient, timestamp: Long, eraId: String @@ -710,7 +714,8 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl timestamp: Long, callId: CallId?, direction: Direction = Direction.OUTGOING, - skipTimestampUpdate: Boolean = false + skipTimestampUpdate: Boolean = false, + skipSyncOnInsert: Boolean = false ): Boolean { check(callLinkRecipient.isCallLink) @@ -751,6 +756,10 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl Log.d(TAG, "Inserted new call event for call link. Call Id: $callId") AppDependencies.databaseObserver.notifyCallUpdateObservers() + if (!skipSyncOnInsert) { + AppDependencies.jobManager.add(CallLinkUpdateSendJob(callLinkRecipient.requireCallLinkRoomId())) + } + true } else false } @@ -1284,6 +1293,12 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl "p.$ID, p.$TIMESTAMP, $EVENT, $DIRECTION, $PEER, p.$TYPE, $CALL_ID, $MESSAGE_ID, $RINGER, $LOCAL_JOINED, $GROUP_CALL_ACTIVE, children, in_period, ${MessageTable.BODY}," } + val join = if (isCount) { + "" + } else { + "LEFT JOIN ${MessageTable.TABLE_NAME} ON ${MessageTable.TABLE_NAME}.${MessageTable.ID} = $MESSAGE_ID" + } + // Group call events by those we consider missed or not missed to build out our call log aggregation. val eventTypeSubQuery = """ ($TABLE_NAME.$EVENT = c.$EVENT AND ( @@ -1382,7 +1397,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl cte ) p INNER JOIN ${RecipientTable.TABLE_NAME} ON ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} = $PEER - LEFT JOIN ${MessageTable.TABLE_NAME} ON ${MessageTable.TABLE_NAME}.${MessageTable.ID} = $MESSAGE_ID + $join LEFT JOIN ${GroupTable.TABLE_NAME} ON ${GroupTable.TABLE_NAME}.${GroupTable.RECIPIENT_ID} = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} WHERE true_parent = p.$ID AND CASE diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ChatFolderTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ChatFolderTables.kt new file mode 100644 index 0000000000..17d182fe3c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ChatFolderTables.kt @@ -0,0 +1,367 @@ +package org.thoughtcrime.securesms.database + +import android.content.ContentValues +import android.content.Context +import androidx.core.content.contentValuesOf +import org.signal.core.util.SqlUtil +import org.signal.core.util.delete +import org.signal.core.util.groupBy +import org.signal.core.util.insertInto +import org.signal.core.util.readToList +import org.signal.core.util.readToSingleInt +import org.signal.core.util.readToSingleObject +import org.signal.core.util.requireBoolean +import org.signal.core.util.requireInt +import org.signal.core.util.requireLong +import org.signal.core.util.requireString +import org.signal.core.util.select +import org.signal.core.util.update +import org.signal.core.util.withinTransaction +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord +import org.thoughtcrime.securesms.dependencies.AppDependencies + +/** + * Stores chat folders and the chats that belong in each chat folder + */ +class ChatFolderTables(context: Context?, databaseHelper: SignalDatabase?) : DatabaseTable(context, databaseHelper), ThreadIdDatabaseReference { + + companion object { + @JvmField + val CREATE_TABLE: Array = arrayOf(ChatFolderTable.CREATE_TABLE, ChatFolderMembershipTable.CREATE_TABLE) + + @JvmField + val CREATE_INDEXES: Array = ChatFolderTable.CREATE_INDEX + ChatFolderMembershipTable.CREATE_INDEXES + + fun insertInitialChatFoldersAtCreationTime(db: net.zetetic.database.sqlcipher.SQLiteDatabase) { + db.insert(ChatFolderTable.TABLE_NAME, null, getAllChatsFolderContentValues()) + } + + private fun getAllChatsFolderContentValues(): ContentValues { + return contentValuesOf( + ChatFolderTable.POSITION to 0, + ChatFolderTable.FOLDER_TYPE to ChatFolderRecord.FolderType.ALL.value, + ChatFolderTable.SHOW_INDIVIDUAL to 1, + ChatFolderTable.SHOW_GROUPS to 1, + ChatFolderTable.SHOW_MUTED to 1 + ) + } + } + + /** + * Represents the components of a chat folder and any chat types it contains + */ + object ChatFolderTable { + const val TABLE_NAME = "chat_folder" + + const val ID = "_id" + const val NAME = "name" + const val POSITION = "position" + const val SHOW_UNREAD = "show_unread" + const val SHOW_MUTED = "show_muted" + const val SHOW_INDIVIDUAL = "show_individual" + const val SHOW_GROUPS = "show_groups" + const val IS_MUTED = "is_muted" + const val FOLDER_TYPE = "folder_type" + + val CREATE_TABLE = """ + CREATE TABLE $TABLE_NAME ( + $ID INTEGER PRIMARY KEY AUTOINCREMENT, + $NAME TEXT DEFAULT NULL, + $POSITION INTEGER DEFAULT 0, + $SHOW_UNREAD INTEGER DEFAULT 0, + $SHOW_MUTED INTEGER DEFAULT 0, + $SHOW_INDIVIDUAL INTEGER DEFAULT 0, + $SHOW_GROUPS INTEGER DEFAULT 0, + $IS_MUTED INTEGER DEFAULT 0, + $FOLDER_TYPE INTEGER DEFAULT ${ChatFolderRecord.FolderType.CUSTOM.value} + ) + """ + + val CREATE_INDEX = arrayOf( + "CREATE INDEX chat_folder_position_index ON $TABLE_NAME ($POSITION)" + ) + } + + /** + * Represents a thread that is associated with this chat folder. They are + * either included in the chat folder or explicitly excluded. + */ + object ChatFolderMembershipTable { + const val TABLE_NAME = "chat_folder_membership" + + const val ID = "_id" + const val CHAT_FOLDER_ID = "chat_folder_id" + const val THREAD_ID = "thread_id" + const val MEMBERSHIP_TYPE = "membership_type" + + const val CREATE_TABLE = """ + CREATE TABLE $TABLE_NAME ( + $ID INTEGER PRIMARY KEY AUTOINCREMENT, + $CHAT_FOLDER_ID INTEGER NOT NULL REFERENCES ${ChatFolderTable.TABLE_NAME} (${ChatFolderTable.ID}) ON DELETE CASCADE, + $THREAD_ID INTEGER NOT NULL REFERENCES ${ThreadTable.TABLE_NAME} (${ThreadTable.ID}) ON DELETE CASCADE, + $MEMBERSHIP_TYPE INTEGER DEFAULT 1 + ) + """ + + val CREATE_INDEXES = arrayOf( + "CREATE INDEX chat_folder_membership_chat_folder_id_index ON $TABLE_NAME ($CHAT_FOLDER_ID)", + "CREATE INDEX chat_folder_membership_thread_id_index ON $TABLE_NAME ($THREAD_ID)", + "CREATE INDEX chat_folder_membership_membership_type_index ON $TABLE_NAME ($MEMBERSHIP_TYPE)" + ) + } + + override fun remapThread(fromId: Long, toId: Long) { + writableDatabase + .update(ChatFolderMembershipTable.TABLE_NAME) + .values(ChatFolderMembershipTable.THREAD_ID to toId) + .where("${ChatFolderMembershipTable.THREAD_ID} = ?", fromId) + .run() + } + + /** + * Returns a single chat folder that corresponds to that id + */ + fun getChatFolder(id: Long): ChatFolderRecord { + val includedChats: Map> = getIncludedChats(id) + val excludedChats: Map> = getExcludedChats(id) + + val folder = readableDatabase + .select() + .from(ChatFolderTable.TABLE_NAME) + .where("${ChatFolderTable.ID} = ?", id) + .run() + .readToSingleObject { cursor -> + ChatFolderRecord( + id = id, + name = cursor.requireString(ChatFolderTable.NAME) ?: "", + position = cursor.requireInt(ChatFolderTable.POSITION), + showUnread = cursor.requireBoolean(ChatFolderTable.SHOW_UNREAD), + showMutedChats = cursor.requireBoolean(ChatFolderTable.SHOW_MUTED), + showIndividualChats = cursor.requireBoolean(ChatFolderTable.SHOW_INDIVIDUAL), + showGroupChats = cursor.requireBoolean(ChatFolderTable.SHOW_GROUPS), + isMuted = cursor.requireBoolean(ChatFolderTable.IS_MUTED), + folderType = ChatFolderRecord.FolderType.deserialize(cursor.requireInt(ChatFolderTable.FOLDER_TYPE)), + includedChats = includedChats[id] ?: emptyList(), + excludedChats = excludedChats[id] ?: emptyList() + ) + } + + return folder ?: ChatFolderRecord() + } + + /** + * Maps the chat folder ids to its corresponding chat folder + */ + fun getChatFolders(includeUnreads: Boolean = false): List { + val includedChats: Map> = getIncludedChats() + val excludedChats: Map> = getExcludedChats() + + val folders = readableDatabase + .select() + .from(ChatFolderTable.TABLE_NAME) + .orderBy(ChatFolderTable.POSITION) + .run() + .readToList { cursor -> + val id = cursor.requireLong(ChatFolderTable.ID) + ChatFolderRecord( + id = id, + name = cursor.requireString(ChatFolderTable.NAME) ?: "", + position = cursor.requireInt(ChatFolderTable.POSITION), + showUnread = cursor.requireBoolean(ChatFolderTable.SHOW_UNREAD), + showMutedChats = cursor.requireBoolean(ChatFolderTable.SHOW_MUTED), + showIndividualChats = cursor.requireBoolean(ChatFolderTable.SHOW_INDIVIDUAL), + showGroupChats = cursor.requireBoolean(ChatFolderTable.SHOW_GROUPS), + isMuted = cursor.requireBoolean(ChatFolderTable.IS_MUTED), + folderType = ChatFolderRecord.FolderType.deserialize(cursor.requireInt(ChatFolderTable.FOLDER_TYPE)), + includedChats = includedChats[id] ?: emptyList(), + excludedChats = excludedChats[id] ?: emptyList() + ) + } + + if (includeUnreads) { + return folders.map { folder -> + folder.copy( + unreadCount = SignalDatabase.threads.getUnreadCountByChatFolder(folder) + ) + } + } + + return folders + } + + /** + * Maps a chat folder id to all of its corresponding included chats. + * If an id is not specified, all chat folder ids will be mapped. + */ + private fun getIncludedChats(id: Long? = null): Map> { + val whereQuery = if (id != null) { + "${ChatFolderMembershipTable.MEMBERSHIP_TYPE} = ${MembershipType.INCLUDED.value} AND ${ChatFolderMembershipTable.CHAT_FOLDER_ID} = $id" + } else { + "${ChatFolderMembershipTable.MEMBERSHIP_TYPE} = ${MembershipType.INCLUDED.value}" + } + + return readableDatabase + .select() + .from(ChatFolderMembershipTable.TABLE_NAME) + .where(whereQuery) + .run() + .groupBy { cursor -> + cursor.requireLong(ChatFolderMembershipTable.CHAT_FOLDER_ID) to cursor.requireLong(ChatFolderMembershipTable.THREAD_ID) + } + } + + /** + * Maps a chat folder id to all of its corresponding excluded chats. + * If an id is not specified, all chat folder ids will be mapped. + */ + private fun getExcludedChats(id: Long? = null): Map> { + val whereQuery = if (id != null) { + "${ChatFolderMembershipTable.MEMBERSHIP_TYPE} = ${MembershipType.EXCLUDED.value} AND ${ChatFolderMembershipTable.CHAT_FOLDER_ID} = $id" + } else { + "${ChatFolderMembershipTable.MEMBERSHIP_TYPE} = ${MembershipType.EXCLUDED.value}" + } + + return readableDatabase + .select() + .from(ChatFolderMembershipTable.TABLE_NAME) + .where(whereQuery) + .run() + .groupBy { cursor -> + cursor.requireLong(ChatFolderMembershipTable.CHAT_FOLDER_ID) to cursor.requireLong(ChatFolderMembershipTable.THREAD_ID) + } + } + + /** + * Adds a chat folder and its corresponding included/excluded chats + */ + fun createFolder(chatFolder: ChatFolderRecord) { + writableDatabase.withinTransaction { db -> + val position: Int = db + .select("MAX(${ChatFolderTable.POSITION})") + .from(ChatFolderTable.TABLE_NAME) + .run() + .readToSingleInt(0) + 1 + + val id = db.insertInto(ChatFolderTable.TABLE_NAME) + .values( + contentValuesOf( + ChatFolderTable.NAME to chatFolder.name, + ChatFolderTable.SHOW_UNREAD to chatFolder.showUnread, + ChatFolderTable.SHOW_MUTED to chatFolder.showMutedChats, + ChatFolderTable.SHOW_INDIVIDUAL to chatFolder.showIndividualChats, + ChatFolderTable.SHOW_GROUPS to chatFolder.showGroupChats, + ChatFolderTable.IS_MUTED to chatFolder.isMuted, + ChatFolderTable.POSITION to position + ) + ) + .run(SQLiteDatabase.CONFLICT_IGNORE) + + val includedChatsQueries = SqlUtil.buildBulkInsert( + ChatFolderMembershipTable.TABLE_NAME, + arrayOf(ChatFolderMembershipTable.CHAT_FOLDER_ID, ChatFolderMembershipTable.THREAD_ID, ChatFolderMembershipTable.MEMBERSHIP_TYPE), + chatFolder.includedChats.toContentValues(chatFolderId = id, membershipType = MembershipType.INCLUDED) + ) + + val excludedChatsQueries = SqlUtil.buildBulkInsert( + ChatFolderMembershipTable.TABLE_NAME, + arrayOf(ChatFolderMembershipTable.CHAT_FOLDER_ID, ChatFolderMembershipTable.THREAD_ID, ChatFolderMembershipTable.MEMBERSHIP_TYPE), + chatFolder.excludedChats.toContentValues(chatFolderId = id, membershipType = MembershipType.EXCLUDED) + ) + + includedChatsQueries.forEach { + db.execSQL(it.where, it.whereArgs) + } + + excludedChatsQueries.forEach { + db.execSQL(it.where, it.whereArgs) + } + + AppDependencies.databaseObserver.notifyChatFolderObservers() + } + } + + /** + * Updates the details for an existing folder like name, chat types, etc. + */ + fun updateFolder(chatFolder: ChatFolderRecord) { + writableDatabase.withinTransaction { db -> + db.update(ChatFolderTable.TABLE_NAME) + .values( + ChatFolderTable.NAME to chatFolder.name, + ChatFolderTable.SHOW_UNREAD to chatFolder.showUnread, + ChatFolderTable.SHOW_MUTED to chatFolder.showMutedChats, + ChatFolderTable.SHOW_INDIVIDUAL to chatFolder.showIndividualChats, + ChatFolderTable.SHOW_GROUPS to chatFolder.showGroupChats, + ChatFolderTable.IS_MUTED to chatFolder.isMuted + ) + .where("${ChatFolderTable.ID} = ?", chatFolder.id) + .run(SQLiteDatabase.CONFLICT_IGNORE) + + db + .delete(ChatFolderMembershipTable.TABLE_NAME) + .where("${ChatFolderMembershipTable.CHAT_FOLDER_ID} = ?", chatFolder.id) + .run() + + val includedChats = SqlUtil.buildBulkInsert( + ChatFolderMembershipTable.TABLE_NAME, + arrayOf(ChatFolderMembershipTable.CHAT_FOLDER_ID, ChatFolderMembershipTable.THREAD_ID, ChatFolderMembershipTable.MEMBERSHIP_TYPE), + chatFolder.includedChats.toContentValues(chatFolderId = chatFolder.id, membershipType = MembershipType.INCLUDED) + ) + + val excludedChats = SqlUtil.buildBulkInsert( + ChatFolderMembershipTable.TABLE_NAME, + arrayOf(ChatFolderMembershipTable.CHAT_FOLDER_ID, ChatFolderMembershipTable.THREAD_ID, ChatFolderMembershipTable.MEMBERSHIP_TYPE), + chatFolder.excludedChats.toContentValues(chatFolderId = chatFolder.id, membershipType = MembershipType.EXCLUDED) + ) + + (includedChats + excludedChats).forEach { + db.execSQL(it.where, it.whereArgs) + } + + AppDependencies.databaseObserver.notifyChatFolderObservers() + } + } + + /** + * Deletes a chat folder + */ + fun deleteChatFolder(chatFolder: ChatFolderRecord) { + writableDatabase.withinTransaction { db -> + db.delete(ChatFolderTable.TABLE_NAME, "${ChatFolderTable.ID} = ?", SqlUtil.buildArgs(chatFolder.id)) + AppDependencies.databaseObserver.notifyChatFolderObservers() + } + } + + /** + * Updates the position of the chat folders + */ + fun updatePositions(folders: List) { + writableDatabase.withinTransaction { db -> + folders.forEach { folder -> + db.update(ChatFolderTable.TABLE_NAME) + .values(ChatFolderTable.POSITION to folder.position) + .where("${ChatFolderTable.ID} = ?", folder.id) + .run(SQLiteDatabase.CONFLICT_IGNORE) + } + AppDependencies.databaseObserver.notifyChatFolderObservers() + } + } + + private fun Collection.toContentValues(chatFolderId: Long, membershipType: MembershipType): List { + return map { + contentValuesOf( + ChatFolderMembershipTable.CHAT_FOLDER_ID to chatFolderId, + ChatFolderMembershipTable.THREAD_ID to it, + ChatFolderMembershipTable.MEMBERSHIP_TYPE to membershipType.value + ) + } + } + + enum class MembershipType(val value: Int) { + /** Chat that should be included in the chat folder */ + INCLUDED(0), + + /** Chat that should be excluded from the chat folder */ + EXCLUDED(1) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java index 5b643c1566..05f8a29424 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseObserver.java @@ -47,6 +47,7 @@ public class DatabaseObserver { private static final String KEY_CALL_UPDATES = "CallUpdates"; private static final String KEY_CALL_LINK_UPDATES = "CallLinkUpdates"; private static final String KEY_IN_APP_PAYMENTS = "InAppPayments"; + private static final String KEY_CHAT_FOLDER = "ChatFolder"; private final Executor executor; @@ -69,6 +70,7 @@ public class DatabaseObserver { private final Set callUpdateObservers; private final Map> callLinkObservers; private final Set inAppPaymentObservers; + private final Set chatFolderObservers; public DatabaseObserver() { this.executor = new SerialExecutor(SignalExecutors.BOUNDED); @@ -91,6 +93,7 @@ public DatabaseObserver() { this.callUpdateObservers = new HashSet<>(); this.callLinkObservers = new HashMap<>(); this.inAppPaymentObservers = new HashSet<>(); + this.chatFolderObservers = new HashSet<>(); } public void registerConversationListObserver(@NonNull Observer listener) { @@ -206,6 +209,10 @@ public void registerInAppPaymentObserver(@NonNull InAppPaymentObserver observer) executor.execute(() -> inAppPaymentObservers.add(observer)); } + public void registerChatFolderObserver(@NonNull Observer observer) { + executor.execute(() -> chatFolderObservers.add(observer)); + } + public void unregisterObserver(@NonNull Observer listener) { executor.execute(() -> { conversationListObservers.remove(listener); @@ -223,6 +230,7 @@ public void unregisterObserver(@NonNull Observer listener) { unregisterMapped(conversationDeleteObservers, listener); callUpdateObservers.remove(listener); unregisterMapped(callLinkObservers, listener); + chatFolderObservers.remove(listener); }); } @@ -387,6 +395,10 @@ public void notifyInAppPaymentsObservers(@NonNull InAppPaymentTable.InAppPayment }); } + public void notifyChatFolderObservers() { + runPostSuccessfulTransaction(KEY_CHAT_FOLDER, () -> notifySet(chatFolderObservers)); + } + private void runPostSuccessfulTransaction(@NonNull String dedupeKey, @NonNull Runnable runnable) { SignalDatabase.runPostSuccessfulTransaction(dedupeKey, () -> { executor.execute(runnable); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/NameCollisionTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/NameCollisionTables.kt index de0ca4ff64..79787dfc11 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/NameCollisionTables.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/NameCollisionTables.kt @@ -55,16 +55,12 @@ class NameCollisionTables( private val PROFILE_CHANGE_TIMEOUT = 1.days - fun createTables(db: SQLiteDatabase) { - db.execSQL(NameCollisionTable.CREATE_TABLE) - db.execSQL(NameCollisionMembershipTable.CREATE_TABLE) - } + val CREATE_TABLE = arrayOf( + NameCollisionTable.CREATE_TABLE, + NameCollisionMembershipTable.CREATE_TABLE + ) - fun createIndexes(db: SQLiteDatabase) { - NameCollisionMembershipTable.CREATE_INDEXES.forEach { - db.execSQL(it) - } - } + val CREATE_INDEXES = NameCollisionMembershipTable.CREATE_INDEXES } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index 073b7553ba..846c3fef74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -1481,6 +1481,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da for (id in ids) { AppDependencies.databaseObserver.notifyRecipientChanged(id) } + AppDependencies.databaseObserver.notifyConversationListListeners() StorageSyncHelper.scheduleSyncForDataChange() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RxDatabaseObserver.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RxDatabaseObserver.kt index ae8555ad96..ef829b33ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RxDatabaseObserver.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RxDatabaseObserver.kt @@ -15,6 +15,7 @@ object RxDatabaseObserver { val conversationList: Flowable by lazy { conversationListFlowable() } val notificationProfiles: Flowable by lazy { notificationProfilesFlowable() } + val chatFolders: Flowable by lazy { chatFoldersFlowable() } private fun conversationListFlowable(): Flowable { return databaseFlowable { listener -> @@ -36,6 +37,12 @@ object RxDatabaseObserver { ) { _, _ -> Unit } } + private fun chatFoldersFlowable(): Flowable { + return databaseFlowable { listener -> + AppDependencies.databaseObserver.registerChatFolderObserver(listener) + } + } + private fun databaseFlowable(registerObserver: (RxObserver) -> Unit): Flowable { val flowable = Flowable.create( { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java index 428ac0efd6..37ea3a7159 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java @@ -14,6 +14,7 @@ import net.zetetic.database.sqlcipher.SQLiteStatement; import net.zetetic.database.sqlcipher.SQLiteTransactionListener; +import org.signal.core.util.logging.Log; import org.signal.core.util.tracing.Tracer; import java.io.IOException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt index dc9a0b1769..017240e4c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt @@ -160,38 +160,25 @@ class SearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa /** * Re-adds every message to the index. It's fine to insert the same message twice; the table will naturally de-dupe. * - * In order to prevent the database from locking up with super large inserts, this will perform the re-index in batches of the size you specify. - * It is not guaranteed that every batch will be the same size, but rather that the batches will be _no larger_ than the specified size. - * * Warning: This is a potentially extremely-costly operation! It can take 10+ seconds on large installs and/or slow devices. * Be smart about where you call this. * * @return True if the rebuild was successful, otherwise false. */ - fun rebuildIndex(batchSize: Long = 10_000L): Boolean { + fun rebuildIndex(): Boolean { try { - val maxId: Long = SignalDatabase.messages.getNextId() - - Log.i(TAG, "Re-indexing. Operating on ID's 1-$maxId in steps of $batchSize.") - - for (i in 1..maxId step batchSize) { - Log.i(TAG, "Reindexing ID's [$i, ${i + batchSize})") - - writableDatabase.withinTransaction { db -> - db.execSQL( - """ - INSERT INTO $FTS_TABLE_NAME ($ID, $BODY) - SELECT - ${MessageTable.ID}, - ${MessageTable.BODY} - FROM - ${MessageTable.TABLE_NAME} - WHERE - ${MessageTable.ID} >= $i AND - ${MessageTable.ID} < ${i + batchSize} - """ - ) - } + writableDatabase.withinTransaction { db -> + db.execSQL( + """ + INSERT INTO $FTS_TABLE_NAME ($ID, $BODY, $THREAD_ID) + SELECT + ${MessageTable.ID}, + ${MessageTable.BODY}, + ${MessageTable.THREAD_ID} + FROM + ${MessageTable.TABLE_NAME} + """ + ) } } catch (e: SQLiteException) { Log.w(TAG, "Failed to rebuild index!", e) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt index e88e4630fa..51da331a79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt @@ -67,6 +67,7 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data val nameCollisionTables: NameCollisionTables = NameCollisionTables(context, this) val inAppPaymentTable: InAppPaymentTable = InAppPaymentTable(context, this) val inAppPaymentSubscriberTable: InAppPaymentSubscriberTable = InAppPaymentSubscriberTable(context, this) + val chatFoldersTable: ChatFolderTables = ChatFolderTables(context, this) override fun onOpen(db: net.zetetic.database.sqlcipher.SQLiteDatabase) { db.setForeignKeyConstraintsEnabled(true) @@ -103,7 +104,7 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data db.execSQL(CallLinkTable.CREATE_TABLE) db.execSQL(CallTable.CREATE_TABLE) db.execSQL(KyberPreKeyTable.CREATE_TABLE) - NameCollisionTables.createTables(db) + executeStatements(db, NameCollisionTables.CREATE_TABLE) db.execSQL(InAppPaymentTable.CREATE_TABLE) db.execSQL(InAppPaymentSubscriberTable.CREATE_TABLE) executeStatements(db, SearchTable.CREATE_TABLE) @@ -111,6 +112,7 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data executeStatements(db, MessageSendLogTables.CREATE_TABLE) executeStatements(db, NotificationProfileDatabase.CREATE_TABLE) executeStatements(db, DistributionListTables.CREATE_TABLE) + executeStatements(db, ChatFolderTables.CREATE_TABLE) executeStatements(db, RecipientTable.CREATE_INDEXS) executeStatements(db, MessageTable.CREATE_INDEXS) @@ -132,13 +134,14 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data executeStatements(db, CallTable.CREATE_INDEXES) executeStatements(db, ReactionTable.CREATE_INDEXES) executeStatements(db, KyberPreKeyTable.CREATE_INDEXES) + executeStatements(db, ChatFolderTables.CREATE_INDEXES) + executeStatements(db, NameCollisionTables.CREATE_INDEXES) executeStatements(db, SearchTable.CREATE_TRIGGERS) executeStatements(db, MessageSendLogTables.CREATE_TRIGGERS) - NameCollisionTables.createIndexes(db) - DistributionListTables.insertInitialDistributionListAtCreationTime(db) + ChatFolderTables.insertInitialChatFoldersAtCreationTime(db) if (context.getDatabasePath("messages.db").exists()) { throw AssertionError("Unsupported Signal database: version is too old") @@ -510,5 +513,10 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data @get:JvmName("inAppPaymentSubscribers") val inAppPaymentSubscribers: InAppPaymentSubscriberTable get() = instance!!.inAppPaymentSubscriberTable + + @get:JvmStatic + @get:JvmName("chatFolders") + val chatFolders: ChatFolderTables + get() = instance!!.chatFoldersTable } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt index 322a769bee..5956e73ec5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt @@ -165,16 +165,16 @@ class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHan } private fun attemptToClearFullTextSearchIndex(db: SQLiteDatabase) { - try { - try { - db.reopenReadWrite() - } catch (e: Exception) { - Log.w(TAG, "Failed to re-open as read-write!", e) - } - SignalDatabase.messageSearch.fullyResetTables(db, useTransaction = false) - } catch (e: Throwable) { - Log.w(TAG, "Failed to clear full text search index.", e) - } +// try { +// try { +// db.reopenReadWrite() +// } catch (e: Exception) { +// Log.w(TAG, "Failed to re-open as read-write!", e) +// } +// SignalDatabase.messageSearch.fullyResetTables(db, useTransaction = false) +// } catch (e: Throwable) { +// Log.w(TAG, "Failed to clear full text search index.", e) +// } } private sealed class DiagnosticResults(val logs: String) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index f7ea1d2cca..4cf534f9a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -18,6 +18,7 @@ import org.signal.core.util.exists import org.signal.core.util.logging.Log import org.signal.core.util.or import org.signal.core.util.readToList +import org.signal.core.util.readToSingleInt import org.signal.core.util.readToSingleLong import org.signal.core.util.requireBoolean import org.signal.core.util.requireInt @@ -30,6 +31,7 @@ import org.signal.core.util.updateAll import org.signal.core.util.withinTransaction import org.signal.libsignal.zkgroup.InvalidInputException import org.signal.libsignal.zkgroup.groups.GroupMasterKey +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter import org.thoughtcrime.securesms.database.MessageTable.MarkedMessageInfo import org.thoughtcrime.securesms.database.SignalDatabase.Companion.attachments @@ -629,6 +631,39 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa return allCount + forcedUnreadCount } + /** + * Returns the number of unread messages across all threads within a chat folder + * Threads that are forced-unread count as 1. + */ + fun getUnreadCountByChatFolder(folder: ChatFolderRecord): Int { + val chatFolderQuery = folder.toQuery() + + val allCountQuery = + """ + SELECT SUM($UNREAD_COUNT) + FROM $TABLE_NAME + LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} + WHERE + $ARCHIVED = 0 + $chatFolderQuery + """ + val allCount = readableDatabase.rawQuery(allCountQuery, null).readToSingleInt(0) + + val forcedUnreadCountQuery = + """ + SELECT COUNT(*) + FROM $TABLE_NAME + LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} + WHERE + $ARCHIVED = 0 AND + $READ = ${ThreadTable.ReadStatus.FORCED_UNREAD.serialize()} + $chatFolderQuery + """ + val forcedUnreadCount = readableDatabase.rawQuery(forcedUnreadCountQuery, null).readToSingleInt(0) + + return allCount + forcedUnreadCount + } + /** * Returns the number of unread messages in a given thread. */ @@ -915,12 +950,13 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa return readableDatabase.rawQuery(query, arrayOf("1")) } - fun getUnarchivedConversationList(conversationFilter: ConversationFilter, pinned: Boolean, offset: Long, limit: Long): Cursor { + fun getUnarchivedConversationList(conversationFilter: ConversationFilter, pinned: Boolean, offset: Long, limit: Long, chatFolder: ChatFolderRecord): Cursor { + val folderQuery = chatFolder.toQuery() val filterQuery = conversationFilter.toQuery() val where = if (pinned) { - "$ARCHIVED = 0 AND $PINNED != 0 $filterQuery" + "$ARCHIVED = 0 AND $PINNED != 0 $filterQuery $folderQuery" } else { - "$ARCHIVED = 0 AND $PINNED = 0 AND $MEANINGFUL_MESSAGES != 0 $filterQuery" + "$ARCHIVED = 0 AND $PINNED = 0 AND $MEANINGFUL_MESSAGES != 0 $filterQuery $folderQuery" } val query = if (pinned) { @@ -948,36 +984,102 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } } - fun getPinnedConversationListCount(conversationFilter: ConversationFilter): Int { + fun getPinnedConversationListCount(conversationFilter: ConversationFilter, chatFolder: ChatFolderRecord? = null): Int { val filterQuery = conversationFilter.toQuery() - return readableDatabase - .select("COUNT(*)") - .from(TABLE_NAME) - .where("$ACTIVE = 1 AND $ARCHIVED = 0 AND $PINNED != 0 $filterQuery") - .run() - .use { cursor -> - if (cursor.moveToFirst()) { - cursor.getInt(0) - } else { - 0 - } - } - } - fun getUnarchivedConversationListCount(conversationFilter: ConversationFilter): Int { + return if (chatFolder == null || chatFolder.folderType == ChatFolderRecord.FolderType.ALL) { + readableDatabase + .select("COUNT(*)") + .from(TABLE_NAME) + .where("$ACTIVE = 1 AND $ARCHIVED = 0 AND $PINNED != 0 $filterQuery") + .run() + .readToSingleInt(0) + } else { + val folderQuery = chatFolder.toQuery() + val query = + """ + SELECT COUNT(*) + FROM $TABLE_NAME + LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} + WHERE + $ACTIVE = 1 AND + $ARCHIVED = 0 AND + $PINNED != 0 + $filterQuery + $folderQuery + """ + readableDatabase.rawQuery(query, null).readToSingleInt(0) + } + } + + fun getUnarchivedConversationListCount(conversationFilter: ConversationFilter, chatFolder: ChatFolderRecord? = null): Int { val filterQuery = conversationFilter.toQuery() - return readableDatabase - .select("COUNT(*)") - .from(TABLE_NAME) - .where("$ACTIVE = 1 AND $ARCHIVED = 0 AND ($MEANINGFUL_MESSAGES != 0 OR $PINNED != 0) $filterQuery") - .run() - .use { cursor -> - if (cursor.moveToFirst()) { - cursor.getInt(0) - } else { - 0 + + return if (chatFolder == null || chatFolder.folderType == ChatFolderRecord.FolderType.ALL) { + readableDatabase + .select("COUNT(*)") + .from(TABLE_NAME) + .where("$ACTIVE = 1 AND $ARCHIVED = 0 AND ($MEANINGFUL_MESSAGES != 0 OR $PINNED != 0) $filterQuery") + .run() + .readToSingleInt(0) + } else { + val folderQuery = chatFolder.toQuery() + + val query = + """ + SELECT COUNT(*) + FROM $TABLE_NAME + LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} + WHERE + $ACTIVE = 1 AND + $ARCHIVED = 0 AND + ($MEANINGFUL_MESSAGES != 0 OR $PINNED != 0) + $filterQuery + $folderQuery + """ + readableDatabase.rawQuery(query, null).readToSingleInt(0) + } + } + + fun getThreadIdsByChatFolder(chatFolder: ChatFolderRecord): List { + val folderQuery = chatFolder.toQuery() + val query = + """ + SELECT ${TABLE_NAME}.$ID + FROM $TABLE_NAME + LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} + WHERE + $ACTIVE = 1 + $folderQuery + """ + return readableDatabase.rawQuery(query, null).readToList { cursor -> cursor.requireLong(ID) } + } + + fun getRecipientIdsByChatFolder(chatFolder: ChatFolderRecord): List { + return if (chatFolder.folderType == ChatFolderRecord.FolderType.ALL) { + readableDatabase + .select(RECIPIENT_ID) + .from(TABLE_NAME) + .where("$ACTIVE = 1") + .run() + .readToList { cursor -> + RecipientId.from(cursor.requireLong(RECIPIENT_ID)) } + } else { + val folderQuery = chatFolder.toQuery() + val query = + """ + SELECT $RECIPIENT_ID + FROM $TABLE_NAME + LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} + WHERE + $ACTIVE = 1 + $folderQuery + """ + readableDatabase.rawQuery(query, null).readToList { cursor -> + RecipientId.from(cursor.requireLong(RECIPIENT_ID)) } + } } /** @@ -1979,6 +2081,42 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa return Reader(cursor) } + private fun ChatFolderRecord.toQuery(): String { + if (this.id == -1L || this.folderType == ChatFolderRecord.FolderType.ALL) { + return "" + } + + val includedChatsQuery: MutableList = mutableListOf() + includedChatsQuery.add("${TABLE_NAME}.$ID IN (${this.includedChats.joinToString(",")})") + + if (this.showIndividualChats) { + includedChatsQuery.add("${RecipientTable.TABLE_NAME}.${RecipientTable.TYPE} = ${RecipientTable.RecipientType.INDIVIDUAL.id}") + } + + if (this.showGroupChats) { + includedChatsQuery.add("${RecipientTable.TABLE_NAME}.${RecipientTable.TYPE} = ${RecipientTable.RecipientType.GV2.id}") + } + + val includedQuery = includedChatsQuery.joinToString(" OR ") { "($it)" } + + val fullQuery: MutableList = mutableListOf() + fullQuery.add(includedQuery) + + if (this.excludedChats.isNotEmpty()) { + fullQuery.add("${TABLE_NAME}.$ID NOT IN (${this.excludedChats.joinToString(",")})") + } + + if (this.showUnread) { + fullQuery.add("$UNREAD_COUNT > 0 OR $READ == ${ReadStatus.FORCED_UNREAD.serialize()}") + } + + if (!this.showMutedChats) { + fullQuery.add("${RecipientTable.TABLE_NAME}.${RecipientTable.MUTE_UNTIL} = 0") + } + + return "AND ${fullQuery.joinToString(" AND ") { "($it)" }}" + } + private fun ConversationFilter.toQuery(): String { return when (this) { ConversationFilter.OFF -> "" 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 88abc24604..743cb2d5a5 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 @@ -109,6 +109,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V247_ClearUploadTim import org.thoughtcrime.securesms.database.helpers.migration.V250_ClearUploadTimestampV2 import org.thoughtcrime.securesms.database.helpers.migration.V251_ArchiveTransferStateIndex import org.thoughtcrime.securesms.database.helpers.migration.V252_AttachmentOffloadRestoredAtColumn +import org.thoughtcrime.securesms.database.helpers.migration.V253_CreateChatFolderTables /** * Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness. @@ -222,10 +223,11 @@ object SignalDatabaseMigrations { // 248 and 249 were originally in 7.18.0, but are now skipped because we needed to hotfix 7.17.6 after 7.18.0 was already released. 250 to V250_ClearUploadTimestampV2, 251 to V251_ArchiveTransferStateIndex, - 252 to V252_AttachmentOffloadRestoredAtColumn + 252 to V252_AttachmentOffloadRestoredAtColumn, + 253 to V253_CreateChatFolderTables ) - const val DATABASE_VERSION = 252 + const val DATABASE_VERSION = 253 @JvmStatic fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V253_CreateChatFolderTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V253_CreateChatFolderTables.kt new file mode 100644 index 0000000000..c89e14ef91 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V253_CreateChatFolderTables.kt @@ -0,0 +1,47 @@ +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase +import org.thoughtcrime.securesms.database.ChatFolderTables + +/** + * Adds the tables for managing chat folders + */ +@Suppress("ClassName") +object V253_CreateChatFolderTables : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL( + """ + CREATE TABLE chat_folder ( + _id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT DEFAULT NULL, + position INTEGER DEFAULT 0, + show_unread INTEGER DEFAULT 0, + show_muted INTEGER DEFAULT 0, + show_individual INTEGER DEFAULT 0, + show_groups INTEGER DEFAULT 0, + is_muted INTEGER DEFAULT 0, + folder_type INTEGER DEFAULT 4 + ) + """ + ) + + db.execSQL( + """ + CREATE TABLE chat_folder_membership ( + _id INTEGER PRIMARY KEY AUTOINCREMENT, + chat_folder_id INTEGER NOT NULL REFERENCES chat_folder (_id) ON DELETE CASCADE, + thread_id INTEGER NOT NULL REFERENCES thread (_id) ON DELETE CASCADE, + membership_type INTEGER DEFAULT 1 + ) + """ + ) + + db.execSQL("CREATE INDEX chat_folder_position_index ON chat_folder (position)") + db.execSQL("CREATE INDEX chat_folder_membership_chat_folder_id_index ON chat_folder_membership (chat_folder_id)") + db.execSQL("CREATE INDEX chat_folder_membership_thread_id_index ON chat_folder_membership (thread_id)") + db.execSQL("CREATE INDEX chat_folder_membership_membership_type_index ON chat_folder_membership (membership_type)") + + ChatFolderTables.insertInitialChatFoldersAtCreationTime(db) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java index 153bbe7bb6..e9dcd145a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java @@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.PushContactSelectionActivity; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.SelectionLimits; import org.thoughtcrime.securesms.recipients.Recipient; @@ -30,7 +31,6 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Consumer; @@ -97,7 +97,7 @@ protected void initializeToolbar() { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { if (getGroupId().isV1() && recipientId.isPresent() && !Recipient.resolved(recipientId.get()).getHasE164()) { Toast.makeText(this, R.string.AddMembersActivity__this_person_cant_be_added_to_legacy_groups, Toast.LENGTH_SHORT).show(); callback.accept(false); @@ -139,7 +139,7 @@ public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Opt } @Override - public void onContactDeselected(@NonNull Optional recipientId, String number) { + public void onContactDeselected(@NonNull Optional recipientId, String number, @NonNull Optional chatType) { if (contactsFragment.hasQueryFilter()) { getContactFilterView().clear(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.java index 4720470231..6f27c54ee7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.java @@ -8,21 +8,18 @@ import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.lifecycle.ViewModelProvider; import com.annimon.stream.Stream; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import org.signal.core.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.ContactSelectionActivity; import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.groups.ui.addtogroup.AddToGroupViewModel.Event; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.recipients.RecipientRepository; -import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.util.ArrayList; import java.util.Collections; @@ -116,7 +113,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { if (contactsFragment.isMulti()) { throw new UnsupportedOperationException("Not yet built to handle multi-select."); // if (contactsFragment.hasQueryFilter()) { @@ -136,7 +133,7 @@ public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Opt } @Override - public void onContactDeselected(@NonNull Optional recipientId, String number) { + public void onContactDeselected(@NonNull Optional recipientId, String number, @NonNull Optional chatType) { if (contactsFragment.hasQueryFilter()) { getContactFilterView().clear(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index 51bf453d5a..1c4d280d33 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; import org.thoughtcrime.securesms.groups.ui.creategroup.details.AddGroupDetailsActivity; import org.thoughtcrime.securesms.recipients.Recipient; @@ -109,7 +110,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, String number, @NonNull Optional chatType, @NonNull Consumer callback) { if (contactsFragment.hasQueryFilter()) { getContactFilterView().clear(); } @@ -145,7 +146,7 @@ public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Opt } @Override - public void onContactDeselected(@NonNull Optional recipientId, String number) { + public void onContactDeselected(@NonNull Optional recipientId, String number, @NonNull Optional chatType) { if (contactsFragment.hasQueryFilter()) { getContactFilterView().clear(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java index 10dde9db50..7515b1ad11 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java @@ -65,7 +65,9 @@ public class JobManager implements ConstraintObserver.Notifier { public JobManager(@NonNull Application application, @NonNull Configuration configuration) { this.application = application; this.configuration = configuration; - this.executor = new FilteredExecutor(configuration.getExecutorFactory().newSingleThreadExecutor("signal-JobManager"), ThreadUtil::isMainThread); + this.executor = new FilteredExecutor(configuration.getExecutorFactory().newSingleThreadExecutor("signal-JobManager"), () -> { + return ThreadUtil.isMainThread() || Thread.currentThread().getName().equals("Instr: org.thoughtcrime.securesms.testing.SignalTestRunner"); + }); this.jobTracker = configuration.getJobTracker(); this.jobController = new JobController(application, configuration.getJobStorage(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupRestoreJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupRestoreJob.kt index 1235c22a76..393574ed85 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupRestoreJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupRestoreJob.kt @@ -39,6 +39,7 @@ class BackupRestoreJob private constructor(parameters: Parameters) : BaseJob(par .addConstraint(NetworkConstraint.KEY) .setMaxAttempts(Parameters.UNLIMITED) .setMaxInstancesForFactory(1) + .setQueue("BackupRestoreJob") .build() ) @@ -85,6 +86,10 @@ class BackupRestoreJob private constructor(parameters: Parameters) : BaseJob(par throw IOException() } + if (isCanceled) { + return + } + controller.update( title = context.getString(R.string.BackupProgressService_title), progress = 0f, @@ -93,7 +98,7 @@ class BackupRestoreJob private constructor(parameters: Parameters) : BaseJob(par val self = Recipient.self() val selfData = BackupRepository.SelfData(self.aci.get(), self.pni.get(), self.e164.get(), ProfileKey(self.profileKey)) - BackupRepository.import(length = tempBackupFile.length(), inputStreamFactory = tempBackupFile::inputStream, selfData = selfData, plaintext = false) + BackupRepository.import(length = tempBackupFile.length(), inputStreamFactory = tempBackupFile::inputStream, selfData = selfData, plaintext = false, cancellationSignal = { isCanceled }) SignalStore.backup.restoreState = RestoreState.RESTORING_MEDIA } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob.kt index ef96c1235b..758128420b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupSubscriptionCheckJob.kt @@ -9,6 +9,7 @@ import androidx.annotation.VisibleForTesting import org.signal.core.util.billing.BillingPurchaseResult import org.signal.core.util.logging.Log import org.signal.donations.InAppPaymentType +import org.thoughtcrime.securesms.backup.v2.BackupRepository import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.thoughtcrime.securesms.components.settings.app.subscription.InAppPaymentsRepository import org.thoughtcrime.securesms.components.settings.app.subscription.RecurringInAppPaymentRepository @@ -55,65 +56,70 @@ class BackupSubscriptionCheckJob private constructor(parameters: Parameters) : C } override suspend fun doRun(): Result { + if (!SignalStore.account.isRegistered) { + Log.i(TAG, "User is not registered. Exiting.") + return Result.success() + } + if (!RemoteConfig.messageBackups) { Log.i(TAG, "Message backups are not enabled. Exiting.") return Result.success() } + if (!SignalStore.backup.backupsInitialized) { + Log.i(TAG, "Backups are not initialized on this device. Exiting.") + return Result.success() + } + if (!AppDependencies.billingApi.isApiAvailable()) { Log.i(TAG, "Google Play Billing API is not available on this device. Exiting.") return Result.success() } + BackupRepository.getBackupTier().runIfSuccessful { + Log.i(TAG, "Successfully retrieved backup tier $it. Applying.") + SignalStore.backup.backupTier = it + } + val purchase: BillingPurchaseResult = AppDependencies.billingApi.queryPurchases() val hasActivePurchase = purchase is BillingPurchaseResult.Success && purchase.isAcknowledged && purchase.isWithinTheLastMonth() val subscriberId = InAppPaymentsRepository.getSubscriber(InAppPaymentSubscriberRecord.Type.BACKUP) if (subscriberId == null && hasActivePurchase) { Log.w(TAG, "User has active Google Play Billing purchase but no subscriber id! User should cancel backup and resubscribe.") - updateLocalState(null) // TODO [message-backups] Set UI flag hint here to launch sheet (designs pending) return Result.success() } val tier = SignalStore.backup.backupTier if (subscriberId == null && tier == MessageBackupTier.PAID) { - Log.w(TAG, "User has no subscriber id but PAID backup tier. Reverting to no backup tier and informing the user.") - updateLocalState(null) + Log.w(TAG, "User has no subscriber id but PAID backup tier. User will need to cancel and resubscribe.") // TODO [message-backups] Set UI flag hint here to launch sheet (designs pending) return Result.success() } val activeSubscription = RecurringInAppPaymentRepository.getActiveSubscriptionSync(InAppPaymentSubscriberRecord.Type.BACKUP).getOrNull() if (activeSubscription?.isActive == true && tier != MessageBackupTier.PAID) { - Log.w(TAG, "User has an active subscription but no backup tier. Setting to PAID and enabling backups.") - updateLocalState(MessageBackupTier.PAID) + Log.w(TAG, "User has an active subscription but no backup tier.") + // TODO [message-backups] Set UI flag hint here to launch error sheet? return Result.success() } if (activeSubscription?.isActive != true && tier == MessageBackupTier.PAID) { - Log.w(TAG, "User subscription is inactive or does not exist. Clearing backup tier.") + Log.w(TAG, "User subscription is inactive or does not exist. User will need to cancel and resubscribe.") // TODO [message-backups] Set UI hint? - updateLocalState(null) return Result.success() } if (activeSubscription?.isActive != true && hasActivePurchase) { - Log.w(TAG, "User subscription is inactive but user has a recent purchase. Clearing backup tier.") + Log.w(TAG, "User subscription is inactive but user has a recent purchase. User will need to cancel and resubscribe.") // TODO [message-backups] Set UI hint? - updateLocalState(null) return Result.success() } return Result.success() } - private fun updateLocalState(backupTier: MessageBackupTier?) { - synchronized(InAppPaymentSubscriberRecord.Type.BACKUP) { - SignalStore.backup.backupTier = backupTier - } - } - override fun serialize(): ByteArray? = null override fun getFactoryKey(): String = KEY diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java index 3d4d85cd72..ee2627e50e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java @@ -99,7 +99,7 @@ public void onRun() throws Exception { int result = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context); if (result != ConnectionResult.SUCCESS) { - notifyFcmFailure(); + notifyFcmFailure(result); } else { Optional token = FcmUtil.getToken(context); @@ -137,8 +137,8 @@ public boolean onShouldRetry(@NonNull Exception throwable) { return true; } - private void notifyFcmFailure() { - Intent intent = AppSettingsActivity.pushNotifications(context).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + private void notifyFcmFailure(int errorCode) { + Intent intent = AppSettingsActivity.playServicesProblem(context, errorCode).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(context, 1122, intent, PendingIntentFlags.cancelCurrent()); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.getInstance().FAILURES); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java index 9fa17f3887..609861a6d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingMessage; +import org.thoughtcrime.securesms.ratelimit.ProofRequiredExceptionHandler; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -215,7 +216,12 @@ public void onPushSend() database.markAsSentFailed(messageId); RetrieveProfileJob.enqueue(recipientId); } catch (ProofRequiredException e) { - handleProofRequiredException(context, e, SignalDatabase.threads().getRecipientForThreadId(threadId), threadId, messageId, true); + ProofRequiredExceptionHandler.Result result = ProofRequiredExceptionHandler.handle(context, e, SignalDatabase.threads().getRecipientForThreadId(threadId), threadId, messageId); + if (result.isRetry()) { + throw new RetryLaterException(); + } else { + throw e; + } } SignalLocalMetrics.IndividualMessageSend.onJobFinished(messageId); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java index ccfb593321..70eb94ff6f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java @@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.messages.GroupSendUtil; import org.thoughtcrime.securesms.net.NotPushRegisteredException; +import org.thoughtcrime.securesms.ratelimit.ProofRequiredExceptionHandler; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -22,6 +23,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.exceptions.ProofRequiredException; import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; import java.io.IOException; @@ -170,7 +172,8 @@ private List deliver(@NonNull List destinations) throws IO .withTimestamp(System.currentTimeMillis()) .withProfileKey(Recipient.self().resolve().getProfileKey()); - List results = GroupSendUtil.sendUnresendableDataMessage(context, null, destinations, false, ContentHint.IMPLICIT, dataMessage.build(), false); + List results = GroupSendUtil.sendUnresendableDataMessage(context, null, destinations, false, ContentHint.IMPLICIT, dataMessage.build(), false); + ProofRequiredException proofRequired = Stream.of(results).filter(r -> r.getProofRequiredFailure() != null).findLast().map(SendMessageResult::getProofRequiredFailure).orElse(null); GroupSendJobHelper.SendResult groupResult = GroupSendJobHelper.getCompletedSends(destinations, results); @@ -178,6 +181,11 @@ private List deliver(@NonNull List destinations) throws IO SignalDatabase.recipients().markUnregistered(unregistered); } + if (proofRequired != null) { + Log.d(TAG, "Notifying the user they were rate limited."); + ProofRequiredExceptionHandler.handle(context, proofRequired, null, -1L, -1L); + } + return groupResult.completed; } 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 f6981d9970..ccd169b7a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -37,6 +37,7 @@ import org.thoughtcrime.securesms.mms.MessageGroupContext; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingMessage; +import org.thoughtcrime.securesms.ratelimit.ProofRequiredExceptionHandler; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -456,7 +457,12 @@ static void processGroupMessageResults(@NonNull Context context, SignalDatabase.groupReceipts().setUnidentified(successUnidentifiedStatus, messageId); if (proofRequired != null) { - handleProofRequiredException(context, proofRequired, groupRecipient, threadId, messageId, true); + ProofRequiredExceptionHandler.Result result = ProofRequiredExceptionHandler.handle(context, proofRequired, groupRecipient, threadId, messageId); + if (result.isRetry()) { + throw new RetryLaterException(); + } else { + throw proofRequired; + } } if (existingNetworkFailures.isEmpty() && existingIdentityMismatches.isEmpty()) { 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 9b524ee821..46f8fbb494 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java @@ -576,84 +576,6 @@ protected void rotateSenderCertificateIfNecessary() throws IOException { } } - protected static void handleProofRequiredException(@NonNull Context context, @NonNull ProofRequiredException proofRequired, @Nullable Recipient recipient, long threadId, long messageId, boolean isMms) - throws ProofRequiredException, RetryLaterException - { - Log.w(TAG, "[Proof Required] Options: " + proofRequired.getOptions()); - - try { - if (proofRequired.getOptions().contains(ProofRequiredException.Option.PUSH_CHALLENGE)) { - AppDependencies.getSignalServiceAccountManager().requestRateLimitPushChallenge(); - Log.i(TAG, "[Proof Required] Successfully requested a challenge. Waiting up to " + PUSH_CHALLENGE_TIMEOUT + " ms."); - - boolean success = new PushChallengeRequest(PUSH_CHALLENGE_TIMEOUT).blockUntilSuccess(); - - if (success) { - Log.i(TAG, "Successfully responded to a push challenge. Retrying message send."); - throw new RetryLaterException(1); - } else { - Log.w(TAG, "Failed to respond to the push challenge in time. Falling back."); - } - } - } catch (NonSuccessfulResponseCodeException e) { - Log.w(TAG, "[Proof Required] Could not request a push challenge (" + e.getCode() + "). Falling back.", e); - } catch (IOException e) { - Log.w(TAG, "[Proof Required] Network error when requesting push challenge. Retrying later."); - throw new RetryLaterException(e); - } - - Log.w(TAG, "[Proof Required] Marking message as rate-limited. (id: " + messageId + ", mms: " + isMms + ", thread: " + threadId + ")"); - if (isMms) { - SignalDatabase.messages().markAsRateLimited(messageId); - } else { - SignalDatabase.messages().markAsRateLimited(messageId); - } - - if (proofRequired.getOptions().contains(ProofRequiredException.Option.CAPTCHA)) { - Log.i(TAG, "[Proof Required] CAPTCHA required."); - SignalStore.rateLimit().markNeedsRecaptcha(proofRequired.getToken()); - - if (recipient != null) { - ParentStoryId.GroupReply groupReply = SignalDatabase.messages().getParentStoryIdForGroupReply(messageId); - AppDependencies.getMessageNotifier().notifyProofRequired(context, recipient, ConversationId.fromThreadAndReply(threadId, groupReply)); - } else { - Log.w(TAG, "[Proof Required] No recipient! Couldn't notify."); - } - } - - throw proofRequired; - } - protected abstract void onPushSend() throws Exception; - public static class PushChallengeRequest { - private final long timeout; - private final CountDownLatch latch; - private final EventBus eventBus; - - private PushChallengeRequest(long timeout) { - this.timeout = timeout; - this.latch = new CountDownLatch(1); - this.eventBus = EventBus.getDefault(); - } - - public boolean blockUntilSuccess() { - eventBus.register(this); - - try { - return latch.await(timeout, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - Log.w(TAG, "[Proof Required] Interrupted?", e); - return false; - } finally { - eventBus.unregister(this); - } - } - - @Subscribe(threadMode = ThreadMode.POSTING) - public void onSuccessReceived(SubmitRateLimitPushChallengeJob.SuccessEvent event) { - Log.i(TAG, "[Proof Required] Received a successful result!"); - latch.countDown(); - } - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt index ed503d616e..59b0db2797 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt @@ -1432,7 +1432,7 @@ object SyncMessageProcessor { } val recipient = resolveCallLinkRecipient(callEvent) - SignalDatabase.calls.insertOrUpdateAdHocCallFromObserveEvent( + SignalDatabase.calls.insertOrUpdateAdHocCallFromRemoteObserveEvent( callRecipient = recipient, timestamp = callEvent.timestamp!!, callId = callId diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob.kt b/app/src/main/java/org/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob.kt index 5277133519..63c992b859 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob.kt @@ -7,6 +7,7 @@ import org.thoughtcrime.securesms.jobmanager.Job /** * Rebuilds the full-text search index for the messages table. */ +@Deprecated("Do not use! Perform the index rebuild synchronously instead.") internal class RebuildMessageSearchIndexMigrationJob( parameters: Parameters = Parameters.Builder().build() ) : MigrationJob(parameters) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java index 9caf693e09..1f8c92d1c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java @@ -77,7 +77,7 @@ void performMigration() { ThreadTable threadTable = SignalDatabase.threads(); - int threadCount = threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF) + + int threadCount = threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, null) + threadTable.getArchivedConversationListCount(ConversationFilter.OFF); if (threadCount >= 3) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java index c96f9f1f54..fb05566b95 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java @@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ContactFilterView; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; +import org.thoughtcrime.securesms.contacts.paged.ChatType; import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.payments.CanNotSendPaymentDialog; @@ -71,7 +72,7 @@ private void initializeSearch() { } @Override - public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, @Nullable String number, @NonNull Consumer callback) { + public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Optional recipientId, @Nullable String number, @NonNull Optional chatType, @NonNull Consumer callback) { if (recipientId.isPresent()) { SimpleTask.run(getViewLifecycleOwner().getLifecycle(), () -> Recipient.resolved(recipientId.get()), @@ -82,7 +83,7 @@ public void onBeforeContactSelected(boolean isFromUnknownSearchKey, @NonNull Opt } @Override - public void onContactDeselected(@NonNull Optional recipientId, @Nullable String number) {} + public void onContactDeselected(@NonNull Optional recipientId, @Nullable String number, @NonNull Optional chatType) {} @Override public void onSelectionChanged() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.kt b/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.kt index d5de5d64f7..a742d3640c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.kt @@ -46,7 +46,6 @@ open class SignalServiceNetworkAccess(context: Context) { private const val COUNTRY_CODE_IRAN = 98 private const val COUNTRY_CODE_CUBA = 53 private const val COUNTRY_CODE_UZBEKISTAN = 998 - private const val COUNTRY_CODE_RUSSIA = 7 private const val COUNTRY_CODE_VENEZUELA = 58 private const val COUNTRY_CODE_PAKISTAN = 92 @@ -252,8 +251,7 @@ open class SignalServiceNetworkAccess(context: Context) { listOf(HostConfig(HTTPS_WWW_GOOGLE_COM_PK, G_HOST, GMAIL_CONNECTION_SPEC)) + baseGHostConfigs ), COUNTRY_CODE_IRAN to fConfig, - COUNTRY_CODE_CUBA to fConfig, - COUNTRY_CODE_RUSSIA to fConfig + COUNTRY_CODE_CUBA to fConfig ) private val defaultCensoredConfiguration: SignalServiceConfiguration = buildGConfiguration(baseGHostConfigs) + fConfig @@ -266,7 +264,6 @@ open class SignalServiceNetworkAccess(context: Context) { COUNTRY_CODE_IRAN, COUNTRY_CODE_CUBA, COUNTRY_CODE_UZBEKISTAN, - COUNTRY_CODE_RUSSIA, COUNTRY_CODE_VENEZUELA, COUNTRY_CODE_PAKISTAN ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt new file mode 100644 index 0000000000..2e97681ced --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt @@ -0,0 +1,128 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.ratelimit + +import android.content.Context +import androidx.annotation.WorkerThread +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.database.model.ParentStoryId +import org.thoughtcrime.securesms.dependencies.AppDependencies +import org.thoughtcrime.securesms.jobs.SubmitRateLimitPushChallengeJob.SuccessEvent +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.notifications.v2.ConversationId +import org.thoughtcrime.securesms.recipients.Recipient +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException +import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException +import java.io.IOException +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +/** + * Reusable ProofRequiredException handling code. + */ +object ProofRequiredExceptionHandler { + + private val TAG = Log.tag(ProofRequiredExceptionHandler::class) + private val PUSH_CHALLENGE_TIMEOUT: Duration = 10.seconds + + /** + * Handles the given exception, updating state as necessary. + */ + @JvmStatic + @WorkerThread + fun handle(context: Context, proofRequired: ProofRequiredException, recipient: Recipient?, threadId: Long, messageId: Long): Result { + Log.w(TAG, "[Proof Required] Options: ${proofRequired.options}") + + try { + if (ProofRequiredException.Option.PUSH_CHALLENGE in proofRequired.options) { + AppDependencies.signalServiceAccountManager.requestRateLimitPushChallenge() + Log.i(TAG, "[Proof Required] Successfully requested a challenge. Waiting up to $PUSH_CHALLENGE_TIMEOUT ms.") + + val success = PushChallengeRequest(PUSH_CHALLENGE_TIMEOUT).blockUntilSuccess() + + if (success) { + Log.i(TAG, "Successfully responded to a push challenge. Retrying message send.") + return Result.RETRY_NOW + } else { + Log.w(TAG, "Failed to respond to the push challeng in time. Falling back.") + } + } + } catch (e: NonSuccessfulResponseCodeException) { + Log.w(TAG, "[Proof Required] Could not request a push challenge (${e.code}). Falling back.", e) + } catch (e: IOException) { + Log.w(TAG, "[Proof Required] Network error when requesting push challenge. Retrying later.") + return Result.RETRY_LATER + } + + if (messageId > 0) { + Log.w(TAG, "[Proof Required] Marking message as rate-limited. (id: $messageId, thread: $threadId)") + SignalDatabase.messages.markAsRateLimited(messageId) + } + + if (ProofRequiredException.Option.CAPTCHA in proofRequired.options) { + Log.i(TAG, "[Proof Required] CAPTCHA required.") + SignalStore.rateLimit.markNeedsRecaptcha(proofRequired.token) + + if (recipient != null && messageId > -1L) { + val groupReply: ParentStoryId.GroupReply? = SignalDatabase.messages.getParentStoryIdForGroupReply(messageId) + AppDependencies.messageNotifier.notifyProofRequired(context, recipient, ConversationId.fromThreadAndReply(threadId, groupReply)) + } else { + Log.w(TAG, "[Proof Required] No recipient! Couldn't notify.") + } + } + + return Result.RETHROW + } + + enum class Result { + /** + * The challenge was successful and the message send can be retried immediately. + */ + RETRY_NOW, + + /** + * The challenge failed due to a network error and should be scheduled to retry with some offset. + */ + RETRY_LATER, + + /** + * The caller should rethrow the original error. + */ + RETHROW; + + fun isRetry() = this != RETHROW + } + + private class PushChallengeRequest(val timeout: Duration) { + private val latch = CountDownLatch(1) + private val eventBus = EventBus.getDefault() + + fun blockUntilSuccess(): Boolean { + eventBus.register(this) + + return try { + latch.await(timeout.inWholeMilliseconds, TimeUnit.MILLISECONDS) + } catch (e: InterruptedException) { + Log.w(TAG, "[Proof Required] Interrupted?", e) + false + } finally { + eventBus.unregister(this) + } + } + + @Subscribe(threadMode = ThreadMode.POSTING) + fun onSuccessReceived(event: SuccessEvent) { + Log.i(TAG, "[Proof Required] Received a successful result!") + latch.countDown() + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java index 7c1bcd6508..8ca2d37c97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java @@ -10,8 +10,11 @@ import android.webkit.WebViewClient; import android.widget.Toast; +import androidx.activity.result.contract.ActivityResultContract; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.PassphraseRequiredActivity; @@ -20,7 +23,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.Util; -import org.signal.core.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; @@ -36,10 +38,6 @@ public class RecaptchaProofActivity extends PassphraseRequiredActivity { private final DynamicTheme dynamicTheme = new DynamicTheme(); - public static @NonNull Intent getIntent(@NonNull Context context) { - return new Intent(context, RecaptchaProofActivity.class); - } - @Override protected void onPreCreate() { dynamicTheme.onCreate(this); @@ -120,6 +118,7 @@ private void handleToken(@NonNull String token) { if (result.clearState) { Log.i(TAG, "Considering the response sufficient to clear the slate."); SignalStore.rateLimit().onProofAccepted(); + setResult(RESULT_OK); } if (!result.success) { @@ -140,4 +139,17 @@ private TokenResult(boolean clearState, boolean success) { this.success = success; } } + + public static class RecaptchaProofContract extends ActivityResultContract { + + @Override + public @NonNull Intent createIntent(@NonNull Context context, Void unused) { + return new Intent(context, RecaptchaProofActivity.class); + } + + @Override + public Boolean parseResult(int resultCode, @Nullable Intent intent) { + return resultCode == RESULT_OK; + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofBottomSheetFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofBottomSheetFragment.java index a87d1eaf44..a58012b758 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofBottomSheetFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofBottomSheetFragment.java @@ -1,10 +1,12 @@ package org.thoughtcrime.securesms.ratelimit; +import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; @@ -24,6 +26,8 @@ public final class RecaptchaProofBottomSheetFragment extends BottomSheetDialogFr private static final String TAG = Log.tag(RecaptchaProofBottomSheetFragment.class); + private ActivityResultLauncher launcher; + public static void show(@NonNull FragmentManager manager) { new RecaptchaProofBottomSheetFragment().show(manager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); } @@ -38,11 +42,25 @@ public void onCreate(@Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.recaptcha_required_bottom_sheet, container, false); - view.findViewById(R.id.recaptcha_sheet_ok_button).setOnClickListener(v -> { + Activity activity = requireActivity(); + final Callback callback; + + if (activity instanceof Callback) { + callback = (Callback) activity; + } else { + callback = null; + } + + launcher = registerForActivityResult(new RecaptchaProofActivity.RecaptchaProofContract(), (isOk) -> { + if (isOk && callback != null) { + callback.onProofCompleted(); + } + dismissAllowingStateLoss(); - startActivity(RecaptchaProofActivity.getIntent(requireContext())); }); + view.findViewById(R.id.recaptcha_sheet_ok_button).setOnClickListener(v -> launcher.launch(null)); + return view; } @@ -62,4 +80,12 @@ public void show(@NonNull FragmentManager manager, @Nullable String tag) { Log.i(TAG, "Ignoring repeat show."); } } + + /** + * Optional callback interface to be invoked when the user successfully completes a push challenge. + * This is expected to be implemented on the activity which is displaying this fragment. + */ + public interface Callback { + void onProofCompleted(); + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt index fdb9581ef0..0eec6f93df 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt @@ -70,6 +70,7 @@ import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.dualsim.MccMncProducer import org.whispersystems.signalservice.api.SvrNoDataException import org.whispersystems.signalservice.api.kbs.MasterKey +import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataJson import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse import java.io.IOException import java.util.concurrent.TimeUnit @@ -684,10 +685,14 @@ class RegistrationViewModel : ViewModel() { */ private suspend fun registerAccountInternal(context: Context, sessionId: String?, registrationData: RegistrationData, pin: String?, masterKey: MasterKey): Pair { Log.v(TAG, "registerAccountInternal()") - val registrationResult: RegisterAccountResult = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData, pin = pin) { masterKey } + var registrationResult: RegisterAccountResult = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData, pin = pin) // Check if reg lock is enabled if (registrationResult !is RegisterAccountResult.RegistrationLocked) { + if (registrationResult is RegisterAccountResult.Success) { + registrationResult = RegisterAccountResult.Success(registrationResult.accountRegistrationResult.copy(masterKey = masterKey)) + } + Log.i(TAG, "Received a non-registration lock response to registration. Assuming registration lock as DISABLED") return Pair(registrationResult, false) } @@ -748,21 +753,26 @@ class RegistrationViewModel : ViewModel() { var reglock = registrationLocked - val sessionId = getOrCreateValidSession(context)?.body?.id ?: return - val registrationData = getRegistrationData() + val session: RegistrationSessionMetadataJson? = getOrCreateValidSession(context)?.body + val sessionId: String = session?.id ?: return + val registrationData: RegistrationData = getRegistrationData() - Log.d(TAG, "Submitting verification code…") + if (session.verified) { + Log.i(TAG, "Session is already verified, registering account.") + } else { + Log.d(TAG, "Submitting verification code…") - val verificationResponse = RegistrationRepository.submitVerificationCode(context, sessionId, registrationData) + val verificationResponse = RegistrationRepository.submitVerificationCode(context, sessionId, registrationData) - val submissionSuccessful = verificationResponse is Success - val alreadyVerified = verificationResponse is AlreadyVerified + val submissionSuccessful = verificationResponse is Success + val alreadyVerified = verificationResponse is AlreadyVerified - Log.d(TAG, "Verification code submission network call completed. Submission successful? $submissionSuccessful Account already verified? $alreadyVerified") + Log.d(TAG, "Verification code submission network call completed. Submission successful? $submissionSuccessful Account already verified? $alreadyVerified") - if (!submissionSuccessful && !alreadyVerified) { - handleSessionStateResult(context, verificationResponse) - return + if (!submissionSuccessful && !alreadyVerified) { + handleSessionStateResult(context, verificationResponse) + return + } } Log.d(TAG, "Submitting registration…") diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java index ce7e9d4d6f..dcfca8f826 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java @@ -331,4 +331,18 @@ public GroupActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProce return terminateGroupCall(currentState); } + + @Override + protected @NonNull WebRtcServiceState handleResendMediaKeys(@NonNull WebRtcServiceState currentState) { + GroupCall groupCall = currentState.getCallInfoState().getGroupCall(); + if (groupCall != null) { + try { + currentState.getCallInfoState().getGroupCall().resendMediaKeys(); + } catch (CallException e) { + return groupCallFailure(currentState, "Unable to resend media keys", e); + } + } + + return currentState; + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index 9a50a4b76b..5aba675fac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -14,7 +14,6 @@ import com.annimon.stream.Stream; import org.greenrobot.eventbus.EventBus; -import org.signal.core.util.ListUtil; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.util.Pair; @@ -56,6 +55,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.messages.GroupSendUtil; import org.thoughtcrime.securesms.notifications.v2.ConversationId; +import org.thoughtcrime.securesms.ratelimit.ProofRequiredExceptionHandler; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -68,7 +68,6 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState; import org.thoughtcrime.securesms.util.AppForegroundObserver; import org.thoughtcrime.securesms.util.RecipientAccessList; -import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.rx.RxStore; @@ -86,15 +85,16 @@ import org.whispersystems.signalservice.api.messages.calls.TurnServerInfo; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.internal.push.SyncMessage; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -412,9 +412,9 @@ public void peekCallLinkCall(@NonNull RecipientId id) { CallLinkAuthCredentialPresentation callLinkAuthCredentialPresentation = AppDependencies.getGroupsV2Authorization() .getCallLinkAuthorizationForToday( - genericServerPublicParams, - CallLinkSecretParams.deriveFromRootKey(callLinkRootKey.getKeyBytes()) - ); + genericServerPublicParams, + CallLinkSecretParams.deriveFromRootKey(callLinkRootKey.getKeyBytes()) + ); callManager.peekCallLinkCall(SignalStore.internal().groupCallingServer(), callLinkAuthCredentialPresentation.serialize(), callLinkRootKey, peekInfo -> { PeekInfo info = peekInfo.getValue(); @@ -425,7 +425,7 @@ public void peekCallLinkCall(@NonNull RecipientId id) { String eraId = info.getEraId(); if (eraId != null && !info.getJoinedMembers().isEmpty()) { - if (SignalDatabase.calls().insertAdHocCallFromObserveEvent(callLinkRecipient, System.currentTimeMillis(), eraId)) { + if (SignalDatabase.calls().insertAdHocCallFromLocalObserveEvent(callLinkRecipient, System.currentTimeMillis(), eraId)) { AppDependencies.getJobManager() .add(CallSyncEventJob.createForObserved(callLinkRecipient.getId(), CallId.fromEra(eraId).longValue())); } @@ -804,6 +804,11 @@ public void onSendCallMessage(@NonNull UUID aciUuid, @NonNull byte[] message, @N Log.i(TAG, "onSendCallMessage onFailure: ", e); RetrieveProfileJob.enqueue(recipient.getId()); process((s, p) -> p.handleGroupMessageSentError(s, Collections.singletonList(recipient.getId()), UNTRUSTED_IDENTITY)); + } catch (ProofRequiredException e) { + Log.i(TAG, "onSendCallMessage onFailure: ", e); + ProofRequiredExceptionHandler.handle(context, e, recipient, -1L, -1L); + process((s, p) -> p.handleResendMediaKeys(s)); + process((s, p) -> p.handleGroupMessageSentError(s, Collections.singletonList(recipient.getId()), NETWORK_FAILURE)); } catch (IOException e) { Log.i(TAG, "onSendCallMessage onFailure: ", e); process((s, p) -> p.handleGroupMessageSentError(s, Collections.singletonList(recipient.getId()), NETWORK_FAILURE)); @@ -1026,31 +1031,13 @@ public void retrieveTurnServers(@NonNull RemotePeer remotePeer) { try { TurnServerInfo turnServerInfo = AppDependencies.getSignalServiceAccountManager().getTurnServerInfo(); - List iceServers = new LinkedList<>(); - for (String url : ListUtil.emptyIfNull(turnServerInfo.getUrlsWithIps())) { - if (url.startsWith("turn")) { - iceServers.add(PeerConnection.IceServer.builder(url) - .setUsername(turnServerInfo.getUsername()) - .setPassword(turnServerInfo.getPassword()) - .setHostname(turnServerInfo.getHostname()) - .createIceServer()); - } else { - iceServers.add(PeerConnection.IceServer.builder(url) - .setHostname(turnServerInfo.getHostname()) - .createIceServer()); - } - } - for (String url : ListUtil.emptyIfNull(turnServerInfo.getUrls())) { - if (url.startsWith("turn")) { - iceServers.add(PeerConnection.IceServer.builder(url) - .setUsername(turnServerInfo.getUsername()) - .setPassword(turnServerInfo.getPassword()) - .createIceServer()); - } else { - iceServers.add(PeerConnection.IceServer.builder(url).createIceServer()); - } + List turnServerInfos = new ArrayList<>(); + if (turnServerInfo != null) { + turnServerInfos.add(turnServerInfo); + turnServerInfos.addAll(turnServerInfo.getIceServers()); } + List iceServers = mapToIceServers(turnServerInfos); process((s, p) -> { RemotePeer activePeer = s.getCallInfoState().getActivePeer(); if (activePeer != null && activePeer.getCallId().equals(remotePeer.getCallId())) { @@ -1067,6 +1054,39 @@ public void retrieveTurnServers(@NonNull RemotePeer remotePeer) { }); } + private static List mapToIceServers(@NonNull List turnServerInfos) { + List iceServers = new ArrayList<>(); + + for (TurnServerInfo turnServerInfo: turnServerInfos) { + if (turnServerInfo.getUrlsWithIps() != null) { + iceServers.addAll( + turnServerInfo.getUrlsWithIps() + .stream() + .map(url -> + PeerConnection.IceServer.builder(url) + .setUsername(turnServerInfo.getUsername()) + .setPassword(turnServerInfo.getPassword()) + .setHostname(turnServerInfo.getHostname()) + .createIceServer() + ).collect(Collectors.toList())); + } + + if (turnServerInfo.getUrls() != null) { + iceServers.addAll( + turnServerInfo.getUrls() + .stream() + .map(url -> + PeerConnection.IceServer.builder(url) + .setUsername(turnServerInfo.getUsername()) + .setPassword(turnServerInfo.getPassword()) + .createIceServer() + ).collect(Collectors.toList())); + } + } + + return iceServers; + } + public void sendGroupCallUpdateMessage(@NonNull Recipient recipient, @Nullable String groupCallEraId, final @Nullable CallId callId, boolean isIncoming, boolean isJoinEvent) { Log.i(TAG, "sendGroupCallUpdateMessage id: " + recipient.getId() + " era: " + groupCallEraId + " isIncoming: " + isIncoming + " isJoinEvent: " + isJoinEvent); @@ -1135,6 +1155,10 @@ public void updateGroupCallUpdateMessage(@NonNull RecipientId groupId, @Nullable isCallFull)); } + public void resendMediaKeys() { + process((s, p) -> p.handleResendMediaKeys(s)); + } + public void sendCallMessage(@NonNull final RemotePeer remotePeer, @NonNull final SignalServiceCallMessage callMessage) { @@ -1158,6 +1182,11 @@ public void sendCallMessage(@NonNull final RemotePeer remotePeer, UNTRUSTED_IDENTITY, Optional.ofNullable(e.getIdentityKey()))); } catch (IOException e) { + if (e instanceof ProofRequiredException) { + ProofRequiredExceptionHandler.handle(context, (ProofRequiredException) e, null, -1L, -1L); + process((s, p) -> p.handleResendMediaKeys(s)); + } + processSendMessageFailureWithChangeDetection(remotePeer, (s, p) -> p.handleMessageSentError(s, remotePeer.getCallId(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java index 18ee543951..a9499e1912 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java @@ -793,6 +793,11 @@ public WebRtcActionProcessor(@NonNull WebRtcInteractor webRtcInteractor, @NonNul return currentState; } + protected @NonNull WebRtcServiceState handleResendMediaKeys(@NonNull WebRtcServiceState currentState) { + Log.i(tag, "handleResendMediaKeys not processed"); + return currentState; + } + protected @NonNull WebRtcServiceState handleReceivedOpaqueMessage(@NonNull WebRtcServiceState currentState, @NonNull WebRtcData.OpaqueMessageMetadata opaqueMessageMetadata) { Log.i(tag, "handleReceivedOpaqueMessage():"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/links/SignalCallLinkManager.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/links/SignalCallLinkManager.kt index 5c6be075c8..16926e7fc4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/links/SignalCallLinkManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/links/SignalCallLinkManager.kt @@ -101,7 +101,7 @@ class SignalCallLinkManager( ) } catch (e: Exception) { Log.e(TAG, "Failed to create call link credential.", e) - emitter.onError(e) + emitter.onSuccess(CreateCallLinkResult.Failure(-1)) return@create } 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 f483557d6f..f00aed14fd 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 @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.ContactSelectionListFragment import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode import org.thoughtcrime.securesms.contacts.HeaderAction +import org.thoughtcrime.securesms.contacts.paged.ChatType import org.thoughtcrime.securesms.contacts.selection.ContactSelectionArguments import org.thoughtcrime.securesms.database.model.DistributionListId import org.thoughtcrime.securesms.groups.SelectionLimits @@ -117,7 +118,7 @@ abstract class BaseStoryRecipientSelectionFragment : Fragment(R.layout.stories_b } } - override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, callback: Consumer) { + override fun onBeforeContactSelected(isFromUnknownSearchKey: Boolean, recipientId: Optional, number: String?, chatType: Optional, callback: Consumer) { viewModel.addRecipient(recipientId.get()) if (searchField.text.isNotBlank()) { @@ -127,7 +128,7 @@ abstract class BaseStoryRecipientSelectionFragment : Fragment(R.layout.stories_b callback.accept(true) } - override fun onContactDeselected(recipientId: Optional, number: String?) { + override fun onContactDeselected(recipientId: Optional, number: String?, chatType: Optional) { viewModel.removeRecipient(recipientId.get()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/PlayServicesUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/PlayServicesUtil.java index 97de9e0a15..149194d1be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/PlayServicesUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/PlayServicesUtil.java @@ -40,16 +40,9 @@ public enum PlayServicesStatus { case ConnectionResult.SUCCESS: return PlayServicesStatus.SUCCESS; case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: - try { - ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo("com.google.android.gms", 0); - - if (applicationInfo != null && !applicationInfo.enabled) { - return PlayServicesStatus.MISSING; - } - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, e); + if (!isGooglePlayPackageEnabled(context)) { + return PlayServicesStatus.MISSING; } - return PlayServicesStatus.NEEDS_UPDATE; case ConnectionResult.SERVICE_DISABLED: return PlayServicesStatus.DISABLED; @@ -63,4 +56,13 @@ public enum PlayServicesStatus { } } + public static boolean isGooglePlayPackageEnabled(Context context) { + try { + ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo("com.google.android.gms", 0); + return applicationInfo.enabled; + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, e); + return false; + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 847bc062ad..ffe58db5b8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -831,17 +831,6 @@ object RemoteConfig { hotSwappable = false ) - /** - * Whether or not ad-hoc calling is enabled - */ - @JvmStatic - @get:JvmName("adHocCalling") - val adHocCalling: Boolean by remoteBoolean( - key = "android.calling.ad.hoc.3", - defaultValue = false, - hotSwappable = false - ) - /** Maximum number of attachments allowed to be sent/received. */ val maxAttachmentCount: Int by remoteInt( key = "android.attachments.maxCount", @@ -1095,6 +1084,14 @@ object RemoteConfig { hotSwappable = true ) + /** Whether or not to show chat folders. */ + @JvmStatic + val showChatFolders: Boolean by remoteBoolean( + key = "android.showChatFolders", + defaultValue = false, + hotSwappable = true + ) + @JvmStatic @get:JvmName("newCallUi") val newCallUi: Boolean by remoteBoolean( diff --git a/app/src/main/res/drawable/ic_chat_folder_24.xml b/app/src/main/res/drawable/ic_chat_folder_24.xml new file mode 100644 index 0000000000..31a6fa6131 --- /dev/null +++ b/app/src/main/res/drawable/ic_chat_folder_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_drag_handle.xml b/app/src/main/res/drawable/ic_drag_handle.xml new file mode 100644 index 0000000000..dbe204edf0 --- /dev/null +++ b/app/src/main/res/drawable/ic_drag_handle.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_pin_20.xml b/app/src/main/res/drawable/ic_pin_20.xml new file mode 100644 index 0000000000..c58ee51556 --- /dev/null +++ b/app/src/main/res/drawable/ic_pin_20.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/symbol_chat_check.xml b/app/src/main/res/drawable/symbol_chat_check.xml new file mode 100644 index 0000000000..e0e5d84271 --- /dev/null +++ b/app/src/main/res/drawable/symbol_chat_check.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_exchange_24.xml b/app/src/main/res/drawable/symbol_exchange_24.xml new file mode 100644 index 0000000000..25eedddc5d --- /dev/null +++ b/app/src/main/res/drawable/symbol_exchange_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_pin_16.xml b/app/src/main/res/drawable/symbol_pin_16.xml new file mode 100644 index 0000000000..48110ef2f9 --- /dev/null +++ b/app/src/main/res/drawable/symbol_pin_16.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/chat_folder_item.xml b/app/src/main/res/layout/chat_folder_item.xml new file mode 100644 index 0000000000..5c1ff21514 --- /dev/null +++ b/app/src/main/res/layout/chat_folder_item.xml @@ -0,0 +1,37 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/choose_chats_fragment.xml b/app/src/main/res/layout/choose_chats_fragment.xml new file mode 100644 index 0000000000..b3813decbb --- /dev/null +++ b/app/src/main/res/layout/choose_chats_fragment.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/contact_search_chat_type_item.xml b/app/src/main/res/layout/contact_search_chat_type_item.xml new file mode 100644 index 0000000000..5a1b8d25be --- /dev/null +++ b/app/src/main/res/layout/contact_search_chat_type_item.xml @@ -0,0 +1,56 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/conversation_list_fragment.xml b/app/src/main/res/layout/conversation_list_fragment.xml index c85b052cf5..673eaf3cac 100644 --- a/app/src/main/res/layout/conversation_list_fragment.xml +++ b/app/src/main/res/layout/conversation_list_fragment.xml @@ -32,11 +32,21 @@ app:barrierDirection="bottom" app:constraint_referenced_ids="voice_note_player,banner_compose_view" /> + + + app:layout_constraintTop_toBottomOf="@id/chat_folder_list"> + + + + + + + diff --git a/app/src/main/res/navigation/app_settings_with_change_number.xml b/app/src/main/res/navigation/app_settings_with_change_number.xml index 94d6f61348..6ea7f1b9dc 100644 --- a/app/src/main/res/navigation/app_settings_with_change_number.xml +++ b/app/src/main/res/navigation/app_settings_with_change_number.xml @@ -366,6 +366,20 @@ app:exitAnim="@anim/fragment_open_exit" app:popEnterAnim="@anim/fragment_close_enter" app:popExitAnim="@anim/fragment_close_exit" /> + + + + + + + + + + + + + + + + + @@ -397,9 +451,9 @@ app:popExitAnim="@anim/fragment_close_exit" /> + android:name="play_services_error_code" + android:defaultValue="0" + app:argType="integer" /> @@ -637,6 +691,22 @@ app:popEnterAnim="@anim/fragment_close_enter" app:popExitAnim="@anim/fragment_close_exit" /> + + + + diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 3a4ef3431d..a51fd84535 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -365,6 +365,8 @@ Kletse Boodskappe + + Kletstipes Boodskap %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Jy is gereed. Begin jou rugsteun nou. Na gelang van die grootte van jou rugsteun kan dit lank neem. Jy kan jou foon soos gewoonlik gebruik terwyl die rugsteun plaasvind. @@ -1966,6 +1968,7 @@ +%1$d genooi +%1$d genooi + %1$d bykomende groep %1$d bykomende groepe @@ -1992,6 +1995,7 @@ Geen toestel gevind nie. Netwerkfout. Ongeldige QR-kode. + Jammer, jy het te veel toestelle reeds gekoppel. Probeer om sommige van die toestelle te verwyder Jammer, dit is nie \'n geldige QR-kode vir toestelkoppeling nie. Koppel \'n Signal-toestel? @@ -2014,11 +2018,13 @@ Dien wagwoordfrase in Ongeldige wagwoordfrase! Ontsluit Molly + Molly Android - Sluit Skerm Kaart + Merker Aanvaar adres @@ -2522,6 +2528,7 @@ Signal-boodskap + Meer @@ -2553,6 +2560,7 @@ Geen plakkers geïnstalleer nie Plakkers van inkomende boodskappe sal hier verskyn Naamloos + Onbekend @@ -2774,6 +2782,7 @@ Media nie meer beskikbaar nie. Kan nie media speel nie. + Fout met vind van boodskap. Kan nie \'n toepassing vind wat hierdie media kan deel nie. Maak toe @@ -2845,6 +2854,7 @@ Boodskappe Oproepe + Mislukkings Rugsteunkopieë Slotstatus @@ -2854,6 +2864,7 @@ Onbekend Stemnotas Kontak het by Signal aangesluit + Geen aktiwiteit beskikbaar om kennisgewingkanaal-instellings oop te maak nie. Agtergrondverbinding @@ -3638,10 +3649,12 @@ Alle boodskapgeskiedenis sal permanent van alle toestelle verwyder word. Hierdie aksie kan nie ongedaan gemaak word nie. Skrap alles nou + Vir ewig 1 jaar 6 maande 30 dae + Geen %1$s boodskap @@ -3666,6 +3679,7 @@ Vertoon Luitoon Boodskaplettergrootte + Prioriteit Kennisgewingfoutopsporing @@ -3894,6 +3908,7 @@ Skandeer die adres-QR-kode van die betalingontvanger + Versoek Betaal Beskikbare saldo: %1$s @@ -4025,6 +4040,7 @@ Jy kan slegs tot %1$d met \'n merkspeld merk. + Kontakfoto Geargiveer @@ -4033,6 +4049,10 @@ Nuwe klets Maak Kamera oop Nog geen kletse nie.\nBegin deur ’n boodskap aan ’n vriend te skryf. + + Geen kletse om te vertoon nie + + Vouerinstellings @@ -4265,6 +4285,7 @@ Klets rugsteune Dra rekening oor Dra rekening oor na nuwe Android-toestel + Voer rugsteun-wagwoordfrase in Herstel Kan nie rugsteun uit nuwer Signal-weergawes invoer nie @@ -4472,6 +4493,7 @@ Kan nie Wi-Fi-instellings oopmaak nie. Skakel asseblief Wi-Fi met die hand aan. + Verleen liggingstoestemming Skakel liggingsdienste aan Skakel Wi-Fi aan @@ -4725,6 +4747,7 @@ Deel + Stuur , %1$s @@ -5028,6 +5051,119 @@ Toetsbord Stuur met Enter-sleutel + + Kletsvouers + + Voeg \'n kletsvouer by + + + + Organiseer jou kletse in vouers en wissel vinnig tussen hulle in jou kletslys. + + Vouers + + Skep \'n vouer + + Alle kletse + + Voorgestelde vouers + + Ongeleesdes + + Ongeleesde boodskappe uit alle kletse + + 1:1-kletse + + Slegs boodskappe uit direkte kletse + + Groepe + + Slegs boodskappe uit groepkletse + + Voeg toe + + %1$s vouer bygevoeg. + + Wysig vouer + + Skrap vouer + + Voeg nuwe vouer by + + Demp almal + + Herrangskik vouers + + Merk alles as gelees + + + %1$d kletstipe + %1$d kletstipes + + + + %1$d klets + %1$d kletse + + + + %1$d klets uitgesluit + %1$d kletse uitgesluit + + + + + Skep \'n vouer + + Vouernaam (word vereis) + + Kletse ingesluit + + Voeg kletse by + + Kies kletse wat jy in hierdie vouer wil laat verskyn. + + Uitsonderings + + Sluit kletse uit + + Kies kletse wat jy nie in hierdie vouer wil laat verskyn nie. + + Wys net ongeleesde kletse + + Wanneer dit geaktiveer is, sal slegs kletse met ongeleesde boodskappe in hierdie vouer gewys word. + + Sluit gedempte kletse in + + Skep + + Skep vouer? + + Wil jy die kletsvouer \"%1$s\" skep? + + Skep vouer + + Wysig vouer + + Stoor + + Stoor veranderinge? + + Wil jy die veranderinge stoor wat jy aan hierdie kletsvouer gemaak het? + + Stoor veranderinge + + Wys af + + Skrap vouer + + Skrap hierdie kletsvouer? + + + + Kletstipes + + Klaar Boodskappe @@ -5112,6 +5248,7 @@ Mediakwaliteit + Gestuurde mediakwaliteit Stuur van hoëkwaliteitmedia sal meer data gebruik. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Jou rugsteun-intekening het verval - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Jou rugsteunplan het verval omdat dit nie met jou huidige betalingsmetode hernu kon word nie. Die media in jou rugsteun sal ná %1$d dag geskrap word. + Jou rugsteunplan het verval omdat dit nie met jou huidige betalingsmetode hernu kon word nie. Die media in jou rugsteun sal ná %1$d dae geskrap word. Jy kan enige tyd weer vir rugsteun begin betaal sodat jy kan voortgaan om al jou media te rugsteun. @@ -7254,9 +7391,9 @@ As jy \"Slaan oor\" kies, sal die media in jou rugsteun oor %1$d dae geskrap word. - Your backups subscription failed to renew + Jou rugsteun-intekening kon nie hernu word nie - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Maak seker jou betalingsmetode is op datum. Tik op Bestuur intekening en tik onder Betalingsmetodes op Doen opdatering. Kon nie rugsteun voltooi nie @@ -7268,7 +7405,7 @@ Bestuur intekening - Subscribe for %1$s/month + Teken in teen %1$s/maand Laai media nou af @@ -7303,6 +7440,17 @@ %1$s of %2$s + + + Kanselleer aflaai + + Besig om af te laai: %1$s van %2$s (%3$s%%) + + Nie genoeg stoorruimte om jou rugsteun af te laai nie. Om voort te gaan, stel %1$s stoorruimte beskikbaar. + + Slaan aflaai oor + + "Jou laaste rugsteun kon nie voltooi word nie. Maak seker dat jou foon aan wi-fi gekoppel is en tik Rugsteun nou om weer te probeer." @@ -7356,18 +7504,18 @@ Stoorruimte-optimalisering kan slegs gebruik word met die betaalde vlak van Signal-rugsteun. Gradeer jou rugsteunplan op om hierdie kenmerk te begin gebruik. - Subscribe for %1$s/month + Teken in teen %1$s/maand - This media is no longer available + Hierdie media is nie meer beskikbaar nie - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Jou huidige Signal-rugsteunplan sluit jou mees onlangse %1$d dag se media in. Gradeer nou op om al jou media te begin rugsteun. + Jou huidige Signal-rugsteunplan sluit jou mees onlangse %1$d dae se media in. Gradeer nou op om al jou media te begin rugsteun. - Subscribe for %1$s/month + Teken in teen %1$s/maand Skrapping is nou oor al jou toestelle gesinchroniseer @@ -7415,6 +7563,8 @@ Aflaai voltooi Rugsteun sal oornag geskep word. + + Intekening onaktief Rugsteunplan @@ -7423,8 +7573,12 @@ %1$s/maand Jou rugsteunplan is gratis - + Hernu %1$s + + Verstryk op %1$s + + Het op %1$s verstryk Rugsteun jou boodskapgeskiedenis sodat jy nooit data verloor wanneer jy \'n nuwe foon kry of Molly herinstalleer nie. @@ -7469,6 +7623,10 @@ Rugsteun handmatig Voer asseblief jou toestel se pin, wagwoord of patroon in. + + Heraktiveer rugsteun + + Rugsteun is afgeskakel en jou data is uit Signal se veilige stoordiens geskrap. diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 248b2ef42d..1ee1b3b31c 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -377,6 +377,8 @@ الدردشات الرسائل + + أنواع الدردشات رسالة %1$s @@ -893,7 +895,7 @@ - You\'re all set. Start your backup now. + أنت جاهز الآن. ابدأ النسخ الاحتياطي لديك الآن. قد يستغرق هذا وقتًا طويلًا حسب حجم النسخة الاحتياطية الخاصة بك. يُمكنك استخدام هاتفك بشكل اعتيادي أثناء إجراء عملية النسخ الاحتياطي. @@ -2210,6 +2212,7 @@ +%1$d مدعوون +%1$d مدعوون + %1$d مجموعة إضافية %1$d مجموعة إضافية @@ -2240,6 +2243,7 @@ لم يتم العثور على أي جهاز. خطأ في الشبكة. كود الـ QR غير صالح. + عذرًا، لديك عدة أجهزة مرتبطة. يُرجى إزالة بعضها. عذرًا، الرابط غير صحيح. هل ترغبُ بربط جهاز يستخدم سيجنال؟ @@ -2266,11 +2270,13 @@ أدخِل العبارة السرية عبارة سرية غير صحيحة! فتح قفل سيجنال + سيجنال أندرويد - قفل الشاشة الخريطة + ضع علامة اقبل العنوان @@ -2371,13 +2377,13 @@ - العودة للوراء + عودة للوراء معلومات عن المكالمة - الكاميرا غير مشغلة + الكاميرا في حالة عدم تشغيل يُرجى النقر هنا لتشغيل مكالمة الفيديو لديك. @@ -2574,7 +2580,7 @@ إنهاء المُكالمة - تفعيل الرنين الجماعي + تفعيل الرنين للمجموعة حدث خطأ في واجهة المستخدم. يُرجى الإبلاغ عن هذا الخطأ للمطوِّرين. @@ -2596,7 +2602,7 @@ هل تريد خفض يدك؟ - اخفض + خفض اليد إلغاء @@ -2607,8 +2613,8 @@ %1$s رفع يده - %1$s +%2$d رفعتم أيديكم - %1$s +%2$d رفع يده + %1$s +%2$d رفعوا أيديهم + %1$s +%2$d رفعتَ يدك %1$s +%2$d رفعتُما أيديكُما %1$s +%2$d رفعتم أيديكم %1$s +%2$d رفعتم أيديكم @@ -2835,7 +2841,7 @@ - تم العثور على تضارب أسماء + هناك اختلاف في الأسماء إظهار @@ -2862,6 +2868,7 @@ ‫رسالة سيجنال + المزيد @@ -2893,6 +2900,7 @@ لا يوجد ملصقات مُثبَّتة ستظهر هنا الملصقات القادمة من الرسائل الواردة بدون عنوان + غير معروف @@ -2912,98 +2920,98 @@ فشل الحفظ - تمّ الحفظ - المس على الخط لحذفه + اكتمل الحفظ + انقر على الخط لحذفه إرسال - فشل إرسال السجل - تم بنجاح ! - يُرجى نسخ هذا العنوان وإضافته إلى بلاغك أو إلى بريد الدعم :\n\n%1$s - شارك - سيتم نشر هذا السّجل علناً حتى يتمكن المساهمون في التطبيق من الاطلاع عليه. يمكنك فحصه أو تعديله قبل رفعه. + فشل في الإبلاغ عن مشكلة + تمَّ بنجاح! + يُرجى نسخ هذا العنوان وإضافته إلى بلاغك عن مشكلة أو إلى بريد الدعم :\n\n%1$s + مشاركة + سيتمُّ نشر هذا السّجل علنًا على الانترنت حتى يتمكن المساهمون من الاطِّلاع عليه. يمكنك فحصه أو تعديله قبل تحميله. - المُرشِّح : - معلومات الجهاز : - إصدار اﻷندرويد + الفلتر: + معلومات الجهاز: + إصدار اﻷندرويد: - قفل التسجيل : + قفل التسجيل: - تم تحديث المجموعة - غادر المجموعة - إعادة ضبط جلسة آمنة. + تمَّ تحديث المجموعة + غادَرَ المجموعة + تمَّت إعادة ضبط جلسة آمنة. مسودة: رسالة وسائط متعددة - ملصق - صورة لمشاهدة لمرة واحدة - فيديو لمشاهدة لمرة واحدة - وسيط لمشاهدة لمرة واحدة + مُلصَق + صورة للمشاهدة لمرة واحدة + فيديو للمشاهدة لمرة واحدة + وسيط للمشاهدة لمرة واحدة حُذفَت هذه الرسالة. - لقد حذفت هذه الرسالة. + حذفتَ هذه الرسالة. - أرسلت طلبًا لتفعيل عمليات الدفع + أرسلتَ طلبًا لتفعيل عمليات الدفع. - يُريدك %1$s أن تُفعّل عمليات الدفع + يُريدك %1$s أن تُفعِّل عمليات الدفع - لقد فعّلت عمليات الدفع + فعّلتَ عمليات الدفع يُمكن لـ %1$s قبول عمليات الدفع الآن %1$s متواجد على سيجنال! - الرسائل المختفية غير مفعّلة + ميزة إخفاء الرسائل غير مُفعَّلة ضبط توقيت إخفاء الرسائل إلى %1$s - هناك تغيير في رقم الأمان - لقد تغيّر رقم الأمان بينك وبـين %1$s. - لقد قمت بالإشارة بالتحقّق - لقد قمت بإلغاء التحقق - لم يمكن معالجة الرسالة - مشكل في التوصيل - طلب التراسل + تمَّ تغيير رقم الأمان + تغيَّر رقم الأمان بينك وبـين %1$s. + قمتَ بتأكيد التحقُّق. + قمتَ بتأكيد إلغاء التحقُّق. + لَمْ تكتمِل معالجة الرسالة + مشكلة في التوصيل + طلب مراسلة - لقد أخفيت هذا الشخص، راسله مُجددًا لإضافته إلى قائمتك. + قمتَ بإخفاء جهة الاتصال هذه، راسلهم مُجددًا لإضافتهم إلى قائمتك. صورة صورة متحركة رسالة صوتية ملف فيديو - تم إنعاش جلسة الدردشة + تمَّ تحديث جلسة الدردشة - تبرّع %1$s لك + تبرَّع %1$s لك - تبرّعت لـ %1$s + تبرّعتَ لـ %1$s - لقد استردَدت شارة + استردَدت شارة - تفاعل %1$s مع قِصتك + تفاعَل %1$s مع قِصتك - تفاعل %1$s مع قِصتهم + تفاعَل %1$s مع قِصتهم عمليات الدفع رسالة مُجدولة - تم دمج سِجل رسائلك + تمَّ دمج سِجل رسائلك يعود الرقم %1$s إلى %2$s تحديث سيجنال - إصدار جديد من سيجنال متوفر. انقر للتحديث. - تعذّر على سيجنال التحديث + إصدار جديد من سيجنال متوفِّر. انقر للتحديث. + تعذَّر على سيجنال التحديث سنحاول من جديد لاحقًا. - تم تحديث سيجنال بنجاح - تم تحديثك تلقائيًا إلى الإصدار %1$s. + تمَّ تحديث سيجنال بنجاح + تمَّ تحديث التطبيق لديك تلقائيًا إلى الإصدار %1$s. قمتَ بالتحديث إلى النسخة %1$s. - هل تود إرسال الرسالة ؟ - أرسل + هل ترغبُ بإرسال الرسالة؟ + إرسال - هل تود إرسال الرسالة ؟ - أرسل + هل ترغبُ بإرسال الرسالة؟ + إرسال @@ -3011,49 +3019,49 @@ إضافة اسم مُستخدم - يُرجى اختيار اسم المُستخدم + اختر اسم مُستخدم خاص بك اسم المُستخدم حذف - تم حذف اسم المُستخدم بنجاح. - حدث خطأ فى الشبكة + تمَّ حذف اسم المُستخدم بنجاح. + حدث خطأ في الشبكة. - قمتَ بمحاولات كثيرة. يُرجى المحاولة لاحقاً - اسم المُستخدم هذا غير متوفّر. - أسماء المُستخدمين يجب أن تحتوي فقط على الحروف الأبجدية، 0-9، أو \"_\". + قمتَ بمحاولاتٍ كثيرة. يُرجى المحاولة لاحقًا. + اسم المُستخدم هذا غير متوفِّر. + أسماء المُستخدمين يجب أن تحتوي فقط على الحروف الأبجدية، أو الأرقام 0-9، أو \"_\". اسم المُستخدم لا يمكن أن يبدأ برقم. - اسم المُستخدم غير صالح + اسم المُستخدم غير صالح. اسم المُستخدم لا بد أن يكون بين %1$d و%2$d رمز. - يتم دائمًا إقران أسماء المستخدمين بمجموعة من الأرقام. + يتم دائمًا إقران أسماء المُستخدمين بمجموعة من الأرقام. ماذا يعني هذا الرقم؟ - تُساعد هذه الأرقام في الحفاظ على خصوصية اسم المُستخدم الخاص بك حتى تتجنب الرسائل غير مرغوب فيها. شارك اسم المُستخدم الخاص بك مع الأشخاص والمجموعات الذين ترغب في الدردشة معهم. إذا قمت بتغيير أسماء المُستخدمين، سَتحصل على مجموعة جديدة من الأرقام. + تُساعد هذه الأرقام في الحفاظ على خصوصية اسم المُستخدم الخاص بك حتى تتجنَّب الرسائل غير المرغوب فيها. شارِك اسم المُستخدم الخاص بك مع الأشخاص والمجموعات الذين ترغب في الدردشة معهم. إذا قمتَ بتغيير أسماء المُستخدمين، سَتحصل على مجموعة جديدة من الأرقام. تخطّي تمّ - اسم المُستخدم هذا ليس موجودًا، جرّب رقمًا آخر. + اسم المُستخدم هذا ليس موجودًا. جرِّب رقمًا آخر. - اسم مُستخدم غير صحيح، أدخل رمزيْن %1$d على الأقل. + اسم مُستخدم غير صحيح. أدخِل %1$d رمز (رموز) كحد أدنى. - اسم مُستخدم غير صحيح، أدخل %1$d رمزًا كحد أقصى. + اسم مُستخدم غير صحيح. أدخِل %1$d رمز (رموز) كحد أقصى. - لا يُمكن لهذا الرقم أن يكون 00. أدخل رقمًا بين 1 –9 + لا يُمكن لهذا الرقم أن يكون 00. أدخِل رقمًا بين 1 –9 - الأرقام التي تحتوي على أكثر من رقمين لا يُمكن أن تبدأ بـ 0 + الأرقام التي تحتوي على أكثر من رقمين لا يُمكن أن تبدأ بـ 0. - سيُؤدي استرداد اسم المُستخدم الخاص بك إلى إعادة تعيين رمز ورابط الاستجابة السريعة الخاصين بك. هل أنت مُتأكد؟ + سيُؤدي استرداد اسم المُستخدم الخاص بك إلى إعادة تعيين رابط وكود الـ QR الخاصين بك. هل أنت مُتأكِّد؟ - سيُؤدي تغيير اسم المُستخدم الخاص بك إلى إعادة تعيين رمز الاستجابة السريع والرابط الحاليين الخاصين بك. هل أنت متأكد؟ + سيُؤدي تغيير اسم المُستخدم الخاص بك إلى إعادة تعيين الرابط وكود الـ QR الحاليين الخاصين بك. هل أنت متأكِّد؟ - مواصلة + متابعة %1$d جهة اتصال تستخدم سيجنال!‏ ‏‏%1$d جهة اتصال تستخدم سيجنال!‏ - %1$d جهات اتصال تستخدم سيجنال! - %1$d جهات اتصال تستخدم سيجنال! + %1$d جهتي اتصال تستخدم سيجنال! + %1$d جهات اتصالٍ تستخدم سيجنال! %1$d جهة اتصال تستخدم سيجنال! %1$d جهة اتصال تستخدم سيجنال! @@ -3063,23 +3071,23 @@ نسخ أو مشاركة رابط اسم المُستخدم - جهة الاتصال هذه تستخدم نسخة أحدث من تطبيق سيجنال وصيغة رمز الاستجابة السريع أو QR فيها لا تتوافق مع نسختك. يرجى تحديث النسخة للمقارنة. - إن رمز الاستجابة السّريع الذي تمّ مسحه ليس برمز تحقق لرقم سلامة مُصاغ بشكل صحيح. يُرجى محاولة المسح من جديد. - شارك رقم الأمان بواسطة… + جهة الاتصال هذه تستخدم نسخة أحدث من تطبيق سيجنال وكود الـ QR فيها لا يتوافق مع نسختك. يُرجى تحديث النسخة للمقارنة. + كود الـ QR الذي تمَّ مسحه ليس برمز تحقُّق لرقم أمان تمَّت صياغته بشكلٍ صحيح. يُرجى محاولة المسح من جديد. + شارِك رقم الأمان من خلال… رقم الأمان الخاص بنا في سيجنال: يبدو عدم وجود أي تطبيقات لديك للمشاركة من خلالها. - لم يُعثر على رقم سلامة يمكن مقارنته في الحافظة - يحتاج سيجنال إلى إذن الكاميرا من أجل مسح رمز الاستجابة السريع QR ولكن تم إيقاف الإذن على نحو دائم، الرجاء زيارة إعدادات التطبيق واختيار \"الأذونات\"، ثم تفعيل \"الكاميرا\". - لا يمكن مسح رمز الإستجابة السريعة QR بدون إذن استخدام الكاميرا - يجب عليك أولا تبادل الرسائل لإظهار رقم أمان %1$s. + لم يُعثَر في الحافظة على رقم أمان يمكن مقارنته. + يحتاج سيجنال إلى إذن الكاميرا من أجل مسح كود الـ QR، ولكن تمَّ إيقاف الإذن على نحو دائم. الرجاء زيارة إعدادات التطبيق واختيار \"الأذونات\"، ثم تفعيل \"الكاميرا\". + لا يمكن مسح كود الـ QR بدون إذن استخدام الكاميرا. + يجب عليك أولًا تبادل الرسائل لإظهار رقم الأمان الخاص بـ %1$s. - سَيتم إنشاء رقم أمان مع هذا الشخص بعد تبادل الرسائل معه. + سيتم إنشاء رقم أمان مع هذا الشخص بعد تبادل الرسائل معه. موافق - معرفة المزيد + اعرف المزيد - موافق + حسنًا @@ -3088,44 +3096,45 @@ - عُميَّت الرسالة لجلسة غير موجودة + تمَّ تشفير الرسالة لجلسة غير موجودة. - رسالة متعددة الوسائط مُعمَّاة بطريقة سيئة - عُميَّت الرسالة متعدّدة الوسائط لجلسة غير موجودة… + رسالة مُتعدِّدة الوسائط مشفَّرة بطريقة غير صحيحة + تمَّ تشفير الرسالة مُتعدِّدة الوسائط لجلسة غير موجودة… كتم الإشعارات - المس للفتح. - سيجنال غير مقفل + انقرللفتح. + سيجنال غير مُقفَل اقفِل سيجنال أنت - صنف الوسائط غير مدعوم + نوع الوسائط غير مدعوم مسوَّدة - يحتاج سيجنال إلى إذن سعة التخزين من أجل استخدام الذاكرة الخارجية ولكن تم إيقاف الإذن على نحو دائم. الرجاء زيارة إعدادات التطبيق، واختيار\"الصلاحيات\"، ثم تفعيل \"سعة التخزين\". - لا يمكن الحفظ إلى الذاكرة الخارجية بدون أذونات - أَتريد حذف الرسالة؟ - هذا الإجراء سَيحذف الرسالة بشكل دائم. + يحتاج سيجنال إلى إذن الوصول إلى مساحة التخزين من أجل استخدام الذاكرة الخارجية، ولكن تمَّ إيقاف الإذن بشكلٍ دائم. يُرجى زيارة إعدادات التطبيق، وتحديد \"الصلاحيات\"، ثم تفعيل \"مساحة التخزين\". + لا يمكن الحفظ إلى الذاكرة الخارجية بدون أذونات. + أترغبُ بحذف الرسالة؟ + هذا الإجراء سَيحذف الرسالة بشكلٍ دائم. %1$s إلى %2$s أنت إلى %1$s %1$s إليك - هذه الوسيط لم يعد متاحا. + ملف الوسائط لم يعد مُتاحًا. - تعذّر تشغيل الوسائط. + تعذَّر تشغيل الوسائط. + خطأ في البحث عن الرسالة. - لم يعثر على تطبيق قادر على فتح هذا الملف. + لم يعثر على تطبيق قادر على مشاركة هذا الملف. إغلاق - خطأ في الوسائط + خطأ في ملف الوسائط - خطأ في حذف الرسالة، قد تكون الرسالة لا زالت متواجدة + خطأ في حذف الرسالة. قد تكون الرسالة لا زالت موجودة. - قراءة المزيد + اقرأ المزيد @@ -3136,8 +3145,8 @@ %1$d رسالة %1$d رسالتين %1$d رسائل - %1$d رسالة - %1$d رسالة + %1$d رسالةً + %1$d رسالةٍ @@ -3145,42 +3154,42 @@ %1$d دردشة %1$d دردشتين %1$d دردشات - %1$d دردشة - %1$d دردشة + %1$d دردشةً + %1$d دردشةٍ الأحدث من: %1$s - رسالة مقفلة - فشل توصيل الرسالة. + رسالة مُقفَلة + فشل في إرسال الرسالة. - تعذّر إرسال القصة + تعذَّر إرسال القصة - أنت إلى %1$s - فشل توصيل الرسالة. - خطأ بالارسال - إن توصيل الرسالة متوقف مؤقتا. - يُرجى التأكد قبل مواصلة التراسل في سيجنال. - وسم جميع الرسائل بأنها مقروءة - عُدَّها مقروءة - تعطيل هذه الإشعارات - صورة للعرض مرة واحدة - مقطع فيديو للعرض مرة واحدة - رَدّ + منك إلى %1$s + فشل في إرسال الرسالة. + خطأ في إرسال الرسالة. + إرسال الرسالة توقَّفَ مؤقَّتًا. + قُم بالتوثيق لمواصلة التراسل على سيجنال. + تحديد جميع الرسائل كمقروءة + تحديد كمقروءة + إيقاف هذه الإشعارات + صورة للعرض لمرة واحدة + مقطع فيديو للعرض لمرة واحدة + الرد ‫رسالة سيجنال - %1$s%2$s + %1$s %2$s جهة اتصال تفاعل %1$s مع: \"%2$s\". - تفاعل %1$s مع فيديوهاتك. + تفاعل %1$s مع مقطع الفيديو الخاص بك. تفاعل %1$s مع صورتك. - تفاعل %1$s مع صورتك الـ GIF. - تفاعل %1$s مع ملفك الخاص. - تفاعل %1$s مع تسجيلك الصوتي. - تفاعل %1$s مع وسائطك التي تُعرَض مرة واحدة. + تفاعل %1$s مع صورة GIF الخاصة بك. + تفاعل %1$s مع الملف الخاص بك. + تفاعل %1$s مع الملف الصوتي الخاص بك. + تفاعل %1$s مع ملف الوسائط لديك الذي يُعرَض لمرة واحدة. تفاعل %1$s مع عملية الدفع الخاصة بك. - تم تفاعل %1$s مع ملصقك الخاص. - تم حذف هذه الرسالة. + تفاعل %1$s مع الملصق الخاص بك. + تمَّ حذف هذه الرسالة. - تعطيل إشعارات انضمام شخص إلى سيجنال؟ تمكنك تفعيلها مجددا في سيجنال > الإعدادات > الإشعارات. + هل ترغبُ بإيقاف إشعارات انضمام شخص إلى سيجنال؟ يمكنك تفعيل الميزة مُجدَّدًا في سيجنال > الإعدادات > الإشعارات. @@ -3188,27 +3197,29 @@ لتلقي إشعارات بالرسائل الجديدة: - 1. انقر على \"إعدادات\" أسفله + 1. انقر على \"الإعدادات\" في الأسفل - 2. %1$s تفعيل الإشعارات + 2. %1$s قُم بتفعيل الإشعارات الإعدادات الرسائل المُكالمات + الأخطاء - النُسخ الإحتياطية + النُسخ الاحتياطية حالة القفل تحديثات التطبيق أخرى - المُحادثات - مجهول + الدردشات + غير معروف الملاحظات الصوتية انضمّت جهة الاتصال إلى سيجنال + لا وجود لأي نشاط متاح لفتح إعدادات قناة الإشعارات. - اتصال الخلفية + اتصال في الواجهة الخلفية حالة المكالمة @@ -3220,16 +3231,16 @@ الردود السريعة غير متاحة عند قفل سيجنال! - مشكلة في الإرسال! + مشكلة في إرسال الرسائل! - تم حفظ الوسائط + تمَّ حفظ الوسائط بحث البحث في الدردشات غير المقروءة - البحث عن الدردشات، جهات الاتصال، والرسائل + البحث عن الدردشات، وجهات الاتصال، والرسائل إغلاق @@ -3241,7 +3252,7 @@ سيجنال رسالة جديدة - طلب التراسُل + طلب مراسلة أنت %1$s • قصة @@ -3252,22 +3263,22 @@ خصوصية رقم الهاتف - لا تتم مُشاركة رقم هاتفك بعد الآن مع الدردشات. إذا تم حفظ رقم هاتفك في جهات اتصال صديق، فسَيظل مرئيًا بالنسبة له. + لا تتم مُشاركة رقم هاتفك بعد الآن مع الدردشات. إذا تمَّ حفظ رقم هاتفك في جهات الاتصال لصديق، فسَيظل مرئيًا بالنسبة له. أسماء المُستخدمين يُمكن للناس مراسلتك الآن باستخدام اسم المُستخدم الاختياري الخاص بك حتى لا تضطر إلى إعطاء رقم هاتفك. أسماء المُستخدمين ليست مرئية على حسابك الشخصي. - رموز أو رابط الاستجابة السريعة + روابط أو كودات الـ QR - أسماء المُستخدمين لها رمز ورابط استجابة سريعة فريدين يُمكنك مُشاركتُهما مع أصدقائك لكي يبدؤوا الدردشة معك في الآن. + أسماء المُستخدمين لها رابط وكود QR فريدين يُمكنك مُشاركتُهما مع أصدقائك لكي يبدؤوا الدردشة معك بسرعة. ليس الآن - إعداد اسم المستخدم + إعداد اسم المُستخدم - شغّل الفيديو + شغِّل الفيديو فيه تعليق @@ -3276,8 +3287,8 @@ %1$d عنصر %1$d عنصرين %1$d عناصر - %1$d عنصر - %1$d عنصر + %1$d عنصرًا + %1$d عنصرٍ جارٍ المعالجة… @@ -3289,49 +3300,49 @@ - هذا الجهاز لم يعد مسجلاً هذا على الأرجح بسبب قيامك بتسجيل رقم هاتفك على سيجنال في جهاز مختلف. + هذا الجهاز لم يَعُد مسجَّلًا.على الأغلب بسبب قيامك بتسجيل رقم هاتفك المُقترِن بسيجنال في جهازٍ مختلف. - أعد تسجيل الجهاز + أعِد تسجيل الجهاز - لقد تم تسجيل خروجك من تطبيق سيجنال على هذا الجهاز. + تمَّ تسجيل خروجك من تطبيق سيجنال على هذا الجهاز. - حدِّث تطبيق سيجنال للاستمرار في استخدام عمليات الدفع. قد لا يكون رصيدك مُحدثًا. + حدِّث تطبيق سيجنال للاستمرار في استخدام عمليات الدفع. قد لا يكون رصيدك مُحدَّثًا. - للإجابة على المكالمة، يجب عليك منح ترخيص الوصول إلى ميكروفونك. + للإجابة على المكالمة، اسمح لسيجنال بالوصول إلى الميكروفون على جهازك. - للرّد على مكالمة الفيديو، يُرجى منح Molly ترخيص الوصول إلى الميكروفون و الكاميرا على هاتفك. - يحتاج سيجنال إلى أذونات الميكروفون والكاميرا من أجل استقبال أو تلقّي المكالمات، ولكن الإذن لم يُمنح بشكل دائم. الرجاء زيارة إعدادات التطبيق، واختيار \"الأذونات\"، ثم تفعيل \"الميكروفون\" و\"الكاميرا\". - أجاب عبر جهاز مرتبط. - رُفض عبر جهاز مرتبط. - مشغول في جهاز مرتبط. + للردّ على مكالمة الفيديو، اسمح لسيجنال بالوصول إلى الميكروفون و الكاميرا على هاتفك. + يحتاج سيجنال إلى أذونات الوصول إلى الميكروفون والكاميرا من أجل استقبال أو إجراء المكالمات، ولكن الإذن تمَّ رفضه بشكلٍ دائم. يُرجى زيارة \"إعدادات التطبيق\"، واختيار \"الأذونات\"، ثم تفعيل \"الميكروفون\" و\"الكاميرا\". + تمَّت الإجابة عبر جهاز مُرتبِط. + تمَّ الرفض عبر جهاز مُرتبِط. + مشغول على جهاز مُرتبِط. - لقد نُقل زر تغيير الكاميرا إلى هنا، انقر على الفيديو الخاص بك لتُجرّبه. + نُقِلَ زر \"قلب الكاميرا\" إلى هنا. انقر على الفيديو لديك لتُجرِّبه. انضم شخص لهذه المكالمة برقم أمان مختلف. - يُرجى السحب لتغيير نمط العرض + يُرجى السحب للأعلى لتغيير نمط العرض رفض - أجب + إجابة أجب بدون فيديو - مخرج الصوت + مخرَج الصوت - سماعة أذن الهاتف + سماعة الأذن للهاتف - مكبر الصوت + مُكبِّر الصوت بلوتوث @@ -3353,9 +3364,9 @@ ادعُ إلى سيجنال مجموعة جديدة - تحديث قائمة الاتصال + تحديث جهات الاتصال - هل تفتقد إلى جهة اتصال؟ حاول التحديث من جديد + هل تفتقد إلى جهة اتصال؟ حاوِل التحديث من جديد اعثر على الأشخاص الذين تعرفهم على Signal @@ -3364,39 +3375,39 @@ المزيد - امسح النص الذي ادخلته + امسح النص الذي أدخلته إظهار لوحة المفاتيح إظهار لوحة الاتصال لا توجد جهات اتصال. - تحميل جهات الاتصال… + جارٍ تحميل جهات الاتصال… صورة جهة الاتصال - يحتاج سيجنال إلى أذن الوصول إلى جهات الاتصال من أجل عرضها لك، ولكن تم إيقاف الإذن على نحو دائم. الرجاء زيارة إعدادات التطبيق، اختيار \"الأذونات\"، ثم تفعيل \"جهات الاتصال\". - خطأ في جلب جهات الاتصال، يُرجى التحقق مِن اتصالك بالشبكة + يحتاج سيجنال إلى أذن الوصول إلى جهات الاتصال من أجل عرضها لك، ولكن تمَّ إيقاف الإذن بشكلٍ دائم. يُرجى زيارة إعدادات التطبيق، واختيار \"الأذونات\"، ثم تفعيل \"جهات الاتصال\". + خطأ في استرجاع جهات الاتصال. يُرجى التحقُّق مِن اتصالك بالشبكة. لم يتم العثور على اسم المُستخدم - "\"%1$s\" ليس مُستخدم لِسيجنال. يرجى التحقّق من اسم المُستخدم والمحاولة ثانية." - ليست بحاجة إلى إضافة نفسك للمجموعة + "\"%1$s\" ليس مُستخدم لِسيجنال. يُرجى التحقُّق من اسم المُستخدم والمحاولة مُجدَّدًا." + لستَ بحاجة إلى إضافة نفسك إلى المجموعة وصلت المجموعة إلى الحد الأقصى. - أقصى حد للأعضاء في مجموعات سيجنال هو %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 عضوٍ - العثور عبر رقم الهاتف + إيجاد بحسب رقم الهاتف - العثور عبر اسم المُستخدم + إيجاد بحسب اسم المُستخدم السماح بالوصول إلى جهات الاتصال @@ -3416,10 +3427,10 @@ %1$d عضو %1$d عضو - %1$d أعضاء + %1$d عضوان %1$d أعضاء - %1$d عضوا - %1$d عضو + %1$d عضوًا + %1$d عضوٍ @@ -3433,19 +3444,19 @@ ‫رسالة سيجنال - رسائل SMS غير مؤمّنة + رسالة قصيرة غير مؤمَّنة رسالة متعدّدة الوسائط غير مؤمنة SIM %1$d - أرسل + إرسال تحرير الرسالة تبديل لوحة مفاتيح الرموز التعبيرية - صورة للمرفق مُصغَّرة - فتح دُرج مرفقات الكاميرا - تسجيل وإرسال مرفق صوتي + صورة مُصغَّرة للملف المُرفَق + فتح دُرج مُرفَقات الكاميرا + تسجيل وإرسال مُرفَق صوتي - قفل التسجيل الصوتي - لم تُرسَل الرسالة، علبك التأكد من اتصالك بالانترنت ثم المحاولة مجددا. + قفل تسجيل المُرفَق الصوتي + لم تُرسَل الرسالة. عليك التأكُّد من اتصالك بالانترنت ثم المحاولة مُجدَّدًا. مرِّر للإلغاء @@ -3456,18 +3467,18 @@ رسالة آمنة - الإرسال فشل + فشل الإرسال في انتظار الموافقة - تم تسليم الرسالة - تمّت قراءة الرسالة + تمَّ التسليم + تمَّت قراءة الرسالة صورة جهة الاتصال - قيد التحميل - لمعرفة المزيد + جارٍ التحميل + اعرف المزيد الانضمام للمكالمة إعادة الاتصال @@ -3478,25 +3489,25 @@ تحديث جهة الاتصال حظر الطلب - لا وجود لمجموعات مشتركة. يُرجى مراجعة الطلبات بعناية. - لا وجود لجهات الاتصال في هذه المجموعة. يُرجى مراجعة الطلبات بعناية. + لا يوجود مجموعات مشتركة. يُرجى مراجعة الطلبات بعناية. + لا يوجود جهات اتصال في هذه المجموعة. يُرجى مراجعة الطلبات بعناية. إظهار - بعض ضبط المهلة، سوف تختفي رسائلك التي سوف يجري إرسالها بعد انقضاء %1$s. + سيتمُّ تعيين توقيت إخفاء الرسائل إلى %1$s عندما تقوم بمراسلته. - تبرّع + تبرَّع إرسال مدفوعات - تفعيل الدفوعات + تفعيل المدفوعات - لقد حذفت هذا الشخص، وبمراسلتك لهم سَتتم إضافتهم إلى قائمتك. + حذفتَ جهة الاتصال هذه، وبمراسلتك لها سَتتم إضافتها إلى قائمتك. الخيارات: تحديث التطبيق - شغّل … توقف + تشغيل … إيقاف مؤقَّت تنزيل @@ -3504,8 +3515,8 @@ فيديو صورة صورة متحركة - ملف متعدّد الوسائط لمشاهدة-واحدة - ملصق + ملف وسائط للعرض لمرّة واحدة + مُلصَق أنت لم يتم العثور على الرسالة الأصلية @@ -3515,18 +3526,18 @@ لم تعد متاحة - تقديم تبرّع لصديق + تقديم تبرُّع لصديق - النزول إلى الأسفل + انتقال إلى الأسفل - تُعد الفقاعات ميزة في أندرويد يمكنك تشغيلها أو تعطيلُها بالنسبة لدردشات سيجنال. + تُعد فقاعات المحادثات ميزة في أندرويد يمكنك تشغيلها أو إيقافها لدردشات سيجنال. ليس الآن - أطفىء + إيقاف تغيّرات رقم الأمان @@ -3536,31 +3547,31 @@ استئناف المكالمة مغادرة المكالمة ربما قام هؤلاء الأشخاص بإعادة تثبيت التطبيق أو قاموا بتغيير أجهزتهم. يُرجى تأكيد رقم الأمان معهم لضمان الخصوصية. - إظهار + عرض - سبق التحقق منه + سبق التحقُّق منه - لقد فُعلَت إشعارات المكالمات. + تمَّ تفعيل إشعارات المكالمات. تفعيل إشعارات المكالمات تفعيل نشاط الخلفية - يبدو أن كل شيء جيد الآن ! - لتلقي إشعارات المكالمات، يكفي اللمس هنا وتشغيل « إظهار الإشعارات ». - لتلقي إشعارات المكالمات، يُرجى اللمس هنا ثم تفعيل الإشعارات وبعدها التأكد من أن الأصوات والنوافذ المنبثقة مُفعَّلة. + يبدو أن كل شيء جيد الآن! + لتلقي إشعارات المكالمات، يكفي النقر هنا وتشغيل \"إظهار الإشعارات\". + لتلقي إشعارات المكالمات، يُرجى النقر هنا ثم تفعيل الإشعارات وبعدها التأكُّد من أن الأصوات والنوافذ المنبثقة مُفعَّلة. - لتلقي إشعارات المكالمات، يُرجى اللمس هنا ثم تفعيل أنشطة الخلفية في إعدادات البطارية. + لتلقي إشعارات المكالمات، يُرجى النقر هنا ثم تفعيل نشاط الخلفية في إعدادات \"البطارية\". الإعدادات - لتلقي إشعارات المكالمات، يكفي لمس « الإعدادات » ثم تفعيل « إظهار الإشعارات ». - لتلقي إشعارات المكالمات، يُرجى لمس « الإعدادات » ثم تفعيل الإشعارات وبعدها التأكد من أن الأصوات والنوافذ المنبثقة مُفعَّلة. - لتلقي إشعارات المكالمات، يُرجى لمس « الإعدادات » ثم تفعيل أنشطة الخلفية في إعدادات البطارية. + لتلقي إشعارات المكالمات، يكفي النقر على \"الإعدادات\" ثم تفعيل \"إظهار الإشعارات\". + لتلقي إشعارات المكالمات، يُرجى النقر على \"الإعدادات\" ثم تفعيل الإشعارات وبعدها التأكُّد من أن الأصوات والنوافذ المنبثقة مُفعَّلة. + لتلقي إشعارات المكالمات، يُرجى لمس \"الإعدادات\" ثم تفعيل أنشطة الخلفية في إعدادات \"البطارية\". - تحميل البلدان جارٍ … + جارٍ تحميل البلدان… بحث - لا توجد دولة مطابقة + لا توجد دول مطابقة - مسح رمز الاستجابة السريع المبين على الجهاز لربطه. + مسح كود الـ QR الظاهر على الجهاز لربطه. ربط الجهاز @@ -3599,8 +3610,8 @@ %1$d ساعة %1$d ساعتين %1$d ساعات - %1$d ساعات - %1$d ساعات + %1$d ساعةً + %1$d ساعةٍ %1$d ساعة @@ -3610,8 +3621,8 @@ %1$d يوم %1$d يومين %1$d أيام - %1$d أيام - %1$d أيام + %1$d يومًا + %1$d يومٍ %1$d يوم @@ -3621,25 +3632,25 @@ %1$d أسبوع %1$d أسبوعين %1$d أسابيع - %1$d أسابيع - %1$d أسابيع + %1$d أسبوعًا + %1$d أسبوعٍ %1$d أسبوع ‏%1$s‏%2$s‏ - رقم اﻷمان مع %1$s قد تغير ولم يعد التحقُّق السابق منه وافٍ. - التحقق من أرقام السلامة مع كل من %1$s و%2$s لم يعد واف بعد الآن. - أرقام السلامة مع كل من %1$s، %2$s، و%3$s قد تغيّيرت، والتحقّق غير وافٍ بعد الآن. + رقم اﻷمان مع %1$s قد تغيَّر ولم يعد التحقُّق السابق منه سارٍ. + لم يعد التحقُّق من أرقام الأمان مع كل من %1$s و%2$s سارٍ بعد الآن. + لم يعد التحقُّق من أرقام الأمان مع كل من %1$s، %2$s، و%3$s سارٍ بعد الآن. - لقد تغير رقم اﻷمان مع %1$s والتحقُّق السابق غير وافٍ، قد يعني هذا إما محاولة أحد ما اعتراض المحادثة أو ببساطة قيام %1$s بإعادة تثبيت سيجنال. - لقد تغير رقم اﻷمان مع كل من %1$s و%2$s، والتحقُّق السابق غير وافٍ، وهذا يعني إما محاولة أحدٍ اعتراض المحادثة أو ببساطة قيامهما بإعادة تثبيت سيجنال. - تم تغيير أرقام السلامة مع %1$s، %2$s، و%3$s، والتحقّق السابق غير وافٍ، وهذا يعني إما محاولة أحداً لاعتراض المحادثة أو ببساطة قيامهم بإعادة تثبيت سيجنال. + تغيَّر رقم اﻷمان مع %1$s والتحقُّق السابق غير سارٍ. قد يعني هذا إما محاولة شخص ما مقاطعة المحادثة أو ببساطة قيام %1$s بإعادة تثبيت سيجنال. + التحقُّق من رقم اﻷمان الخاص بك مع كل من %1$s و%2$s لم يعُد ساريًا. وهذا يعني إما محاولة شخص ما مقاطعة المحادثة أو ببساطة قيامه بإعادة تثبيت سيجنال. + لتحقُّق من رقم اﻷمان الخاص بك مع كل من %1$s، %2$s، و%3$s لم يعُد ساريًا، وهذا يعني إما محاولة شخص ما مقاطعة المحادثة أو ببساطة قيامه بإعادة تثبيت سيجنال. - لقد تغير رقم اﻷمان بينك وبين %1$s للتو. - لقد تغيرت أرقام السلامة للتو مع كل من%1$s و%2$s. - لقد تغيرت أرقام السلامة مع كل من %1$s و %2$s و %3$s للتو. + تغيَّر رقم اﻷمان بينك وبين %1$s الآن. + تغيَّرت أرقام الأمان الآن مع كل من %1$s و%2$s. + تغيَّرت أرقام الأمان مع كل من %1$s و %2$s و %3$s الآن. %1$d آخر @@ -3651,23 +3662,23 @@ - البحث عن الصور المتحركة + البحث في الصور المتحركة - لم نعثر على شيء + لم يظهر شيء عند البحث جارٍ التحميل - لا يوجد ملف متعدّد الوسائط + لا يوجد ملف وسائط - إظهار + عرض اعادة إرسال - لقد نُسخ ثم أُرسل مع التاريخ إلى الحافظة + تمَّ نسخ المخطَّط الزمني وإرساله إلى الحافظة ستظهر تحديثات قصتك هنا. @@ -3675,43 +3686,43 @@ %1$s انضموا إلى المجموعة. %1$s انضم إلى المجموعة. - %1$s انضموا إلى المجموعة. + %1$s انضما إلى المجموعة. %1$s انضموا إلى المجموعة. %1$s انضموا إلى المجموعة. %1$s انضموا إلى المجموعة. - أسم المجموعة الآن \'%1$s\'. + اسم المجموعة الآن هو \'%1$s\'. فتح القفل - يتطلب سيجنال إعدادات الرّسائل متعدّدة الوسائط من أجل تسليم الملفّات المتعدّدة الوسائط والمجموعات عبر مزوّد الخدمة اللاسلكيّة. جهارك لا يتيح هذه المعلومات، وهذا ما يحدث نادراً في الهواتف المقفولة أو ذات الإعدادات المقيدة. - من اجل إرسال وسائط متعددة ورسائل إلى مجموعات أضغط على \"تم\" وأكمل الإعدادات المطلوبة. يمكن العثور على إعدادات رسائل الوسائط المتعددة الخاصة بمشغل شبكة الجوال الخاصة بك بالبحث عن \"أسم المشغل APN\". سوف تحتاج إلى القيام بهذه الخطوة مرة واحدة. + يتطلب سيجنال إعدادات الرسائل متعددة الوسائط (MMS) من أجل تسليم الملفّات متعدّدة الوسائط ورسائل المجموعات عبر شركة الاتصالات اللاسلكية المُستخدَمة. جهازك لا يوفِّر هذه المعلومات، وهذا ما يحدث أحيانًا في الهواتف المقفولة أو ذات الإعدادات المُقيَّدة. + من اجل إرسال وسائط مُتعدِّدة ورسائل إلى مجموعات، اضغط على \"تم\" وأكمِل الإعدادات المطلوبة. يمكن العثور على إعدادات رسائل الوسائط المُتعدِّدة الخاصة بمُشغِّل شبكة الجوال الخاص بك بالبحث عن \"اسم المُشغِّل APN\". سوف تحتاج إلى القيام بهذه الخطوة مرّة واحدة. مشكل في التوصيل - لم يتمكن %1$s من توصيل رسالة نصية أو ملصقة أو رد فعل أو وصل القراءة إليك. يُحتمَل أنها أُرسلَت إليك مباشرة أو أنها قد أُرسلَت في مجموعة. - لم يتمكن %1$s من توصيل رسالة أو ملصق أو رد فعل أو وصل القراءة إليك. + لم يتمكَّن %1$s من توصيل رسالة نصية أو مُلصَق أو تفاعُل أو تأكيد بالقراءة إليك. يُحتمَل أنه أُرسلَها إليك مباشرةً أو أنهُ أرسلها في مجموعة. + لم يتم توصيل رسالة أو مُلصَق أو تفاعُل أو تأكيد بالقراءة إليك من %1$s. الاسم الأول (مطلوب) - الاسم الأخير (اختياري) + اسم العائلة (اختياري) التالي - أسماء وصور مجموعة MMS المخصصة ستكون مرئية لك فقط. - سوف تظهر أوصاف المجموعات لأعضائها وكذا الأفراد الذين دُعوا إليها. + أسماء وصور مجموعة MMS المُخصَّصة ستكون مرئية لك فقط. + سوف تظهر أوصاف المجموعات لأعضائها وكذلك للأفراد الذين تمَّت دعوتهم إليها. - حول - اكتب عدة كلمات عن نفسك…. + معلومات عامة + اكتب عدة كلمات عن نفسك… %1$d/%2$d - ما عليك إلا التحدث بكل حرية - مُعمَّى - كن لطيفا - من عشاق القهوة - مُتفرّغ للدردشة + تحدَّث بحرية + مُشفَّر + كُن لطيفًا + من عشَّاق القهوة + متوفِّر للدردشة أنا في استراحة - أعمل حاليا على شيء جديد + أعمل حاليًا على شيءٍ جديد تعديل المجموعة @@ -3733,23 +3744,23 @@ اسمك - الاسم الشخصي - الاسم العائلي (اختياري) + الاسم الأول + اسم العائلة (اختياري) حفظ - فشل الحفظ بسبب مشاكل في الشبكة. يُرجى المحاولة مرة أخرى لاحقا. + فشل الحفظ بسبب مشاكل في الشبكة. يُرجى المحاولة مرّة أُخرى لاحقًا. - الملفّات المتعدّدة الوسائط التي تّم مشاركتها + الملفّات المُتعدِّدة الوسائط المُشارَكة للتحقّق من أمان التشفير من الطرف للطرف مع %1$s، قارن الأرقام أعلاه بأجهزته. يُمكنه أيضًا مسح الرمز على جهازه. - المس للمسح - تم التوافُق بنجاح - لقد فشل التحقق من رقم الأمان - قيد التحميل… + انقر للمسح + مطابقة ناجحة + فشل التحقُّق من رقم الأمان + جارٍ التحميل… علِّم كمُتحقَّق منه محو التحقق @@ -4042,10 +4053,12 @@ ستُحذف جميع محفوظات الرسائل نهائيًا من كل الأجهزة. لا يُمكن التراجع عن هذا الإجراء. حذف الكل الآن + للأبد عام واحد 6 أشهر 30 يوما + لا شيء %1$s رسائل @@ -4074,6 +4087,7 @@ اظهار الرّنة حجم الخط في الرسائل + الأولوية استكشاف أخطاء الإشعارات @@ -4302,6 +4316,7 @@ قراءة عنوان المرسل إليه من الرمز المربع + الطلب دَفع الرصيد المتوفر : %1$s @@ -4437,6 +4452,7 @@ يمكنك تثبيت ما يصل إلى %1$d دردشات فقط + صورة جهة الاتصال الأرشيف @@ -4445,6 +4461,10 @@ دردشة جديدة فتح الكاميرا لا دردشات حتى الآن.\nابدأ عن طريق محادثة صديق. + + لا توجد أي دردشات للعرض + + إعدادات المجلد @@ -4709,6 +4729,7 @@ النسخ الاحتياطية للدردشات نقل الحساب نقل الحساب نحو جهاز أندرويد جديد + ادخل العبارة السرية الخاصة بالنسخ الاحتياطية استعادة لا يمكن استيراد نسخ احتياطية من إصدارات أحدث من سيجنال @@ -4916,6 +4937,7 @@ تعذر فتح إعدادات Wi-Fi. يُرجى تشغيل Wi-Fi يدويا. + منح إذن الوصول للموقع تشغيل خدمات الموقع شغِّل Wi-Fi @@ -5197,6 +5219,7 @@ مشاركة + أرسلْ ، %1$s @@ -5504,6 +5527,131 @@ لوحة المفاتيح أرسل بالضغط على إدخال + + مجلدات الدردشة + + إضافة مجلد دردشة + + + + نظّم دردشاتك في مجلدات وقُم بالتبديل بينها بسرعة في قائمة الدردشة. + + المجلدات + + إنشاء مجلد + + جميع الدردشات + + المجلدات المقترَحة + + الرسائل غير المقروءة + + الرسائل غير المقروءة من جميع الدردشات + + الدردشات الفردية + + فقط الرسائل من الدردشات المباشرة + + المجموعات + + فقط الرسائل من الدردشات الجماعية + + إضافة + + مجلد مُضَاف: %1$s. + + تعديل المجلد + + حذف المجلد + + إضافة مجلد جديد + + كتم الجميع + + إعادة ترتيب المجلدات + + اعتبار كل الرسائل مقروءة + + + %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$s\"؟ + + إنشاء مجلد + + تعديل المجلد + + حفظ + + هل تريد حفظ التغييرات؟ + + هل تريد حفظ التغييرات التي قمتَ بها في مجلد الدردشة هذا؟ + + حفظ التغييرات + + تجاهل + + حذف المجلد + + أترغبُ بحذف مجلد الدردشة هذا؟ + + + + أنواع الدردشات + + تم الرسائل @@ -5592,6 +5740,7 @@ جودة الوسائط + جودة الوسائط المرسلة إن إرسال وسائط بجودة عالية سوف يستخدم كما أكبر من البيانات. @@ -7856,15 +8005,15 @@ - Your backups subscription expired + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بحسابك. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بحسابك لأنه تعذّر تجديده بواسطة طريقة الدفع الحالية الخاصة بك. سَيتمُّ حذف الوسائط الموجودة في النسخة الاحتياطية الخاصة بك بعد %1$d أيام. + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بك لأنه تعذَّر تجديده بواسطة طريقة الدفع الحالية الخاصة بك. سَيتمُّ حذف الوسائط الموجودة في النسخة الاحتياطية الخاصة بك بعد %1$d يوم. + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بك لأنه تعذّر تجديده بواسطة طريقة الدفع الحالية الخاصة بك. سَيتمُّ حذف الوسائط الموجودة في النسخة الاحتياطية الخاصة بك بعد %1$d يومين. + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بك لأنه تعذّر تجديده بواسطة طريقة الدفع الحالية الخاصة بك. سَيتمُّ حذف الوسائط الموجودة في النسخة الاحتياطية الخاصة بك بعد %1$d أيام. + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بك لأنه تعذّر تجديده بواسطة طريقة الدفع الحالية الخاصة بك. سَيتمُّ حذف الوسائط الموجودة في النسخة الاحتياطية الخاصة بك بعد %1$d يومًا. + انتهت صلاحية اشتراك النسخ الاحتياطي الخاص بك لأنه تعذّر تجديده بواسطة طريقة الدفع الحالية الخاصة بك. سَيتمُّ حذف الوسائط الموجودة في النسخة الاحتياطية الخاصة بك بعد %1$d يومٍ. يُمكنك دفع ثمن النسخ الاحتياطية مرة أخرى في أي وقت لمواصلة نسخ جميع وسائطك الاحتياطية. @@ -7886,9 +8035,9 @@ إذا اخترت \"تخطي\" فسيتم حذف الوسائط في النسخ الاحتياطي الخاص بك في %1$d يوم. - Your backups subscription failed to renew + تعذَّر تجديد اشتراك النسخ الاحتياطي الخاص بحسابك. - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + تأكَّد من أن طريقة الدفع الخاصة بك مُحدَّثة. انقر على \"إدارة الاشتراك\"، ثم انقر على \"تحديث\" ضمن تبويب \"طرق الدفع\". تعذّر إكمال النسخ الاحتياطي @@ -7900,7 +8049,7 @@ إدارة الاشتراك - Subscribe for %1$s/month + اشترِك مقابل %1$s/شهريًا تنزيل الوسائط الآن @@ -7935,6 +8084,17 @@ %1$s من %2$s + + + إلغاء التنزيل + + يتم تنزيل: %1$s من %2$s (%3$s%%) + + لا توجد مساحة كافية لتنزيل النسخة الاحتياطية الخاصة بك. للمواصلة، قُم بتحرير %1$s من المساحة. + + تخطي التنزيل + + "تعذَّر إتمام عملية النسخ الاحتياطي الأخيرة. تأكَّد من أن هاتفك مُتصل بشبكة الواي فاي وانقر على \"إنشاء نسخة احتياطية الآن\" للمحاولة من جديد." @@ -7988,22 +8148,22 @@ لا يمكن استخدام ميزة تحسين التخزين إلا مع المستوى المدفوع لنسخ سيجنال الاحتياطية. يُرجى ترقية خطة نسخك الاحتياطية لتفعيل هذه الميزة. - Subscribe for %1$s/month + اشترِك مقابل %1$s/شهريًا - This media is no longer available + لم يعد ملف الوسائط هذا متوفِّرًا. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + يتضمن الاشتراك الحالي للنسخ الاحتياطي في حسابك على سيجنال الوسائط الخاصة بالأيام %1$d الماضية. + يتضمن الاشتراك الحالي للنسخ الاحتياطي في حسابك على سيجنال الوسائط الخاصة باليوم %1$d الماضي. + يتضمن الاشتراك الحالي للنسخ الاحتياطي في حسابك على سيجنال الوسائط الخاصة باليومين %1$d الماضيين. + يتضمن الاشتراك الحالي للنسخ الاحتياطي في حسابك على سيجنال الوسائط الخاصة بالأيام %1$d الماضية. + يتضمن الاشتراك الحالي للنسخ الاحتياطي في حسابك على سيجنال الوسائط الخاصة %1$d الماضية. + يتضمن الاشتراك الحالي للنسخ الاحتياطي في حسابك على سيجنال الوسائط الخاصة %1$d الماضية. - Subscribe for %1$s/month + اشترِك مقابل %1$s/شهريًا عملية الحذف تتم في تزامن عبر جميع أجهزتك الآن @@ -8046,11 +8206,13 @@ تم تغيير نوع النُسخ الاحتياطية وإلغاء الاشتراك - لقد أُلغي الاشتراك + أُلغيَ الاشتراك انتهى التنزيل سيتم إنشاء نسخة احتياطية خلال الليل. + + الاشتراك غير فعَّال خطة النسخ الاحتياطي @@ -8059,8 +8221,12 @@ %1$s/شهريًا خطة النسخ الاحتياطي الخاصة بك مجانية - + التجديد في %1$s + + تنتهي الصلاحية في %1$s + + انتهت الصلاحية في %1$s انسخ سجل رسائلك كي لا تفقد بياناتك أبدًا عندما تستخدم هاتفًا جديدًا أو تعيد تثبيت سيجنال. @@ -8105,6 +8271,10 @@ نسخ احتياطي يدوي يُرجى إدخال الرقم التعريفي الشخصي أو كلمة المرور أو نمط تعطيل كلمة المرور لجهازك. + + إعادة تفعيل النسخ الاحتياطية + + تمَّ إيقاف النسخ الاحتياطية وتمَّ حذف بياناتك من خدمة التخزين الآمنة لسيجنال. diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index e627779bc4..59ac4c7bc5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -365,6 +365,8 @@ Çatlar Mesajlar + + Çat növləri Mesaj %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Hazırsan. Artıq ehtiyat nüsxəni çıxarmağa başla. Ehtiyat nüsxə həcmindən asılı olaraq, bu, bir qədər uzun çəkə bilər. Ehtiyat nüsxə çıxarılarkən adi hallarda olduğu kimi telefonunuzdan istifadə edə bilərsiniz. @@ -1966,6 +1968,7 @@ %1$d+ nəfər dəvət edildi %1$d+ nəfər dəvət edildi + %1$d əlavə qrup %1$d əlavə qrup @@ -1992,6 +1995,7 @@ Cihaz tapılmadı. Şəbəkə xətası. Etibarsız QR kod. + Təəssüf ki, həddən çox cihazla əlaqə yaratdınız, bəzilərini çıxartmağa çalışın Təəssüf ki, cihaz əlaqələndirmək üçün etibarlı bir QR kodu deyil. Signal cihazı ilə əlaqə yaradılsın? @@ -2014,11 +2018,13 @@ Parolu təqdim edin Etibarsız parol! Molly-ın kilidini aç + Molly Android - Kilid Ekranı Xəritə + Sancaqla Ünvanı qəbul et @@ -2522,6 +2528,7 @@ Signal Mesajı + Daha çox @@ -2553,6 +2560,7 @@ Heç bir stiker quraşdırılmadı Gələn mesajlardan aldığınız stikerlər burada görünəcək Başlıqsız + Bilinmir @@ -2774,6 +2782,7 @@ Media artıq mövcud deyil. Media faylını açmaq mümkün olmadı. + Mesaj tapma xətası. Bu medianı paylaşmaq üçün bir tətbiq tapıla bilmir. Bağla @@ -2845,6 +2854,7 @@ Mesajlar Zənglər + Xətalar Nüsxələr Kilid statusu @@ -2854,6 +2864,7 @@ Bilinmir Səsli qeydlər Əlaqə Signal-a qoşuldu + Bildiriş kanalı tənzimləmələrini açmaq üçün mövcud bir fəaliyyət yoxdur Arxaplan bağlantısı @@ -3638,10 +3649,12 @@ Bütün mesaj tarixçəsi bütün cihazlardan həmişəlik silinəcək. Bu əməliyyat geri qaytarıla bilməz. Hamısını indi sil + Həmişəlik 1 il 6 ay 30 gün + Heç biri %1$s mesaj @@ -3666,6 +3679,7 @@ Göstər Zəng səsi Mesaj şrift ölçüsü + Üstünlük Nasazlıqların aradan qaldırılması bildirişi @@ -3894,6 +3908,7 @@ Alacaq şəxsin QR kod ünvanını skan edin + Tələb Ödə Mövcud balans: %1$s @@ -4025,6 +4040,7 @@ Yalnız %1$d çata qədər sancaqlaya bilərsiniz + Əlaqə fotosu Arxivləndi @@ -4033,6 +4049,10 @@ Yeni çat Kameranı aç Hələ ki, heç bir çat yoxdur.\nBir dostunuza mesaj göndərərək başlayın. + + Göstəriləcək çat yoxdur + + Qovluq parametrləri @@ -4265,6 +4285,7 @@ Çat nüsxələri Hesabı köçür Hesabınızı yeni bir Android cihazına köçürün + Nüsxə parolunu daxil edin Geri yüklə Signal-ın yeni versiyalarından nüsxələr idxal edilmir @@ -4472,6 +4493,7 @@ Wi-Fi tənzimləmələri açıla bilmir. Zəhmət olmasa \"Wi-Fi\"ı əllə işə salın. + Yerləşməyə müraciətə icazə verin Yerləşmə xidmətlərini işə sal \"Wi-Fi\"ı açın @@ -4725,6 +4747,7 @@ Paylaş + Göndər , %1$s @@ -5028,6 +5051,119 @@ Klaviatura \"Enter\"ə basaraq göndər + + Çat qovluqları + + Bir çat qovluğu əlavə et + + + + Çatlarınızı qovluqlara ayırın və çat siyahısında onlar arasında sürətli keçid edin. + + Qovluqlar + + Qovluq yarat + + Bütün çatlar + + Təqdim olunan qovluqlar + + Oxunmamışlar + + Bütün çatlardan oxunmamış mesajlar + + 1-ə 1 çatlar + + Yalnız birbaşa çatlardan olan mesajlar + + Qruplar + + Yalnız qrup çatlarından olan mesaj + + Əlavə et + + %1$s adlı qovluq əlavə edildi. + + Qovluğu redaktə et + + Qovluğu sil + + Yeni qovluq əlavə et + + Hamısının səsini bağla + + Qovluq sırasını dəyiş + + Hamısını oxundu olaraq işarələ + + + %1$d çat növü + %1$d çat növü + + + + %1$d çat + %1$d çat + + + + %1$d çat çıxarıldı + %1$d çat çıxarıldı + + + + + Qovluq yarat + + Qovluq adı (zəruri) + + Əhatə olunan çatlar + + Çatlar əlavə et + + Bu qovluqda görünməsini istədiyiniz çatları seçin. + + İstisnalar + + Çatları çıxar + + Bu qovluqda görünməsini istəmədiyiniz çatları seçin. + + Yalnız oxunmamış çatları göstər + + Aktivləşdirildikdə, bu qovluqda yalnız oxunmamış mesajları olan çatlar görünəcək. + + Səssiz edilmiş çatları daxil et + + Yarat + + Qovluq yaradılsın? + + \"%1$s\" adlı bir çat qovluğu yaratmaq istəyirsiniz? + + Qovluq yarat + + Qovluğu redaktə et + + Saxla + + Dəyişikliklər yaddaşda saxlansın? + + Bu çat qovluğunda etdiyiniz dəyişiklikləri yaddaşda saxlamaq istəyirsiniz? + + Dəyişiklikləri yaddaşda saxla + + Sil + + Qovluğu sil + + Bu çat qovluğu silinsin? + + + + Çat növləri + + Bitdi Mesajlar @@ -5112,6 +5248,7 @@ Media keyfiyyəti + Göndərilən media keyfiyyəti Yüksək keyfiyyətli media göndərərkən, daha çox verilənlər istifadə ediləcək. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Ehtiyat nüsxə abunəliyinin vaxtı bitdi - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Cari ödəniş metodunuzla yenilənə bilmədiyindən ehtiyat nüsxə planınızın vaxtı bitdi. %1$d gündən sonra ehtiyat nüsxəsnizdə olan media fayllarınız silinəcək. + Cari ödəniş metodunuzla yenilənə bilmədiyindən ehtiyat nüsxə planınızın vaxtı bitdi. %1$d gündən sonra ehtiyat nüsxənizdə olan media fayllarınız silinəcək. Bütün media fayllarınızın ehtiyat nüsxəsini çıxarmağa davam etmək üçün istənilən vaxt yenidən ehtiyat nüsxələr üçün ödəniş etməyə başlaya bilərsiniz. @@ -7254,9 +7391,9 @@ \"Ötür\" seçimini etsəniz ehtiyat nüsxənizdəki media faylı %1$d günə silinəcək. - Your backups subscription failed to renew + Ehtiyat nüsxə abunəliyinizi yeniləmək mümkün olmadı - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Ödəniş metodunuzun yeniləndiyindən əmin olmaq üçün yoxlayın. \"Abunəliyi idarə et\" seçib, \"Ödəniş metodları\" bölməsinin altında \"Yenilə\" seçiminə toxunun. Ehtiyat nüsxəni tamamlamaq mümkün olmadı @@ -7268,7 +7405,7 @@ Abunəliyi idarə et - Subscribe for %1$s/month + Aylıq %1$s məbləğinə abunə ol Media faylını indi endir @@ -7303,6 +7440,17 @@ %1$s /%2$s + + + Endirməni ləğv et + + Endirilir: %1$s / %2$s (%3$s%%) + + Ehtiyat nüsxənizi endirmək üçün kifayət qədər boş yer yoxdur. Davam etmək üçün %1$s yer boşaldın. + + Endirməni ötür + + "Son ehtiyat nüsxənizi tamamlamaq mümkün olmadı. Telefonunuzun Wi-Fi-a qoşulduğundan əmin olun və yenidən cəhd etmək üçün indi \"Ehtiyat nüsxə\" seçiminə toxunun." @@ -7356,18 +7504,18 @@ Yaddaş optimallaşdırması yalnız Signal ehtiyat nüsxələrinin ödənişli səviyyəsi ilə istifadə oluna bilər. Bu xüsusiyyətdən istifadə etməyə başlamaq üçün ehtiyat nüsxə planını yeniləşdirin. - Subscribe for %1$s/month + Aylıq %1$s məbləğinə abunə ol - This media is no longer available + Bu media faylı artıq mövcud deyil - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Cari Signal ehtiyat nüsxəsi planınız son %1$d günlük media fayllarını əhatə edir. Bütün media fayllarınızın ehtiyat nüsxəsini çıxarmaq üçün indi yeniləyin. + Cari Signal ehtiyat nüsxəsi planınız son %1$d günlük media fayllarını əhatə edir. Bütün media fayllarınızın ehtiyat nüsxəsini çıxarmaq üçün indi yeniləyin. - Subscribe for %1$s/month + Aylıq %1$s məbləğinə abunə ol Silmə funksiyası artıq bütün cihazlarınızla sinxronlaşdırılıb @@ -7415,6 +7563,8 @@ Endirmə tamamlandı Ehtiyat nüsxə gecə çıxarılacaq. + + Abunəlik qeyri-aktivdir Ehtiyat nüsxə planı @@ -7423,8 +7573,12 @@ %1$s/ay Ehtiyat nüsxə planınız pulsuzdur - + %1$s yenilənir + + %1$s tarixində vaxtı bitir + + %1$s tarixində vaxtı bitir Yeni telefon aldığınız və ya Molly-ı təkrar quraşdırdığınız zaman məlumatları itirməmək üçün mesaj tarixçəsinin ehtiyat nüsxəsini çıxarın. @@ -7469,6 +7623,10 @@ Əllə ehtiyat nüsxə çıxarmaq üçün Cihazın PIN kodunu, parolunu və ya qrafik şifrəsini daxil edin. + + Ehtiyat nüsxələrini yenidən aktivləşdir + + Ehtiyat nüsxələr deaktiv edilib və verilənləriniz Signal-ın təhlükəsiz saxlama xidmətindən silinib. diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index c5b88476bf..b8ae07ca49 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -365,6 +365,8 @@ Чатове Съобщения + + Видове чатове Съобщение %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Всичко е готово. Започнете резервното копиране сега. В зависимост от размера на вашето резервно копие това може да отнеме доста време. Докато резервното копиране се извършва, можете да използвате телефона си както обикновено. @@ -1966,6 +1968,7 @@ +%1$d поканен +%1$d поканени + %1$d допълнителна група %1$d допълнителни групи @@ -1992,6 +1995,7 @@ Не е открито устройство. Проблем с мобилната мрежа. Невалиден QR код. + За съжалние, имате твърде много свързани устройства, опитайте да премахнете някои от тях… За съжаление, това не е валидна QR връзка. Свързване със Signal устройство? @@ -2014,11 +2018,13 @@ Задай паролата Грешна парола! Отключи Molly + Molly Android - Заключен екран Карта + Пуснете пин Приемете адрес @@ -2522,6 +2528,7 @@ Съобщение в Signal + Още @@ -2553,6 +2560,7 @@ Няма инсталирани стикери Стикери от входящи съобщения ще се появяват тук Неозаглавен + Непознат @@ -2774,6 +2782,7 @@ Тази мултимедия вече не е налична. Неуспешно възпроизвеждане на мултимедия. + Грешка при намиране на съобщение. Не може да бъде намерено приложение, което да може да споделя тази мултимедия. Затвори @@ -2845,6 +2854,7 @@ Съобщения Обаждания + Грешки Архиви Статус на заключването @@ -2854,6 +2864,7 @@ Непознат Гласови бележки Един от контактите Ви се присъедини към Signal! + Няма налична активност за отваряне на настройките на канала за известия. Връзка във фонов режим @@ -3638,10 +3649,12 @@ Цялата история на съобщенията ще бъде изтрита перманентно. Това действие не може да бъде върнато назад. Изтриване на всички сега + Завинаги 1 година 6 месеца 30 дни + Нищо %1$s съобщение @@ -3666,6 +3679,7 @@ Показване Мелодия Размер на текста + Приоритет Известия за отстраняване на неизправности @@ -3894,6 +3908,7 @@ Сканирайте QR кода с адреса на получателя + Поискай Плати Наличен баланс: %1$s @@ -4025,6 +4040,7 @@ Можете да фиксирате само до %1$d чатове + Изображение на контакта Архивиран @@ -4033,6 +4049,10 @@ Нов чат Отвори Kамера Все още няма чатове.\nЗапочнете, като изпратите съобщение на някой приятел. + + Няма чатове за показване + + Настройки за папки @@ -4265,6 +4285,7 @@ Архив на чатовете Прехвърляне на акаунт Прехвърляне на акаунта на ново устройство с Android + Въведете парола за архивното копие Възстановяване Не може да се внасят архивни копия от по-нови версии @@ -4472,6 +4493,7 @@ Не успяхме да отворим настройките за Wi-Fi. Моля, включете Wi-Fi ръчно. + Ползволи да ползва местоположение Включи услуга за местоположение Включи Wi-Fi @@ -4725,6 +4747,7 @@ Споделяне + Изпращане , %1$s @@ -5028,6 +5051,119 @@ Клавиатура Изпратете с enter + + Папки за чат + + Добавяне на папка за чат + + + + Организирайте чатовете си в папки и бързо превключвайте между тях в списъка с чатове. + + Папки + + Създаване на папка + + Всички чатове + + Предложени папки + + Непрочетени + + Непрочетени съобщения от всички чатове + + Чатове 1:1 + + Само съобщения от директни чатове + + Групи + + Само съобщения от групови чатове + + Добавяне + + Папката „%1$s“ е добавена. + + Редактиране на папка + + Изтриване на папка + + Добавяне на нова папка + + Заглушаване на всички + + Пренареждане на папките + + Маркиране на всички като прочетени + + + %1$d вид чатове + %1$d вида чатове + + + + %1$d чат + %1$d чата + + + + %1$d изключен чат + %1$d изключени чата + + + + + Създаване на папка + + Име на папка (задължително) + + Включени чатове + + Добавяне на чатове + + Изберете чатовете, които искате да се показват в тази папка. + + Изключения + + Изключване на чатове + + Изберете чатовете, които не искате да се показват в тази папка. + + Показване само на непрочетените чатове + + Когато е активирано, в тази папка ще се показват само чатове с непрочетени съобщения. + + Включване на заглушените чатове + + Създаване + + Създаване на папка? + + Искате ли да създадете папката за чат „%1$s“? + + Създаване на папка + + Редактиране на папка + + Запазване + + Запазване на промените? + + Искате ли да запазите промените, направени по тази папка за чат? + + Запазване на промените + + Отхвърляне + + Изтриване на папка + + Изтриване на тази папка за чат? + + + + Видове чатове + + Готово Съобщения @@ -5112,6 +5248,7 @@ Качество на мултимедията + Качество на изпратената мултимедия Изпращането на висококачествени мултимедийни файлове ще използва повече данни. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Вашият абонамент за резервни копия е изтекъл - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Вашият план за резервно копиране е изтекъл, защото не можахме да го подновим с текущия ви начин на плащане. След %1$d ден мултимедията, съхранена във вашето резервно копие, ще бъде изтрита. + Вашият план за резервно копиране е изтекъл, защото не можахме да го подновим с текущия ви начин на плащане. След %1$d дни мултимедията, съхранена във вашето резервно копие, ще бъде изтрита. Можете да започнете отново да плащате за резервно копиране по всяко време, за да продължите да поддържате резервно копие на всичката ви мултимедия. @@ -7254,9 +7391,9 @@ Ако изберете „Пропускане“, мултимедията във вашето резервно копие ще бъде изтрита след %1$d дни. - Your backups subscription failed to renew + Вашият абонамент за резервни копия не успя да се поднови - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Уверете се, че начинът ви на плащане е актуален. Докоснете „Управление на абонамента“ и под „Начини на плащане“ докоснете „Актуализиране“. Неуспешно резервно копиране @@ -7268,7 +7405,7 @@ Управление на абонамента - Subscribe for %1$s/month + Абониране за %1$s/месец Изтегляне на мултимедията сега @@ -7303,6 +7440,17 @@ %1$s от %2$s + + + Отмяна на изтеглянето + + Изтегляне: %1$s от %2$s (%3$s%%) + + Недостатъчно място за изтегляне на вашето резервно копие. За да продължите, освободете %1$s пространство. + + Пропускане на изтеглянето + + "Последното ви резервно копиране не можа да бъде завършено. Уверете се, че телефонът ви е свързан към Wi-Fi и докоснете „Резервно копиране сега“, за да опитате отново." @@ -7356,18 +7504,18 @@ Оптимизацията на съхранението може да се използва само с платената версия на Signal Backups. Надградете плана ви за резервни копия сега, за да започнете да използвате тази функция. - Subscribe for %1$s/month + Абониране за %1$s/месец - This media is no longer available + Тази мултимедия вече не е налична - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Текущият ви план за резервни копия на Signal включва последния %1$d ден мултимедия. За да започне да се прави резервно копие на всичката ви мултимедия, надградете сега. + Текущият ви план за резервни копия на Signal включва последните %1$d дни мултимедия. За да започне да се прави резервно копие на всичката ви мултимедия, надградете сега. - Subscribe for %1$s/month + Абониране за %1$s/месец Изтриването вече е синхронизирано на всички ваши устройства @@ -7415,6 +7563,8 @@ Изтеглянето е завършено Резервното копие ще бъде създадено през нощта. + + Абонаментът е неактивен План за резервно копиране @@ -7423,8 +7573,12 @@ %1$s/месец Вашият резервен план е безплатен - + Подновява се на %1$s + + Изтича на %1$s + + Изтекъл на %1$s Създайте резервно копие на историята на съобщенията си, за да не изгубите данните, когато си вземете нов телефон или преинсталирате Molly. @@ -7469,6 +7623,10 @@ Ръчно резервно копиране Моля, въведете ПИН, парола или фигура за вашето устройство. + + Повторно активиране на резервното копиране + + Резервните копия са изключени и данните ви са изтрити от услугата за сигурно съхранение на Signal. diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 0f6994d260..d3ae018f43 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -365,6 +365,8 @@ চ্যাট ম্যাসেজ + + চ্যাটের ধরন %1$sটি বার্তা @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + আপনার সব প্রস্তুতি সম্পন্ন হয়েছে। এখনই আপনার ব্যাকআপ শুরু করুন। আপনার ব্যাকআপের আকারের উপর নির্ভর করে, এটি লম্বা সময় নিতে পারে। ব্যাকআপ নেওয়ার সময় আপনি স্বাভাবিক সময়ের মতই আপনার ফোন ব্যবহার করতে পারবেন। @@ -1966,6 +1968,7 @@ +%1$d আমন্ত্রিত + %1$d আমন্ত্রিত + %1$d টি অতিরিক্ত গ্রুপ %1$dটি অতিরিক্ত গ্রুপ @@ -1992,6 +1995,7 @@ কোনও ডিভাইস পাওয়া যায় নি। নেটওয়ার্ক ত্রুটি। অকার্যকর QR কোড। + দুঃখিত, ইতিমধ্যে আপনার সাথে সংযুক্ত অনেকগুলি ডিভাইস রয়েছে, কিছু সরানোর চেষ্টা করুন দুঃখিত, এটি কোনও বৈধ ডিভাইসের লিঙ্ক কিউআর কোড নয়। একটি Signal ডিভাইস লিঙ্ক করবেন? @@ -2014,11 +2018,13 @@ পাসফ্রেজ সাবমিট করুন অকার্যকর পাসফ্রেজ! Molly আনলক করুন + Molly অ্যান্ড্রয়েড - লক স্ক্রিন ম্যাপ + ড্রপ পিন ঠিকানাটি মানছি @@ -2522,6 +2528,7 @@ Signal বার্তা + আরও @@ -2553,6 +2560,7 @@ কোনো স্টিকার ইনস্টল করা নেই আগত বার্তাগুলির স্টিকারসমূহ এখানে দেখা যাবে নামহীন + অজানা @@ -2774,6 +2782,7 @@ মিডিয়াটি আর উপলভ্য নেই। মিডিয়াটি চালানো যায়নি। + ম্যাসেজটি খুঁজে পেতে ত্রুটি হয়েছে। এই মিডিয়া শেয়ার করার জন্য কোনও অ্যাপ পাওয়া যায়নি। বন্ধ @@ -2845,6 +2854,7 @@ বার্তাসমূহ কল সমূহ + ব্যর্থতাসমূহ ব্যাকআপ সমূহ লক্ অবস্থা @@ -2854,6 +2864,7 @@ অজানা ভয়েস নোট পরিচিতি Signal এ যোগ দিয়েছে + নোটিফিকেশন চ্যানেল সেটিংস খোলার কোন কার্যকলাপ উপলভ্য নেই। ব্যাকগ্রাউন্ড সংযোগ @@ -3638,10 +3649,12 @@ সকল মেসেজের ইতিহাস স্থায়ীভাবে সকল ডিভাইস থেকে মুছে ফেলা হবে। এই কার্যক্রমটি পূর্বাবস্থায় ফেরানো যাবে না। এখনই সব মুছে ফেলুন + চিরতরে ১ বছর ৬ মাস ৩০ দিন + কিছুই না %1$sটি ম্যাসেজ @@ -3666,6 +3679,7 @@ দেখান রিংটোন বার্তার হরফের আকার + অগ্রাধিকার বিজ্ঞপ্তিজনিত সমস্যার সমাধান @@ -3894,6 +3908,7 @@ প্রদানকারীর ঠিকানা কিউআর কোডটি স্ক্যান করুন + অনুরোধ প্রদান করুন পর্যাপ্ত অর্থ: %1$s @@ -4025,6 +4040,7 @@ আপনি শুধু %1$dটি চ্যাট পিন করতে পারবেন + পরিচিতির ফটো ইমেজ আর্কাইভ করা @@ -4033,6 +4049,10 @@ নতুন চ্যাট ক্যামেরা চালু করুন এখনো কোনো চ্যাট নেই।\nবন্ধুকে ম্যাসেজ পাঠিয়ে শুরু করুন। + + দেখানোর মতো কোনো চ্যাট নেই + + ফোল্ডার সেটিংস @@ -4265,6 +4285,7 @@ চ্যাট ব্যাকআপ অ্যাকাউন্ট স্থানান্তর করুন একটি নতুন অ্যান্ড্রয়েড ডিভাইসে অ্যাকাউন্ট স্থানান্তর করুন + ব্যাকঅাপ পাসফ্রেজ প্রবেশ করান পুনরুদ্ধার Signal-এর নতুন সংস্করণ থেকে ব্যাকআপ ইম্পোর্ট সম্ভব নয় @@ -4472,6 +4493,7 @@ ওয়াইফাই সেটিংস খুলতে অক্ষম। ম্যানুয়ালি ওয়াইফাই চালু করুন। + লোকেশন অনুমতি দিন লোকেশন পরিষেবা চালু করুন ওয়াই-ফাই চালু করুন @@ -4725,6 +4747,7 @@ শেয়ার করুন + পাঠান , %1$s @@ -5028,6 +5051,119 @@ কীবোর্ড এন্টার দিয়ে পাঠান + + চ্যাট ফোল্ডার + + একটি চ্যাট ফোল্ডার যোগ করুন + + + + ফোল্ডারগুলোতে আপনার চ্যাট সাজান এবং আপনার চ্যাট তালিকায় দ্রুত সেগুলোর মধ্যে সুইচ করুন। + + ফোল্ডার + + একটি ফোল্ডার তৈরি করুন + + সকল চ্যাট + + সুপারিশৃত ফোল্ডারসমূহ + + অপঠিত + + সকল চ্যাট থেকে অপঠিত মেসেজ + + 1:1 চ্যাট + + শুধুমাত্র সরাসরি চ্যাট থেকে আসা মেসেজ + + গ্রুপসমূহ + + শুধুমাত্র গ্রুপ চ্যাট থেকে আসা মেসেজ + + যোগ করুন + + %1$s ফোল্ডার যোগ করা হয়েছে। + + ফোল্ডার এডিট করুন + + ফোল্ডার মুছে ফেলুন + + নতুন ফোল্ডার যোগ করুন + + সব মিউট করুন + + ফোল্ডার পুনরায় সাজান + + সমস্ত পড়া হয়েছে চিহ্নিত করুন + + + %1$d চ্যাটের ধরন + %1$d চ্যাটের ধরন + + + + %1$dটি চ্যাট + %1$dটি চ্যাট + + + + %1$d চ্যাট বাদ দেওয়া হয়েছে + %1$d চ্যাট বাদ দেওয়া হয়েছে + + + + + একটি ফোল্ডার তৈরি করুন + + ফোল্ডারের নাম (আবশ্যক) + + চ্যাট অন্তর্ভুক্ত + + চ্যাট যোগ করুন + + আপনি এই ফোল্ডারে যেসব চ্যাট দেখতে চান সেগুলো বেছে নিন। + + প্রত্যাশা + + চ্যাট বাদ দিন + + আপনি এই ফোল্ডারে দেখতে চান না এমন চ্যাট বেছে নিন। + + শুধুমাত্র অপঠিত চ্যাট দেখান + + যখন সক্রিয় করা হয়, তখন শুধুমাত্র অপঠিত মেসেজ সহ চ্যাট এই ফোল্ডারে দেখানো হবে। + + মিউট করা চ্যাট অন্তর্ভুক্ত করুন + + তৈরি + + ফোল্ডার তৈরি করবেন? + + আপনি কি চ্যাট ফোল্ডার \"%1$s\" তৈরি করতে চান? + + ফোল্ডার তৈরি করুন + + ফোল্ডার এডিট করুন + + সেভ করুন + + পরিবর্তন সেভ করবেন? + + আপনি কি এই চ্যাট ফোল্ডারে করা পরিবর্তন সেভ করতে চান? + + পরিবর্তন সেভ করুন + + বাতিল করুন + + ফোল্ডার মুছে ফেলুন + + এই চ্যাট ফোল্ডারটি মুছে ফেলবেন? + + + + চ্যাটের ধরন + + সম্পন্ন হয়েছে বার্তাসমূহ @@ -5112,6 +5248,7 @@ মিডিয়ার মান + পাঠানো মিডিয়ার মান উচ্চ মানের মিডিয়া প্রেরণে আরও ডেটা ব্যবহার হবে। @@ -7232,11 +7369,11 @@ - Your backups subscription expired + আপনার ব্যাকআপ সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেছে - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + আপনার ব্যাকআপ প্ল্যানের মেয়াদ শেষ হয়ে গেছে, কারণ এটি আপনার বর্তমান পেমেন্টের পদ্ধতি অনুসারে নবায়ন করা যায়নি। %1$d দিন পর আপনার ব্যাকআপের মিডিয়া মুছে ফেলা হবে। + আপনার ব্যাকআপ প্ল্যানের মেয়াদ শেষ হয়ে গেছে, কারণ এটি আপনার বর্তমান পেমেন্টের পদ্ধতি অনুসারে নবায়ন করা যায়নি। %1$d দিন পর আপনার ব্যাকআপের মিডিয়া মুছে ফেলা হবে। আপনার সকল মিডিয়ার ব্যাকআপ নেওয়া চালিয়ে যেতে আপনি যেকোনো সময় আবার ব্যাকআপের জন্য পেমেন্ট শুরু করতে পারেন। @@ -7254,9 +7391,9 @@ আপনি যদি \"এড়িয়ে যান\" নির্বাচন করেন, তাহলে আপনার ব্যাকআপে থাকা মিডিয়া %1$d দিনের মধ্যে মুছে যাবে। - Your backups subscription failed to renew + আপনার ব্যাকআপ সাবস্ক্রিপশন নবায়ন ব্যর্থ হয়েছে - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + আপনার পেমেন্ট পদ্ধতি হালনাগাদ কিনা তা নিশ্চিত করতে পরীক্ষা করুন। সাবস্ক্রিপশন নিয়ন্ত্রণ করতে ট্যাপ করুন এবং পেমেন্ট পদ্ধতির অধীনে \'আপডেট করুন\'এ ট্যাপ করুন। ব্যাকআপ সম্পন্ন করা যায়নি @@ -7268,7 +7405,7 @@ সাবস্ক্রিপশন ব্যবহার করুন - Subscribe for %1$s/month + %1$s/মাসের জন্য সাবস্ক্রাইব করুন এখনই মিডিয়া ডাউনলোড করুন @@ -7303,6 +7440,17 @@ %1$s এর %2$s + + + ডাউনলোড বাতিল করুন + + ডাউনলোড হচ্ছে: %2$s-এর মধ্যে %1$s (%3$s%%) + + আপনার ব্যাকআপ ডাউনলোড করার জন্য পর্যাপ্ত জায়গা নেই। এগিয়ে যেতে %1$s জায়গা খালি করুন। + + ডাউনলোড এড়িয়ে যান + + "আপনার শেষ ব্যাকআপ সম্পন্ন করা যায়নি। আপনার ফোন ওয়াইফাই-এর সাথে সংযুক্ত আছে কিনা তা নিশ্চিত করুন এবং আবার চেষ্টা করতে এখনই ব্যাক আপ ট্যাপ করুন।" @@ -7356,18 +7504,18 @@ স্টোরেজ অপ্টিমাইজেশন শুধুমাত্র Signal ব্যাকআপের পেইড টায়ারের ক্ষেত্রে ব্যবহার করা যেতে পারে। এই ফিচারটি ব্যবহার শুরু করতে আপনার ব্যাকআপ প্ল্যান আপগ্রেড করুন। - Subscribe for %1$s/month + %1$s/মাসের জন্য সাবস্ক্রাইব করুন - This media is no longer available + এই মিডিয়াটি আর নেই - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + আপনার বর্তমান Signal ব্যাকআপ প্ল্যানে আপনার সাম্প্রতিক %1$d দিনের মিডিয়া অন্তর্ভুক্ত রয়েছে। আপনার সকল মিডিয়া ব্যাকআপ নেওয়া শুরু করতে, এখনই আপগ্রেড করুন। + আপনার বর্তমান Signal ব্যাকআপ প্ল্যানে আপনার সাম্প্রতিক %1$d দিনের মিডিয়া অন্তর্ভুক্ত রয়েছে। আপনার সকল মিডিয়া ব্যাকআপ নেওয়া শুরু করতে, এখনই আপগ্রেড করুন। - Subscribe for %1$s/month + %1$s/মাসের জন্য সাবস্ক্রাইব করুন মুছে ফেলার বিষয়টি এখন আপনার সকল ডিভাইস জুড়ে সিঙ্ক করা হয়েছে @@ -7410,11 +7558,13 @@ ব্যাকআপের ধরন পরিবর্তিত হয়েছে এবং সাবস্ক্রিপশন বাতিল করা হয়েছে - সদস্যতা বাতিল করা হয়েছে + সাবস্ক্রিপশন বাতিল করা হয়েছে ডাউনলোড সম্পন্ন হয়েছে রাতের বেলা ব্যাকআপ তৈরি করা হবে। + + সাবস্ক্রিপশন নিষ্ক্রিয় অবস্থায় আছে ব্যাকআপ প্ল্যান @@ -7423,8 +7573,12 @@ %1$s/মাস আপনার ব্যাকআপ প্ল্যান ফ্রি - + %1$s নবায়ন করছে + + %1$s তারিখে মেয়াদ শেষ হবে + + %1$s তারিখে মেয়াদ শেষ হবে আপনার মেসেজের ইতিহাসের ব্যাকআপ নিন, যাতে আপনি যখন কোনো নতুন ফোন ব্যবহার করা শুরু করবেন বা Molly পুনরায় ইনস্টল করবেন তখন আপনি কখনোই ডেটা হারাবেন না। @@ -7469,6 +7623,10 @@ ম্যানুয়ালি ব্যাকআপ অনুগ্রহ করে আপনার ডিভাইসের পিন, পাসওয়ার্ড বা প্যাটার্ন লিখুন। + + ব্যাকআপ পুনরায় সচল করুন + + ব্যাকআপ বন্ধ করা হয়েছে এবং আপনার ডেটা Signal-এর সুরক্ষিত স্টোরেজ সার্ভিস থেকে মুছে ফেলা হয়েছে। diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 8560319fa3..c774d4f7c8 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -371,6 +371,8 @@ Chatovi Poruke + + Vrste chata Poruka %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Sve je spremno. Pokrenite kreiranje sigurnosne kopije sada. Ovisno o veličini vaše sigurnosne kopije, ovo može potrajati. Možete koristiti svoj telefon kao i obično dok se kreira sigurnosna kopija. @@ -2088,6 +2090,7 @@ Pozvano je više od %1$d Pozvano je više od %1$d + %1$d dodatna grupa %1$d dodatne grupe @@ -2116,6 +2119,7 @@ Nijedan uređaj nije pronađen. Greška u mreži. Nevažeći QR kōd. + Povezali ste previše uređaja, molimo pokušajte ukloniti neke od njih Ovo nije ispravan QR kōd za povezivanje uređaja. Povezati Signal uređaj? @@ -2140,11 +2144,13 @@ Unesite lozinku Pogrešna lozinka! Otključajte Molly + Molly Android – Zaključan ekran Karta + Stavite pribadaču Prihvati adresu @@ -2692,6 +2698,7 @@ Signal poruka + Više @@ -2723,6 +2730,7 @@ Nema instaliranih naljepnica Naljepnice iz primljenih poruka bit će prikazane ovdje Bez naziva + Nepoznato @@ -2946,6 +2954,7 @@ Datoteka više nije dostupna. Nije moguće reproducirati medijski sadržaj. + Greška pri pronalaženju poruke. Nije pronađena aplikacija koja može podijeliti ovu datoteku. Zatvori @@ -3021,6 +3030,7 @@ Poruke Pozivi + Greške Rezervne kopije Status zaključavanja @@ -3030,6 +3040,7 @@ Nepoznato Glasovne bilješke Kontakt je počeo koristiti Signal + Nema aktivnosti za otvaranje postavki obavještenjā. Konekcija u pozadini @@ -3840,10 +3851,12 @@ Sva historija poruka će biti trajno uklonjena sa svih uređaja. Ova radnja ne može se poništiti. Izbriši sve odmah + Zauvijek 1 godinu 6 mjeseci 30 dana + Neograničeno %1$s poruka @@ -3870,6 +3883,7 @@ Prikaži Zvono Veličina slova u poruci + Prioritet Rješavanje problema s obavijestima @@ -4098,6 +4112,7 @@ Skeniraj QR kōd za adresu osobe koja uplaćuje + Zahtjev Plati Raspoloživo: %1$s @@ -4231,6 +4246,7 @@ Možete zakačiti najviše sljedeći broj chatova: %1$d + Slika kontakta Arhivirano @@ -4239,6 +4255,10 @@ Novi chat Pokreni kameru Još nema chatova.\nZapočnite slanjem poruke prijatelju. + + Nema chatova za prikaz + + Postavke foldera @@ -4487,6 +4507,7 @@ Rezervne kopije chata Prenesi račun Prenesite račun na novi Android uređaj + Unesite lozinku za rezervne kopije Vrati Ne mogu se preuzeti sig. kopije u novoj verziji Signala @@ -4694,6 +4715,7 @@ Nije moguće otvoriti Wi-Fi podešavanja. Molimo, ručno aktivirajte Wi-Fi. + Dopustite pristup lokaciji Aktiviraj lokaciju telefona Uključi Wi-Fi @@ -4961,6 +4983,7 @@ Dijeli + Šalji , %1$s @@ -5266,6 +5289,125 @@ Tastatura Pošaljite sa Enter + + Folderi chata + + Dodaj folder chata + + + + Organizirajte razgovore u foldere i brzo prelazite između njih na svojoj listi za chatove. + + Folderi + + Kreiraj folder + + Svi chatovi + + Predloženi folderi + + Nepročitano + + Nepročitane poruke sa svih chatova + + Chatovi 1:1 + + Samo poruke iz direktnih chatova + + Grupe + + Samo poruke iz grupnih chatova + + Dodaj + + Dodano foldera: %1$s. + + Uredi folder + + Izbriši folder + + Dodaj novi folder + + Isključi zvuk za sve + + Promijeni redoslijed foldera + + Sve označi kao pročitano + + + %1$d vrsta chata + %1$d vrste chata + %1$d vrsta chata + %1$d vrsta chata + + + + %1$d chat + %1$d chata + %1$d chatova + %1$d chatova + + + + %1$d chat je izuzet + %1$d chata su izuzeta + %1$d chatova je izuzeto + %1$d chatova je izuzeto + + + + + Kreiraj folder + + Naziv foldera (obavezno) + + Uključeni chatovi + + Dodaj chatove + + Odaberite razgovore koji želite da se pojavljuju u ovom folderu. + + Izuzeci + + Isključi chatove + + Odaberite chatove za koje ne želite da se pojavljuju u ovom folderu. + + Prikaži samo nepročitane chatove + + Kada je omogućeno, u ovom folderu će biti prikazani samo razgovori sa nepročitanim porukama. + + Uključite chatove sa isključenim zvukom + + Kreiraj + + Kreirati folder? + + Želite li kreirati folder za chat \"%1$s\"? + + Kreiraj folder + + Uredi folder + + Pohrani + + Sačuvati promjene? + + Želite li sačuvati promjene koje ste napravili u ovom folderu za chat? + + Sačuvaj promjene + + Poništi + + Izbriši folder + + Izbrisati ovaj folder za chat? + + + + Vrste chata + + U redu Poruke @@ -5352,6 +5494,7 @@ Kvalitet zapisa + Kvalitet poslatih zapisa Slanje visokokvalitetnih zapisa kreirat će veći protok. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Vaša pretplata na sigurnosnu kopiju je istekla - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Vaš plan sigurnosne kopije je istekao jer se nije mogao obnoviti vašim trenutnim načinom plaćanja. Nakon %1$d dan, mediji u vašoj sigurnosnoj kopiji će biti izbrisani. + Vaš plan sigurnosne kopije je istekao jer se nije mogao obnoviti vašim trenutnim načinom plaćanja. Nakon %1$d dana, mediji u vašoj sigurnosnoj kopiji će biti izbrisani. + Vaš plan sigurnosne kopije je istekao jer se nije mogao obnoviti vašim trenutnim načinom plaćanja. Nakon %1$d dana, mediji u vašoj sigurnosnoj kopiji će biti izbrisani. + Vaš plan sigurnosne kopije je istekao jer se nije mogao obnoviti vašim trenutnim načinom plaćanja. Nakon %1$d dana, mediji u vašoj sigurnosnoj kopiji će biti izbrisani. Možete ponovo početi plaćati sigurnosne kopije u bilo kojem trenutku kako biste nastavili s kreiranjem sigurnosnih kopija svih svojih medija. @@ -7570,9 +7713,9 @@ Ako odaberete \"Preskoči\", medij u vašoj sigurnosnoj kopiji će biti izbrisan za %1$d dana. - Your backups subscription failed to renew + Vaša pretplata na sigurnosne kopije nije obnovljena - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Provjerite je li vaš način plaćanja ažuriran. Dodirnite Upravljanje pretplatom i pod Načini plaćanja dodirnite Ažuriraj. Nije moguće završiti kreiranje sigurnosne kopije @@ -7584,7 +7727,7 @@ Upravljaj pretplatom - Subscribe for %1$s/month + Pretplatite se za %1$s mjesečno Preuzmite medije sada @@ -7619,6 +7762,17 @@ %1$s od %2$s + + + Otkaži preuzimanje + + Preuzimanje: %1$s od %2$s (%3$s%%) + + Nema dovoljno prostora za preuzimanje vaše sigurnosne kopije. Da nastavite oslobodite %1$s prostora. + + Preskoči preuzimanje + + "Vaša posljednja sigurnosna kopija nije mogla biti dovršena. Provjerite je li vaš telefon povezan na Wi-F i dodirnite Kreiraj sigurnosnu kopiju sada da pokušate ponovo." @@ -7672,20 +7826,20 @@ Optimizacija pohrane može se koristiti samo s plaćenim nivoom sigurnosnih kopija Signala. Nadogradite svoj plan rezervne kopije da počnete koristiti ovu značajku. - Subscribe for %1$s/month + Pretplatite se za %1$s mjesečno - This media is no longer available + Ovaj medij više nije dostupan - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Vaš trenutni paket sigurnosne kopije Signala uključuje vaš posljednji %1$d dan medija. Da započnete kreiranje rezervnih kopija svih svojih medija, nadogradite sada. + Vaš trenutni paket sigurnosne kopije Signala uključuje vaš posljednji %1$d dana medija. Da započnete kreiranje rezervnih kopija svih svojih medija, nadogradite sada. + Vaš trenutni paket sigurnosne kopije Signala uključuje vaš posljednji %1$d dana medija. Da započnete kreiranje rezervnih kopija svih svojih medija, nadogradite sada. + Vaš trenutni paket sigurnosne kopije Signala uključuje vaš posljednji %1$d dana medija. Da započnete kreiranje rezervnih kopija svih svojih medija, nadogradite sada. - Subscribe for %1$s/month + Pretplatite se za %1$s mjesečno Brisanje je sada sinhronizirano na svim vašim uređajima @@ -7733,6 +7887,8 @@ Preuzimanje je završeno Sigurnosna kopija će biti kreirana tokom noći. + + Pretplata je neaktivna Paket rezervne kopije @@ -7741,8 +7897,12 @@ %1$s/mjesečno Vaš paket rezervne kopije je besplatan - + Obnavlja se %1$s + + Ističe %1$s + + Isteklo %1$s Kreirajte sigurnosnu kopiju historije poruka da nikada ne izgubite podatke kada nabavite novi telefon ili ponovo instalirate Molly. @@ -7787,6 +7947,10 @@ Ručno kreiranje sigurnosne kopije Unesite PIN za svoj uređaj, lozinku ili uzorak. + + Ponovo omogućite sigurnosne kopije + + Sigurnosne kopije su isključene i vaši podaci su izbrisani iz Signalove usluge sigurnog pohranjivanja. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 00305a582f..486e4653c2 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -365,6 +365,8 @@ Xats Missatges + + Tipus de xat Missatge %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Tot a punt! Ja pots iniciar la teva còpia de seguretat. Depenent de la mida de la teva còpia de seguretat, això pot trigar força estona. Mentre es fa la còpia de seguretat, podràs continuar utilitzant el teu telèfon com de costum. @@ -1966,6 +1968,7 @@ +%1$d convidat +%1$d convidats + %1$d grup addicional %1$d grups addicionals @@ -1992,6 +1995,7 @@ No es troba cap dispositiu. Error de xarxa. Codi QR no vàlid. + Teniu massa dispositius enllaçats, proveu de suprimir-ne algun. Això no és un codi QR amb enllaç vàlid. Voleu enllaçar un dispositiu de Signal? @@ -2014,11 +2018,13 @@ Envia la contrasenya Contrasenya incorrecta! Desbloca el Molly + Molly Android - Bloca la pantalla Mapa + Marqueu el lloc Accepta l\'adreça @@ -2522,6 +2528,7 @@ Missatge del Signal + Més @@ -2553,6 +2560,7 @@ No hi ha adhesius instal·lats. Els adhesius dels missatges d\'entrada apareixeran aquí. Sense títol + Desconegut @@ -2774,6 +2782,7 @@ El contingut ja no està disponible. No s\'ha pogut reproduir l\'arxiu. + Error trobant el missatge. No es pot trobar cap aplicació que pugui compartir aquest contingut. Tanca @@ -2845,6 +2854,7 @@ Missatges Trucades + Fallades Còpies de seguretat Estat del bloqueig @@ -2854,6 +2864,7 @@ Desconegut Notes de veu El contacte s\'ha afegit al Signal. + No hi ha activitat disponible per obrir la configuració del canal de notificacions. Connexió en segon pla @@ -3638,10 +3649,12 @@ S\'esborrarà permanentment tot l\'historial de missatges de tots els dispositius. Aquesta acció no es pot desfer. Esborrar-ho tot ara + Per sempre 1 any 6 mesos 30 dies + Cap %1$s missatge @@ -3666,6 +3679,7 @@ Mostra To de trucada Mida de la lletra dels missatges + Prioritat Resolució de problemes de les notificacions @@ -3894,6 +3908,7 @@ Escaneja el codi QR de l\'adreça del beneficiari + Sol·licitud Paga Saldo disponible: %1$s @@ -4025,6 +4040,7 @@ Només podeu fixar fins a %1$d xats. + Fotografia del contacte Arxivat @@ -4033,6 +4049,10 @@ Nou xat Obre la càmera Encara no tens cap xat.\nComença enviant un missatge a algú. + + No hi ha xats per mostrar + + Ajustos de la carpeta @@ -4265,6 +4285,7 @@ Còpies de seguretat de xats Transfereix el compte Transfereix el compte a un dispositiu d\'Android nou + Escriviu la contrasenya de la còpia de seguretat. Restaura No es pot importar backup de versions noves de Signal @@ -4472,6 +4493,7 @@ No es pot obrir la configuració de la Wi-Fi. Activeu-la manualment. + Concedeix el permís d\'ubicació Activa els serveis d\'ubicació Activa la Wi-Fi @@ -4725,6 +4747,7 @@ Compartir-lo + Envia , %1$s @@ -5028,6 +5051,119 @@ Teclat Enviar amb la tecla de Retorn + + Carpetes de xats + + Afegir una carpeta de xats + + + + Organitza els teus xats en carpetes i passa ràpidament d\'una a l\'altra a la teva llista de xats. + + Carpetes + + Crear una carpeta + + Tots els xats + + Carpetes suggerides + + No llegits + + Missatges no llegits de tots els xats + + Xats individuals + + Només missatges de xats directes + + Grups + + Només missatges de xats grupals + + Afegeix + + Carpeta \"%1$s\" afegida + + Editar carpeta + + Eliminar carpeta + + Afegir nova carpeta + + Silenciar tots + + Reorganitzar carpetes + + Marca-ho tot com a llegit + + + %1$d tipus de xat + %1$d tipus de xat + + + + %1$d xat + %1$d xats + + + + %1$d xat exclòs + %1$d xats exclosos + + + + + Crear una carpeta + + Nom de la carpeta (obligatori) + + Xats inclosos + + Afegir xats + + Selecciona els xats que vols que apareguin en aquesta carpeta. + + Excepcions + + Excloure xats + + Selecciona els xats que no vols que apareguin en aquesta carpeta. + + Mostrar només xats no llegits + + Quan aquesta opció estigui activada, en aquesta carpeta només es mostraran els xats amb missatges no llegits. + + Incloure els xats silenciats + + Crea + + Crear carpeta? + + Vols crear la carpeta de xats \"%1$s\"? + + Crear carpeta + + Editar carpeta + + Desar + + Guardar els canvis? + + Voleu guardar els canvis que heu fet en aquesta carpeta de xats? + + Guardar els canvis + + Descarta + + Eliminar carpeta + + Eliminar aquesta carpeta de xats? + + + + Tipus de xat + + Fet Missatges @@ -5112,6 +5248,7 @@ Qualitat dels mitjans + Qualitat dels mitjans enviats L’enviament de mitjans d’alta qualitat usarà més dades. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + La teva subscripció al pla de còpies de seguretat ha caducat - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + El teu pla de còpia de seguretat d\'arxius ha caducat perquè no s\'ha pogut renovar amb el teu mètode de pagament actual. S\'eliminaran els arxius de la teva còpia de seguretat en %1$d dia. + El teu pla de còpia de seguretat d\'arxius ha caducat perquè no s\'ha pogut renovar amb el teu mètode de pagament actual. S\'eliminaran els arxius de la teva còpia de seguretat en %1$d dies. Per continuar fent còpies de seguretat de tots els teus arxius, pots tornar a pagar per aquest servei en qualsevol moment. @@ -7254,9 +7391,9 @@ Si selecciones \"Ometre\", els arxius de la teva còpia de seguretat s\'eliminaran d\'aquí a %1$d dies. - Your backups subscription failed to renew + La teva subscripció al pla de còpies de seguretat no s\'ha pogut renovar - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Assegura\'t que el teu mètode de pagament està actualitzat. Toca Gestionar la subscripció, i a Mètodes de pagament toca Actualització. No s\'ha pogut completar la còpia de seguretat @@ -7268,7 +7405,7 @@ Gestiona la subscripció - Subscribe for %1$s/month + Subscriu-te per %1$s/mes Descarregar els arxius ara @@ -7303,6 +7440,17 @@ %1$s de %2$s + + + Cancel·la la descàrrega + + Descarregant: %1$s de %2$s (%3$s %%) + + No hi ha prou espai per descarregar la còpia de seguretat. Per continuar, allibera %1$s d\'espai. + + Ometre la descàrrega + + "La teva darrera còpia de seguretat no s\'ha pogut completar. Assegura\'t que el teu telèfon estigui connectat a una xarxa wifi i toca \"Fer una còpia de seguretat ara\" per tornar-ho a provar." @@ -7356,18 +7504,18 @@ L\'optimització d\'emmagatzematge només es pot utilitzar amb el nivell de subscripció de pagament de Còpies de seguretat de Signal. Actualitza el teu pla de còpies de seguretat per accedir a aquesta funció. - Subscribe for %1$s/month + Subscriu-te per %1$s/mes - This media is no longer available + Aquest arxiu ja no està disponible. - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + El teu pla de còpia de seguretat actual de Signal inclou el teu darrer dia d\'arxius multimèdia. Per començar a fer còpies de seguretat de tots els teus arxius, actualitza ara la teva subscripció. + El teu pla de còpia de seguretat actual de Signal inclou els teus darrers %1$d dies d\'arxius multimèdia. Per començar a fer còpies de seguretat de tots els teus arxius, actualitza ara la teva subscripció. - Subscribe for %1$s/month + Subscriu-te per %1$s/mes L\'eliminació de continguts ara es sincronitza ara a tots els teus dispositius @@ -7415,6 +7563,8 @@ Descàrrega completa La còpia de seguretat es crearà durant la nit. + + Subscripció inactiva Pla de còpies de seguretat @@ -7423,8 +7573,12 @@ %1$s/ mes El teu pla de còpies de seguretat és gratuït - + Renovacions %1$s + + Caduca el %1$s + + Caduca el %1$s Fes una còpia de seguretat de l\'historial de missatges per no perdre mai cap dada quan compris un telèfon nou o tornis a instal·lar Molly. @@ -7469,6 +7623,10 @@ Còpia de seguretat manual Introdueix el PIN, la contrasenya o el patró del teu dispositiu. + + Tornar a activar les còpies de seguretat + + S\'han desactivat les còpies de seguretat i s\'han eliminat les teves dades del servei d\'emmagatzematge segur de Signal. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7e1dca8f88..ad36f8f829 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -371,6 +371,8 @@ Chaty Zprávy + + Typy chatů Zpráva %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Vše je nastaveno. Můžete zahájit zálohování. V závislosti na velikosti zálohy to může trvat delší dobu. Během zálohování můžete telefon používat jako obvykle. @@ -2088,6 +2090,7 @@ +%1$d pozváno +%1$d pozváno + %1$d další skupina %1$d další skupiny @@ -2116,6 +2119,7 @@ Nenalezeno žádné zařízení. Chyba sítě. Neplatný QR kód. + Omlouváme se, ale máte propojeno příliš mnoho zařízení. Zkuste některé propojení zrušit Omlouváme se, ale toto není platný QR kód pro propojení zařízení. Propojit zařízení Signal? @@ -2140,11 +2144,13 @@ Zadejte heslo Chybné heslo! Odemknout Molly + Molly Android - Zamykací obrazovka Mapa + Umístit ukazatel Potvrdit adresu @@ -2692,6 +2698,7 @@ Zpráva Signal + Víc @@ -2723,6 +2730,7 @@ Nejsou instalovány žádné nálepky Nálepky z příchozích zpráv se objeví zde Nepojmenovaná + Neznámý @@ -2946,6 +2954,7 @@ Média již nejsou k dispozici. Médium nelze přehrát. + Při hledání zprávy došlo k chybě. Nebyla nalezena žádná aplikace pro sdílení tohoto média. Zavřít @@ -3021,6 +3030,7 @@ Zprávy Volání + Chyby Zálohy Stav zámku @@ -3030,6 +3040,7 @@ Neznámý Hlasové poznámky Kontakt se připojil k Signal + K otevření nastavení kanálu oznámení není k dispozici žádná aktivita. Spojení na pozadí @@ -3840,10 +3851,12 @@ Ze všech zařízení bude trvale odstraněna veškerá historie zpráv. Tuto operaci nelze vzít zpět. Vše nyní odstranit + Navždy 1 rok 6 měsíců 30 dní + Žádný %1$s zpráva @@ -3870,6 +3883,7 @@ Zobrazit Vyzvánění Velikost písma zprávy + Priorita Řešení problémů s oznámeními @@ -4098,6 +4112,7 @@ Naskenujte QR kód adresy příjemce + Požadavek Zaplatit Dostupný zůstatek: %1$s @@ -4231,6 +4246,7 @@ Můžete připnout nanejvýš %1$d chaty + Fotografie kontaktu Archivováno @@ -4239,6 +4255,10 @@ Nový chat Otevřít fotoaparát Zatím nemáte žádné chaty.\nZačněte tím, že pošlete zprávu někomu z přátel. + + Žádné chaty k zobrazení + + Nastavení složky @@ -4487,6 +4507,7 @@ Zálohy chatů Přenést účet Přenést účet na nové Android zařízení + Zadejte heslo pro zálohu Obnovení Nelze importovat zálohy z novějších verzí Signal @@ -4694,6 +4715,7 @@ Nepovedlo se otevřít Wi-Fi nastavení. Aktivujte prosím Wi-Fi ručně. + Udělit oprávnění k poloze Zapnout služby polohy Zapnout Wi-Fi @@ -4961,6 +4983,7 @@ Sdílet + Odeslat , %1$s @@ -5266,6 +5289,125 @@ Klávesnice Odeslat tlačítkem Enter + + Složky s chaty + + Přidat složku s chaty + + + + Uspořádejte své chaty do složek. Můžete pak mezi nimi rychle přepínat v seznamu chatů. + + Složky + + Vytvořit složku + + Všechny chaty + + Navrhované složky + + Nepřečtené + + Nepřečtené zprávy ze všech chatů + + Chaty 1:1 + + Pouze zprávy z osobních chatů + + Skupiny + + Pouze zprávy ze skupinových chatů + + Přidat + + Složka %1$s přidána. + + Upravit složku + + Odstranit složku + + Přidat novou složku + + Ztlumit všechny + + Změnit pořadí složek + + Označit vše jako přečtené + + + %1$d typ chatu + %1$d typy chatů + %1$d typů chatů + %1$d typů chatů + + + + %1$d chat + %1$d chaty + %1$d chatů + %1$d chatů + + + + %1$d chat vyloučen + %1$d chaty vyloučeny + %1$d chatů vyloučeno + %1$d chatů vyloučeno + + + + + Vytvořit složku + + Název složky (povinné) + + Zahrnuté chaty + + Přidat chaty + + Vyberte chaty, které se mají v této složce zobrazovat. + + Výjimky + + Vyloučit chaty + + Vyberte chaty, které se nemají v této složce zobrazovat. + + Zobrazovat pouze nepřečtené chaty + + Při zapnutí této funkce se budou v této složce zobrazovat pouze chaty s nepřečtenými zprávami. + + Zahrnout ztlumené chaty + + Vytvořit + + Vytvořit složku? + + Chcete vytvořit složku s chaty „%1$s“? + + Vytvořit složku + + Upravit složku + + Uložit + + Uložit změny? + + Chcete uložit změny, které jste provedli v této složce s chaty? + + Uložit změny + + Zahodit + + Odstranit složku + + Odstranit tuto složku s chaty? + + + + Typy chatů + + Hotovo Zprávy @@ -5352,6 +5494,7 @@ Kvalita médií + Kvalita odeslaných médií Odesílání médií ve vysoké kvalitě spotřebovává více dat. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Platnost vašeho předplatného pro zálohování vypršela - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Platnost vašeho předplatného pro zálohování vypršela, protože jej nebylo možné obnovit pomocí aktuálního způsobu platby. Po %1$d dni budou média ve vaší záloze odstraněna. + Platnost vašeho předplatného pro zálohování vypršela, protože jej nebylo možné obnovit pomocí aktuální platební metody. Po %1$d dnech budou média ve vaší záloze odstraněna. + Platnost vašeho předplatného pro zálohování vypršela, protože jej nebylo možné obnovit pomocí aktuální platební metody. Po %1$d dnech budou média ve vaší záloze odstraněna. + Platnost vašeho předplatného pro zálohování vypršela, protože jej nebylo možné obnovit pomocí aktuální platební metody. Po %1$d dnech budou média ve vaší záloze odstraněna. Kdykoliv můžete opět začít platit za zálohování a pokračovat v zálohování všech svých médií. @@ -7570,9 +7713,9 @@ Pokud zvolíte možnost „Přeskočit“, budou média ve vaší záloze odstraněna za %1$d dní. - Your backups subscription failed to renew + Předplatné pro zálohování se nepodařilo obnovit - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Zkontrolujte, zda je vámi zvolená platební metoda aktuální. Klikněte na možnost Správa předplatného a v části Platební metody na Aktualizovat. Zálohování se nepodařilo dokončit @@ -7584,7 +7727,7 @@ Spravovat předplatné - Subscribe for %1$s/month + Předplatit za %1$s / měsíc Stáhnout média @@ -7619,6 +7762,17 @@ %1$s z %2$s + + + Zrušit stahování + + Stahování: %1$s z %2$s (%3$s %%) + + Není dostatek místa pro stažení vaší zálohy. Chcete-li pokračovat, uvolněte %1$s místa. + + Přeskočit stahování + + "Poslední zálohu se nepodařilo dokončit. Ujistěte se, že je telefon připojen k síti Wi-Fi, klepněte na Zpět a zkuste to znovu." @@ -7672,20 +7826,20 @@ Optimalizaci úložiště lze použít pouze s placenou službou Signal zálohování. Aktualizujte svůj plán zálohování, abyste mohli začít tuto funkci používat. - Subscribe for %1$s/month + Předplatit za %1$s / měsíc - This media is no longer available + Toto médium již není k dispozici - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Vaše předplatné pro zálohování médií v aplikaci Signal bude trvat již jen %1$d den. Pro zálohování všech svých médií proveďte aktualizaci. + Vaše předplatné pro zálohování médií v aplikaci Signal bude trvat již jen %1$d dny. Pro zálohování všech svých médií proveďte aktualizaci. + Vaše předplatné pro zálohování médií v aplikaci Signal bude trvat již jen %1$d dní. Pro zálohování všech svých médií proveďte aktualizaci. + Vaše předplatné pro zálohování médií v aplikaci Signal bude trvat již jen %1$d dní. Pro zálohování všech svých médií proveďte aktualizaci. - Subscribe for %1$s/month + Předplatit za %1$s / měsíc Odstraňování zpráv je nyní synchronizováno pro všechna vaše zařízení @@ -7733,6 +7887,8 @@ Stahování dokončeno Záloha bude vytvořena přes noc. + + Předplatné neaktivní Plán zálohování @@ -7741,8 +7897,12 @@ %1$s / měsíčně Váš plán zálohování je zdarma - + Obnovení %1$s + + Vyprší dne %1$s + + Vypršelo dne %1$s Zálohujte si historii zpráv. Už nikdy nepřijdete o data, když si pořídíte nový telefon nebo přeinstalujete aplikaci Molly. @@ -7787,6 +7947,10 @@ Ruční zálohování Zadejte prosím PIN, heslo nebo vzorec svého zařízení. + + Znovu povolit + + Zálohování bylo vypnuto a vaše data byla odstraněna ze zabezpečeného úložiště služby Signal. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 682b11ddbb..3b17d2a22c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -365,6 +365,8 @@ Chats Beskeder + + Chattyper Besked %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Det var det. Start din sikkerhedskopiering nu. Afhængigt af størrelsen på din sikkerhedskopi kan dette tage lang tid. Du kan bruge din telefon, som du plejer, mens sikkerhedskopieringen oprettes. @@ -1966,6 +1968,7 @@ +%1$d inviteret +%1$d inviterede + %1$d yderligere gruppe %1$d yderligere grupper @@ -1992,6 +1995,7 @@ Ingen enhed fundet Netværksfejl. Ugyldig QR-kode. + Beklager. Du har allerede for mange enheder tilsluttet, prøv at fjerne én Beklager, QR-koden kan ikke bruges til at forbinde enheder. Tilknyt en Signal-enhed? @@ -2014,11 +2018,13 @@ Tilføj adgangssætning Ugyldig adgangssætning! Lås Molly op + Molly Android - Låseskærm Kort + Placér markør Godkend adresse @@ -2522,6 +2528,7 @@ Signal-besked + Mere @@ -2553,6 +2560,7 @@ Ingen klistermærker installeret Klistermærker fra modtagede beskeder vises her Ingen titel + Ukendt @@ -2774,6 +2782,7 @@ Mediefil er ikke længere tilgængelig. Medier kunne ikke afspilles. + Kunne ikke finde besked. Kan ikke finde en app, som kan dele denne mediefil. Luk @@ -2845,6 +2854,7 @@ Beskeder Opkald + Registrerede fejl Sikkerhedskopier Låsestatus @@ -2854,6 +2864,7 @@ Ukendt Stemmenoter Kontakt bruger nu Signal + Ingen aktivitet tilgængelig for at åbne indstillinger for notifikationsskanal. Forbindelse i baggrunden @@ -3638,10 +3649,12 @@ Al beskedhistorik fjernes permanent fra alle forbundne enheder. Denne handling kan ikke fortrydes. Slet alt nu + For evigt 1 år 6 måneder 30 dage + Ingen %1$s besked @@ -3666,6 +3679,7 @@ Vis Ringetone Skriftstørrelse på beskeder + Prioritet Fejlfinding af notifikationer @@ -3894,6 +3908,7 @@ Scan betalingsmodtagerens QR-kode for adresse + Anmodning Betal Disponibel saldo: %1$s @@ -4025,6 +4040,7 @@ Du kan kun fastgøre op til %1$d chats + Kontaktbillede Arkiveret @@ -4033,6 +4049,10 @@ Ny chat Åbn kamera Der er ingen chats endnu.\nKom i gang ved at sende en besked til en ven. + + Ingen chats at vise + + Mappeindstillinger @@ -4265,6 +4285,7 @@ Sikkerhedskopier af chats Overfør konto Overfør konto til en ny Android-enhed + Indtast adgangssætning til sikkerhedskopi Gendan Kan ikke importere backups fra nyere Signal-versioner @@ -4472,6 +4493,7 @@ Wi-Fi-indstillinger kan ikke åbnes. Slå Wi-Fi til manuelt. + Tildel placeringstilladelser Slå placeringstjenester til Aktiver Wi-Fi @@ -4725,6 +4747,7 @@ Del + Send . %1$s @@ -5028,6 +5051,119 @@ Tastatur Send med enter + + Chatmapper + + Tilføj en chatmappe + + + + Organiser dine chats i mapper, og skift hurtigt mellem dem i din på din chatliste. + + Mapper + + Opret en mappe + + Alle chats + + Anbefalede mapper + + Ulæste + + Ulæste beskeder fra alle chats + + 1:1-chats + + Kun beskeder fra direkte chats + + Grupper + + Kun besked fra gruppechats + + Tilføj + + %1$s mappe tilføjet. + + Rediger mappe + + Slet mappe + + Tilføj ny mappe + + Sæt alle på lydløs + + Flyt mapper + + Markér alle som læst + + + %1$d chattype + %1$d chattyper + + + + %1$d chat + %1$d chats + + + + %1$d chat ekskluderet + %1$d chats ekskluderet + + + + + Opret en mappe + + Mappenavn (påkrævet) + + Inkluderede chats + + Tilføj chats + + Vælg chats, som du vil vise i denne mappe. + + Undtagelser + + Ekskluder chats + + Vælg chats, som du ikke ønsker skal vises i denne mappe. + + Vis kun ulæste chats + + Når dette er aktiveret viser denne mappe kun chats med ulæste beskeder. + + Inkluder ignorerede chats + + Opret + + Vil du oprette en mappe? + + Vil du at oprette chatmappen \"%1$s\"? + + Opret mappe + + Rediger mappe + + Gem + + Vil du gemme ændringerne? + + Vil du gemme de ændringer, du har foretaget i denne chatmappe? + + Gem ændringer + + Kassér + + Slet mappe + + Vil du slette denne chatmappe? + + + + Chattyper + + Færdig Beskeder @@ -5112,6 +5248,7 @@ Mediekvalitet + Kvalitet af sendte mediefiler Afsendelse af mediefiler i høj kvalitet bruger mere data. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Dit sikkerhedskopieringsabonnement er udløbet - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Dit abonnement for sikkerhedskopiering kunne ikke fornyes med din nuværende betalingsmetode. Om %1$d dag slettes alle medier, der er gemt i din sikkerhedskopi. + Dit abonnement for sikkerhedskopiering kunne ikke fornyes med din nuværende betalingsmetode. Om %1$d dage slettes alle medier, der er gemt i din sikkerhedskopi. Du kan til enhver tid begynde at betale for sikkerhedskopier igen for at fortsætte med at sikkerhedskopiere alle dine medier. @@ -7254,9 +7391,9 @@ Hvis du vælger \"Spring over\", slettes medierne i sikkerhedskopien inden for %1$d dage. - Your backups subscription failed to renew + Dit sikkerhedskopieringsabonnement kunne ikke fornyes - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Sørg for, at din betalingsmetode er opdateret. Tryk på Administrer abonnement, og tryk på Opdater under Betalingsmetoder. Kunne ikke gennemføre sikkerhedskopieringen @@ -7268,7 +7405,7 @@ Administrer abonnement - Subscribe for %1$s/month + Abonner for %1$s/måned Download medier nu @@ -7303,6 +7440,17 @@ %1$s af %2$s + + + Annuller download + + Downloader: %1$s af %2$s (%3$s %%) + + Ikke nok plads til at gemme din sikkerhedskopi. Frigør %1$s for at fortsætte. + + Spring download over + + "Din sidste sikkerhedskopiering kunne ikke gennemføres. Tjek, om din telefon er tilsluttet et wi-wi-netværk, og tryk på Sikkerhedskopiér nu for at prøve igen." @@ -7356,18 +7504,18 @@ Lageroptimering kan kun bruges, hvis du betaler for Signal-sikkerhedskopier. Opgrader dit abonnement på sikkerhedskopiering for at begynde at bruge denne funktion. - Subscribe for %1$s/month + Abonner for %1$s/måned - This media is no longer available + Denne mediefil er ikke længere tilgængelig - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Dit nuværende abonnement på Signal-sikkerhedskopiering omfatter medier fra den sidste %1$d dag. Opgrader nu for at begynde at sikkerhedskopiere alle dine medier. + Dit nuværende abonnement på Signal-sikkerhedskopiering omfatter medier fra de sidste %1$d dage. Opgrader nu for at begynde at sikkerhedskopiere alle dine medier. - Subscribe for %1$s/month + Abonner for %1$s/måned Sletning synkroniseres nu på tværs af alle dine enheder @@ -7415,6 +7563,8 @@ Download fuldført Sikkerhedskopien oprettes i nat. + + Inaktivt abonnement Sikkerhedskopieringsabonnement @@ -7423,8 +7573,12 @@ %1$s/måned Dit sikkerhedskopieringsabonnement er gratis - + Fornyes %1$s + + Udløber %1$s + + Udløber %1$s Sikkerhedskopier din beskedhistorik, så du aldrig mister data, når du får en ny telefon eller geninstallerer Molly. @@ -7469,6 +7623,10 @@ Lav manuel sikkerhedskopi Angiv din enheds pinkode, adgangskode eller dit mønster. + + Slå sikkerhedskopiering til igen + + Sikkerhedskopiering er slået fra, og dine data er blevet slettet fra Signals sikre lagringstjeneste. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ebef5235d0..86382e728a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -365,6 +365,8 @@ Chats Nachrichten + + Chat-Arten Nachricht %1$s @@ -424,7 +426,7 @@ Video kann nicht heruntergeladen werden. Du musst es erneut verschicken. - Wurde eben bearbeitet + Gerade bearbeitet Bearbeitet %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Du kannst loslegen. Beginne jetzt deine Datensicherung. Je nach Größe deiner Datensicherung könnte diese etwas dauern. Während der Datensicherung kannst du dein Mobiltelefon weiterhin ganz normal nutzen. @@ -1487,7 +1489,7 @@ Zeichne zum Verwischen weiterer Gesichter oder Bereiche - Gedrückt halten für Sprachnachricht, loslassen + Gedrückt halten für Sprachnachricht, loslassen zum Versenden Nachricht bearbeiten @@ -1539,8 +1541,8 @@ Ausgewählte Elemente löschen? - Dies wird die ausgewählte Datei unwiderruflich löschen. Jegliche diesen Elementen zugehörigen Nachrichtentexte werden ebenfalls gelöscht. - Dies wird alle %1$d ausgewählten Dateien unwiderruflich löschen. Jegliche diesen Elementen zugehörigen Nachrichtentexte werden ebenfalls gelöscht. + Dies wird die ausgewählte Datei unwiderruflich löschen. Zugehörige Nachrichtentexte werden ebenfalls gelöscht. + Dies wird alle %1$d ausgewählten Dateien unwiderruflich löschen. Zugehörige Nachrichtentexte werden ebenfalls gelöscht. Löschen Nachrichten werden gelöscht … @@ -1587,7 +1589,7 @@ PIN überprüfen Leg los Neue Gruppe - Einladen + Kontakte einladen Chat-Farben Profilbild @@ -1837,7 +1839,7 @@ Dir gefällt diese neue Funktion? Unterstütze Signal mit einer einmaligen Spende. - Dein Nachrichtenverlauf mit %1$s und seiner*ihrer Nummer %2$s wurde zusammengeführt. + Dein Nachrichtenverlauf mit %1$s und der zugehörigen Nummer %2$s wurde zusammengeführt. Dein Nachrichtenverlauf mit %1$s und einem anderen Chat, der dazu gehört, wurde zusammengeführt. @@ -1942,7 +1944,7 @@ Chat mit dieser Gruppe fortsetzen und deinen Namen und dein Foto mit deren Mitgliedern teilen? Diese Gruppe alten Typs kann nicht mehr verwendet werden. Erstelle eine neue Gruppe, um neue Funktionen wie @Erwähnungen und Administrator zu aktivieren. Diese Gruppe alten Typs kann nicht mehr verwendet werden. Die maximale Gruppengröße von %1$d Mitgliedern ist überschritten. - Chat mit %1$s fortsetzen und deinen Namen und dein Foto mit diesem Nutzer/dieser Nutzerin teilen? + Chat mit %1$s fortsetzen und deinen Namen und dein Foto mit diesem Kontakt teilen? Möchtest du dieser Gruppe beitreten und deinen Namen und dein Foto mit ihren Mitgliedern teilen? Diese wissen nicht, dass du ihre Nachrichten gesehen hast, bis du die Anfrage annimmst. Möchtest du dieser Gruppe beitreten und deinen Namen und dein Foto mit ihren Mitgliedern teilen? Du kannst deren Nachrichten nicht sehen, bis du die Anfrage annimmst. Dieser Gruppe beitreten? Die Gruppenmitglieder wissen nicht, dass du ihre Nachrichten gesehen hast, bis du die Anfrage annimmst. @@ -1966,6 +1968,7 @@ +%1$d eingeladen +%1$d eingeladen + %1$d weitere Gruppe %1$d weitere Gruppen @@ -1992,6 +1995,7 @@ Kein Gerät gefunden. Netzwerkfehler. Ungültiger QR-Code. + Es sind bereits zu viele Geräte gekoppelt. Bitte entferne mindestens ein Gerät. Dies ist kein gültiger QR-Code zur Gerätekopplung. Signal-Gerät koppeln? @@ -2014,11 +2018,13 @@ Passphrase übermitteln Passphrase ungültig! Molly entsperren + Molly Android – Sperrbildschirm Karte + Markierung platzieren Adresse übernehmen @@ -2056,7 +2062,7 @@ Wenn du dich nicht mehr an deine PIN erinnern kannst, kannst du eine neue erstellen. - Die Anzahl der zu erratenden PINs ist erschöpft, aber du kannst immer noch auf dein Signal-Konto zugreifen, indem du eine neue PIN erstellst. + Maximale Anzahl der Versuche zum Erraten deiner PIN ist ereicht. Du kannst immer noch auf dein Signal-Konto zugreifen, indem du eine neue PIN erstellst. Warnung @@ -2177,7 +2183,7 @@ Deine Anfrage, diesem Anruf beizutreten, wurde abgelehnt. - Aus dem Anruf entfernen + Aus dem Anruf entfernt Jemand hat dich aus dem Anruf entfernt. @@ -2264,9 +2270,9 @@ Kamerarichtung ändern - Lautsprecherlautstärke ändern + Lautsprecher ändern - Kamerastatus ändern + Kamera ändern Stummschaltung ändern @@ -2277,7 +2283,7 @@ Gruppenklingelstatus umschalten - Fehler auf Benutzerschnittstelle aufgetreten. Bitte melde diesen Fehlern den Entwicklern. + Benutzerschnittstelle-Fehler aufgetreten. Bitte melde diesen Fehler dem Entwicklungsteam. Keine geeigneten Audio-Eingänge/-Ausgänge gefunden. @@ -2336,7 +2342,7 @@ - »Gehobene Hand«-Ansicht vergrößern + »Gehobene Hand«-Ansicht erweitern @@ -2373,8 +2379,8 @@ Signal wird klingeln (%1$d) - Signal sendet eine Nachricht (%1$d) - Signal sendet eine Nachricht (%1$d) + Signal wird benachrichtigen (%1$d) + Signal wird benachrichtigen (%1$d) Gehobene Hand (%1$d) @@ -2417,7 +2423,7 @@ Zusätzliche Verifizierung erforderlich - Ein Verifizierungscode wird an diese Nummer gesendet. Es können Tarife anfallen. + Ein Verifizierungscode wird an diese Nummer gesendet. Je nach Tarif können Gebühren anfallen. Du erhältst einen Anruf zur Verifizierung dieser Telefonnummer. Telefonnummer bearbeiten Fehlende Google-Play-Dienste @@ -2522,6 +2528,7 @@ Signal-Nachricht + Mehr @@ -2553,6 +2560,7 @@ Keine Sticker installiert Hier werden Sticker aus eingehenden Nachrichten angezeigt Unbenannt + Unbekannt @@ -2638,7 +2646,7 @@ Hat mit %1$s auf deine Story reagiert - Hat mit %1$s auf ihre*seine Story reagiert + Hat mit %1$s auf diese Story reagiert Zahlung @@ -2774,6 +2782,7 @@ Medieninhalte nicht mehr verfügbar. Medieninhalt kann nicht wiedergegeben werden. + Fehler beim Suchen der Nachricht. Keine App zum Teilen dieser Medieninhalte gefunden. Schließen @@ -2845,6 +2854,7 @@ Nachrichten Anrufe + Fehler Datensicherungen Sperrstatus @@ -2854,6 +2864,7 @@ Unbekannt Sprachnachrichten Neuer Kontakt nutzt Signal + Keine Aktivität verfügbar, um die Einstellungen für den Benachrichtigungskanal zu öffnen. Hintergrundverbindung @@ -3349,7 +3360,7 @@ - Um die Ende-zu-Ende-Verschlüsselung mit %1$s zu verifizieren, vergleiche die Nummern mit seinem/ihrem Gerät. Du kannst den Code auch auf seinem/ihrem Gerät scannen. + Um die Ende-zu-Ende-Verschlüsselung mit %1$s zu verifizieren, vergleiche die Nummern mit dem Gerät der Person. Du kannst den Code auch auf dem Gerät der Person scannen. Zum Scannen antippen Vergleich erfolgreich Sicherheitsnummer konnte nicht verifiziert werden @@ -3638,10 +3649,12 @@ Alle Nachrichtenverläufe werden dauerhaft von allen Geräten gelöscht Dies kann nicht rückgängig gemacht werden. Alle jetzt löschen + Für immer 1 Jahr 6 Monate 30 Tage + Keine %1$s Nachricht @@ -3666,6 +3679,7 @@ Anzeigen Klingelton Schriftgröße für Nachrichten + Priorität Fehlerbehebung bei Benachrichtigungen @@ -3894,6 +3908,7 @@ Scanne den Adress-QR-Code des Empfängers + Anfrage Bezahlen Verfügbarer Kontostand: %1$s @@ -4025,6 +4040,7 @@ Du kannst maximal %1$d Chats anheften + Kontaktbild Archiviert @@ -4033,6 +4049,10 @@ Neuer Chat Kamera öffnen Noch keine Chats.\nLeg los und schreib einer Freundin oder einem Freund. + + Keine Chats zum Anzeigen + + Ordner-Einstellungen @@ -4265,6 +4285,7 @@ Chat-Sicherungen Konto übertragen Konto auf ein neues Android-Gerät übertragen + Sicherungspassphrase eingeben Wiederherstellen Import von Datensicherungen neuerer Signal-Versionen nicht möglich @@ -4472,6 +4493,7 @@ Die WLAN-Einstellungen können nicht geöffnet werden. Bitte schalte WLAN manuell ein. + Standortberechtigung gewähren Standortdienste einschalten WLAN einschalten @@ -4725,6 +4747,7 @@ Teilen + Senden , %1$s @@ -5028,6 +5051,119 @@ Tastatur Mit Enter-Taste versenden + + Chat-Ordner + + Chat-Ordner hinzufügen + + + + Organisiere deine Chats in Ordnern und wechsle in deiner Chat-Liste schnell zwischen ihnen hin und her. + + Ordner + + Ordner erstellen + + Alle Chats + + Vorgeschlagene Ordner + + Ungelesen + + Ungelesene Nachrichten aus allen Chats + + Einzelchats + + Nur Nachrichten aus Chats mit einer Person + + Gruppen + + Nur Nachrichten von Gruppenchats + + Hinzufügen + + Ordner %1$s hinzugefügt. + + Ordner bearbeiten + + Ordner löschen + + Neuen Ordner hinzufügen + + Alle stummschalten + + Ordner neu anordnen + + Alle gelesen + + + %1$d Chat-Art + %1$d Chat-Arten + + + + %1$d Chat + %1$d Chats + + + + %1$d Chat ausgenommen + %1$d Chats ausgenommen + + + + + Ordner erstellen + + Ordnername (erforderlich) + + Beinhaltete Chats + + Chats hinzufügen + + Wähle die Chats aus, die in diesem Ordner angezeigt werden sollen. + + Ausnahmen + + Chats ausschließen + + Wähle die Chats aus, die nicht in diesem Ordner angezeigt werden sollen. + + Nur ungelesene Chats anzeigen + + Wenn diese Option aktiviert ist, werden in diesem Ordner nur Chats mit ungelesenen Nachrichten angezeigt. + + Stummgeschaltete Chats einschließen + + Erstellen + + Ordner erstellen? + + Möchtest du den Chat-Ordner »%1$s« erstellen? + + Ordner erstellen + + Ordner bearbeiten + + Speichern + + Änderungen speichern? + + Möchtest du deine am Chat-Ordner vorgenommenen Änderungen speichern? + + Änderungen speichern + + Verwerfen + + Ordner löschen + + Diesen Chat-Ordner löschen? + + + + Chat-Arten + + Fertig Nachrichten @@ -5112,6 +5248,7 @@ Medienqualität + Medienqualität für Versand Das Senden von Medieninhalten hoher Qualität verbraucht mehr Datenvolumen. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Dein Backup-Abo ist abgelaufen - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Dein Backup-Abo ist abgelaufen, da es mit deiner aktuellen Zahlungsmethode nicht verlängert werden konnte. Nach %1$d Tag werden die Medien in deinem Backup gelöscht. + Dein Backup-Abo ist abgelaufen, da es mit deiner aktuellen Zahlungsmethode nicht verlängert werden konnte. Nach %1$d Tagen werden die Medien in deinem Backup gelöscht. Um weiterhin all deine Medien zu sichern, kannst du jederzeit wieder für die Datensicherungen bezahlen. @@ -7254,9 +7391,9 @@ Wenn du »Überspringen« wählst, werden die Medien in der Datensicherung in %1$d Tagen gelöscht. - Your backups subscription failed to renew + Dein Backup-Abo konnte nicht verlängert werden - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Überprüfe, ob deine Zahlungsmethode auf dem neuesten Stand ist. Tippe auf »Backup-Abo verwalten« und unter Zahlungsmethoden auf »Aktualisieren«. Die Datensicherung konnte nicht abgeschlossen werden @@ -7266,9 +7403,9 @@ Überspringen - Regelmäßige Spende verwalten + Backup-Abo verwalten - Subscribe for %1$s/month + Abonniere für %1$s/Monat Medien jetzt herunterladen @@ -7303,6 +7440,17 @@ %1$s von %2$s + + + Download abbrechen + + %1$s von %2$s (%3$s%%) werden heruntergeladen + + Nicht genug Speicherplatz, um deine Datensicherung zu speichern. Gib %1$s Speicherplatz frei, um fortzufahren. + + Download überspringen + + "Deine letzte Datensicherung konnte nicht abgeschlossen werden. Stelle sicher, dass dein Gerät mit dem WLAN verbunden ist und tippe auf »Jetzt sichern«, um es erneut zu versuchen." @@ -7352,22 +7500,22 @@ - Aktualisiere deine Spendeneinstellung, um diese Funktion zu aktivieren + Upgraden um diese Funktion zu aktivieren - Die Speicheroptimierung kann nur verwendet werden, wenn du für deine Datensicherung bei Signal spendest. Aktualisiere, wie du deine Daten sichern möchtest, um diese Funktion zu nutzen. + Die Speicheroptimierung kann nur mit der kostenpflichtigen Option für Signal Backups genutzt werden. Upgrade deine Backup-Option, um diese Funktion zu nutzen. - Subscribe for %1$s/month + Abonniere für %1$s/Monat - This media is no longer available + Diese Medien sind nicht länger verfügbar - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Dein aktuelles Signal Backup-Abo umfasst die aktuellsten Medien des letzten Tages. Führe jetzt ein Upgrade durch, um mit der Sicherung alle Medien zu beginnen. + Dein aktuelles Signal Backup-Abo umfasst die aktuellsten Medien der letzten %1$d Tage. Führe jetzt ein Upgrade durch, um mit der Sicherung aller Medien zu beginnen. - Subscribe for %1$s/month + Abonniere für %1$s/Monat Der Löschvorgang wird jetzt auf all deinen Geräten synchronisiert @@ -7410,11 +7558,13 @@ Art der Datensicherung geändert und regelmäßige Spende storniert - Regelmäßige Spende gekündigt + Abo gekündigt Download abgeschlossen Datensicherung wird über Nacht erstellt. + + Abo inaktiv Datensicherungsplan @@ -7423,8 +7573,12 @@ %1$s/Monat Dein Datensicherungsplan ist kostenlos - + Verlängert sich am %1$s + + Läuft ab am: %1$s + + Abgelaufen am: %1$s Sichere deinen Nachrichtenverlauf und verliere keine alten Nachrichten, wenn du ein neues Mobiltelefon hast bzw. Molly erneut installierst. @@ -7436,7 +7590,7 @@ Verwalten oder abbrechen - Aktualisieren + Upgraden %1$d/%2$d @@ -7469,6 +7623,10 @@ Daten manuell sichern Bitte gib deine Geräte-Pin, dein Passwort oder dein Sperrmuster ein. + + Datensicherungen erneut aktivieren + + Die Datensicherungen wurden deaktiviert und deine Daten wurden aus dem sicheren Speicherservice von Signal gelöscht. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b93fc484e1..e4c6fda9e0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -365,6 +365,8 @@ Συνομιλίες Μηνύματα + + Τύποι συνομιλιών Μήνυμα %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Είσαι εντάξει. Ξεκίνα τη δημιουργία αντιγράφων ασφαλείας τώρα. Ανάλογα με το μέγεθος του αντιγράφου ασφαλείας σου, αυτό μπορεί να διαρκέσει πολύ. Μπορείς να χρησιμοποιείς το τηλέφωνό σου όπως συνήθως, κατά τη διάρκεια της δημιουργίας αντιγράφων ασφαλείας. @@ -1966,6 +1968,7 @@ +%1$d προσκεκλημένος +%1$d προσκεκλημένοι + %1$d επιπλέον ομάδα %1$d επιπλέον ομάδες @@ -1992,6 +1995,7 @@ Δεν βρέθηκε συσκευή. Σφάλμα δικτύου. Μη έγκυρος QR κωδικός. + Δυστυχώς έχεις πάρα πολλές συσκευές συνδεμένες, προσπάθησε να διαγράψεις κάποιες Συγγνώμη, αυτός δεν είναι ένας έγκυρος κωδικός QR για σύνδεση συσκευών. Σύνδεση κάποιας συσκευής Signal; @@ -2014,11 +2018,13 @@ Καταχώρηση συνθηματικού Μη έγκυρο συνθηματικό! Ξεκλείδωσε το Molly + Molly Android - Κλείδωμα οθόνης Χάρτης + Καρφίτσωμα τοποθεσίας Αποδοχή διεύθυνσης @@ -2522,6 +2528,7 @@ Μήνυμα Signal + Περισσότερα @@ -2553,6 +2560,7 @@ Δεν έχουν εγκατασταθεί αυτοκόλλητα Αυτοκόλλητα από εισερχόμενα μηνύματα θα εμφανίζονται εδώ Χωρίς τίτλο + Άγνωστο @@ -2774,6 +2782,7 @@ Το πολυμέσο δεν είναι πια διαθέσιμο. Μη δυνατότητα αναπαραγωγής πολυμέσων. + Σφάλμα κατά την εύρεση του μηνύματος. Δεν βρέθηκε εφαρμογή που να μπορεί να διαμοιραστεί αυτό το πολυμέσο. Κλείσιμο @@ -2845,6 +2854,7 @@ Μηνύματα Κλήσεις + Αποτυχίες Αντίγραφα ασφαλείας Κατάσταση κλειδώματος @@ -2854,6 +2864,7 @@ Άγνωστο Ηχητικές σημειώσεις Επαφή που εγκατέστησε το Signal + Δεν υπάρχει διαθέσιμη δραστηριότητα για το άνοιγμα ρυθμίσεων του καναλιού ειδοποίησης. Σύνδεση στο υπόβαθρο @@ -3638,10 +3649,12 @@ Όλο το ιστορικό των μηνυμάτων θα αφαιρεθεί μόνιμα από όλες τις συσκευές. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Διαγραφή όλων τώρα + Για πάντα 1 έτος 6 μήνες 30 ημέρες + Κανένα %1$s μήνυμα @@ -3666,6 +3679,7 @@ Εμφάνιση Ήχος κλήσης Μέγεθος γραμματοσειράς μηνύματος + Προτεραιότητα Ειδοποιήσεις αντιμετώπισης προβλημάτων @@ -3894,6 +3908,7 @@ Σαρώστε τον κωδικό QR της διεύθυνσης του δικαιούχου πληρωμής + Αίτημα Πληρωμή Εναπομείναν υπόλοιπο: %1$s @@ -4025,6 +4040,7 @@ Μπορείς να καρφιτσώσεις μέχρι %1$d συνομιλίες + Φωτογραφία επαφής Αρχειοθετημένα @@ -4033,6 +4049,10 @@ Νέα συνομιλία Άνοιγμα κάμερας Δεν υπάρχουν ακόμα συνομιλίες.\nΞεκίνα στέλνοντας μήνυμα σε κάποιον/α φίλο/η σου. + + Δεν υπάρχουν συνομιλίες για εμφάνιση + + Ρυθμίσεις φακέλου @@ -4265,6 +4285,7 @@ Αντίγραφα ασφαλείας συνομιλιών Μεταφορά λογαριασμού Μεταφορά λογαριασμού σε νέα συσκευή Android + Εισαγωγή συνθηματικό αντίγραφου ασφαλείας Επαναφορά Δεν εισαγάγουμε backup από νεότερη έκδοση Signal @@ -4472,6 +4493,7 @@ Δεν μπορέσαμε να ανοίξουμε τις Ρυθμίσεις Wi-Fi. Παρακαλώ ενεργοποίησε το Wi-Fi χειροκίνητα. + Παραχώρηση άδειας τοποθεσίας Ενεργοποίηση υπηρεσιών τοποθεσίας Ενεργοποίηση Wi-Fi @@ -4725,6 +4747,7 @@ Μοιράσου + Αποστολή , %1$s @@ -5028,6 +5051,119 @@ Πληκτρολόγιο Αποστολή με enter + + Φάκελοι συνομιλιών + + Προσθήκη φακέλου συνομιλίας + + + + Οργάνωσε τις συνομιλίες σου σε φακέλους και κάνε γρήγορη εναλλαγή μεταξύ τους στη λίστα συνομιλιών σου. + + Φάκελοι + + Δημιουργία φακέλου + + Όλες οι συνομιλίες + + Προτεινόμενοι φάκελοι + + Μη αναγνωσμένα + + Μη αναγνωσμένα μηνύματα από όλες τις συνομιλίες + + 1:1 συνομιλίες + + Μόνο μηνύματα από απευθείας συνομιλίες + + Ομάδες + + Μόνο μηνύματα από ομαδικές συνομιλίες + + Προσθήκη + + Προστέθηκε ο φάκελος %1$s. + + Επεξεργασία φακέλου + + Διαγραφή φακέλου + + Προσθήκη νέου φακέλου + + Σίγαση όλων + + Αναδιάταξη φακέλων + + Σημείωση όλων ως αναγνωσμένα + + + %1$d τύπος συνομιλίας + %1$d τύποι συνομιλιών + + + + %1$d συνομιλία + %1$d συνομιλίες + + + + αποκλεισμός %1$d συνομιλίας + αποκλεισμός %1$d συνομιλιών + + + + + Δημιουργία φακέλου + + Όνομα φακέλου (απαιτείται) + + Συνομιλίες που περιλαμβάνονται + + Προσθήκη συνομιλιών + + Επίλεξε τις συνομιλίες που θέλεις να εμφανίζονται σε αυτόν τον φάκελο. + + Εξαιρέσεις + + Εξαίρεση συνομιλιών + + Επίλεξε τις συνομιλίες που θέλεις να εμφανίζονται σε αυτόν τον φάκελο. + + Να εμφανίζονται μόνο μη αναγνωσμένες συνομιλίες + + Όταν είναι ενεργοποιημένη η επιλογή, σε αυτόν τον φάκελο θα εμφανίζονται μόνο συνομιλίες με μη αναγνωσμένα μηνύματα. + + Προσμέτρηση συνομιλιών σε σίγαση + + Δημιουργία + + Δημιουργία φακέλου; + + Θέλεις να δημιουργήσεις τον φάκελο συνομιλίας \"%1$s\"; + + Δημιουργία φακέλου + + Επεξεργασία φακέλου + + Αποθήκευση + + Αποθήκευση αλλαγών; + + Θέλεις να αποθηκεύσεις τις αλλαγές που έκανες σε αυτόν τον φάκελο συνομιλίας; + + Αποθήκευση αλλαγών + + Απόρριψη + + Διαγραφή φακέλου + + Διαγραφή αυτού του φακέλου συνομιλίας; + + + + Τύποι συνομιλιών + + Τέλος Μηνύματα @@ -5112,6 +5248,7 @@ Ποιότητα πολυμέσων + Ποιότητα απεσταλμένων πολυμέσων Η αποστολή πολυμέσων υψηλής ποιότητας θα καταναλώνει περισσότερα δεδομένα. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Η συνδρομή σου για δημιουργία αντιγράφων ασφαλείας έληξε - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Το πρόγραμμα δημιουργίας αντιγράφων ασφαλείας έληξε επειδή δεν ήταν δυνατή η ανανέωσή του με την τρέχουσα μέθοδο πληρωμής. Μετά από %1$d ημέρα, τα πολυμέσα στα αντίγραφα ασφαλείας σου θα διαγραφούν. + Το πρόγραμμα δημιουργίας αντιγράφων ασφαλείας έληξε επειδή δεν ήταν δυνατή η ανανέωσή του με την τρέχουσα μέθοδο πληρωμής. Μετά από %1$d ημέρες, τα πολυμέσα στα αντίγραφα ασφαλείας σου θα διαγραφούν. Μπορείς να αρχίσεις να πληρώνεις ξανά για τα αντίγραφα ασφαλείας ανά πάσα στιγμή για να συνεχίσεις να δημιουργείς αντίγραφα ασφαλείας για όλα τα πολυμέσα σου. @@ -7254,9 +7391,9 @@ Αν επιλέξεις «Παράλειψη», τα πολυμέσα στο αντίγραφο ασφαλείας σου θα διαγραφούν σε %1$d ημέρες. - Your backups subscription failed to renew + Η συνδρομή σου για δημιουργία αντιγράφων ασφαλείας δεν ανανεώθηκε - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Επιβεβαίωσε ότι η μέθοδος πληρωμής είναι επικαιροποιημένη. Πάτησε Διαχείριση συνδρομής και στην ενότητα Τρόποι πληρωμής πάτησε Ενημέρωση. Δεν ήταν δυνατή η ολοκλήρωση δημιουργίας αντιγράφων ασφαλείας @@ -7268,7 +7405,7 @@ Διαχείριση συνδρομής - Subscribe for %1$s/month + Εγγράψου για %1$s/μήνα Λήψη πολυμέσων τώρα @@ -7303,6 +7440,17 @@ %1$s από %2$s + + + Ακύρωση λήψης + + Λήψη: %1$s από %2$s (%3$s%%) + + Δεν υπάρχει αρκετός χώρος για την αποθήκευση του αντίγραφου ασφαλείας. Για να συνεχίσεις, απελευθέρωσε %1$s χώρου. + + Παράλειψη λήψης + + "Δεν ήταν δυνατή η ολοκλήρωση του τελευταίου αντιγράφου ασφαλείας. Βεβαιώσου ότι η συσκευή σου είναι συνδεδεμένη σε Wi-Fi και πάτησε Δημιουργία αντιγράφων ασφαλείας τώρα για να προσπαθήσεις ξανά." @@ -7356,18 +7504,18 @@ Η βελτιστοποίηση αποθηκευτικού χώρου μπορεί να χρησιμοποιηθεί μόνο με την πληρωμένη βαθμίδα του Signal Backups. Αναβάθμισε το πρόγραμμα δημιουργίας αντιγράφων ασφαλείας σου για να αρχίσεις να χρησιμοποιείς αυτήν τη λειτουργία. - Subscribe for %1$s/month + Εγγράψου για %1$s/μήνα - This media is no longer available + Το πολυμέσο δεν είναι πια διαθέσιμο - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Το τρέχον πρόγραμμα δημιουργίας αντιγράφων ασφαλείας Signal περιλαμβάνει την πιο πρόσφατη %1$d ημέρα των πολυμέσων σου. Για να ξεκινήσεις τη δημιουργία αντιγράφων ασφαλείας όλων των πολυμέσων σου, κάνε αναβάθμιση τώρα. + Το τρέχον πρόγραμμα δημιουργίας αντιγράφων ασφαλείας Signal περιλαμβάνει τις πιο πρόσφατες %1$d ημέρες των πολυμέσων σου. Για να ξεκινήσεις τη δημιουργία αντιγράφων ασφαλείας όλων των πολυμέσων σου, κάνε αναβάθμιση τώρα. - Subscribe for %1$s/month + Εγγράψου για %1$s/μήνα Η διαγραφή έχει συγχρονιστεί με όλες τις συσκευές σου @@ -7415,6 +7563,8 @@ Η λήψη ολοκληρώθηκε Το αντίγραφο ασφαλείας θα δημιουργηθεί κατά τη διάρκεια της νύχτας. + + Η συνδρομή είναι ανενεργή Πρόγραμμα αντιγράφων ασφαλείας @@ -7423,8 +7573,12 @@ %1$s/μήνα Το πρόγραμμα αντιγράφων σαφαλείας σου είναι δωρεάν - + Ανανεώνεται %1$s + + Λήγει στις %1$s + + Έληξε στις %1$s Δημιούργησε αντίγραφα ασφαλείας του ιστορικού μηνυμάτων σου, ώστε να μην χάνεις ποτέ δεδομένα αν αγοράσεις νέο τηλέφωνο ή επανεγκαταστήσεις το Molly. @@ -7469,6 +7623,10 @@ Δημιουργία αντιγράφων ασφαλείας χειροκίνητα Γράψε τον κωδικό PIN, τον κωδικό πρόσβασης ή το μοτίβο της συσκευής σου. + + Ενεργοποίηση αντιγράφων ασφαλείας εκ νέου + + Τα αντίγραφα ασφαλείας έχουν απενεργοποιηθεί και τα δεδομένα σου έχουν διαγραφεί από την υπηρεσία ασφαλούς αποθήκευσης της Signal. diff --git a/app/src/main/res/values-el/strings2.xml b/app/src/main/res/values-el/strings2.xml index d371412c40..66cf24e6b3 100644 --- a/app/src/main/res/values-el/strings2.xml +++ b/app/src/main/res/values-el/strings2.xml @@ -38,7 +38,6 @@ Εβδομαδιαία Διαγραφή και απενεργοποίηση των καταγραφών σφαλμάτων; Ιστοσελίδα Molly.im - Βελτιστοποίηση για έγκαιρες ειδοποιήσεις Tor μέσω Orbot Δορυφορικό Κανονικό @@ -71,7 +70,6 @@ Αριθμός αντιγράφων που διατηρούνται Έτοιμο για λήψη μηνυμάτων Σύνδεση χωρίς σάρωση - Πάτα για να επιτρέψεις στο Molly να ανακτά μηνύματα ενώ η συσκευή είναι σε αναμονή. Παρακαλούμε επιβεβαίωσε ότι είσαι πραγματικά εσύ που χρησιμοποιείς το Molly Κλείδωμα πρόσβασης του Molly με αναγνώριση δακτυλικών αποτυπωμάτων ή προσώπου Δεν υπάρχουν βιομετρικές δυνατότητες σ\' αυτή τη συσκευή @@ -83,7 +81,6 @@ Σάρωσε τον κωδικό QR χρησιμοποιώντας την κύρια συσκευή σου Σύνδεση Εισήγαγε όνομα γι\' αυτή τη συσκευή - Ειδοποιήσεις Push μη διαθέσιμες Χωρίς συνδεδεμένες συσκευές Νέα δραστηριότητα ενώ είναι κλειδωμένο Λήψη ειδοποιήσεων για μηνύματα ή αναπάντητες κλήσεις όσο η εφαρμογή είναι κλειδωμένη. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5b8e880b79..1dc714453d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -142,7 +142,7 @@ - Puedes tener nuevos mensajes + Es posible que tengas nuevos mensajes Personas bloqueadas @@ -365,6 +365,8 @@ Chats Mensajes + + Tipos de chat Enviar mensaje a %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + ¡Todo listo! Ya puedes iniciar tu copia de seguridad. Dependiendo del tamaño de tu copia de seguridad, este proceso puede llevar bastante tiempo. Mientras se realiza la copia de seguridad, podrás seguir usando tu teléfono como de costumbre. @@ -1832,7 +1834,7 @@ Has marcado tu número de seguridad con %1$s como verificado desde otro dispositivo Has retirado la marca de verificación de tu número de seguridad con %1$s Has retirado la marca de verificación de tu número de seguridad con %1$s desde otro dispositivo - No se ha podido recibir un mensaje de %1$s + No se ha podido entregar un mensaje de %1$s %1$s ha cambiado su número de teléfono. ¿Te gusta esta nueva función? ¡Ayuda a Signal con una donación puntual! @@ -1966,6 +1968,7 @@ +%1$d invitación +%1$d invitaciones + %1$d grupo más %1$d grupos más @@ -1992,6 +1995,7 @@ No se ha encontrado ningún dispositivo. Error de red. Código QR no válido. + Tienes demasiados dispositivos vinculados. Elimina alguno. Este código QR no es válido. ¿Vincular un dispositivo a tu cuenta de Signal? @@ -2014,11 +2018,13 @@ Enviar frase de contraseña Frase de contraseña no válida. Desbloquear Molly + Molly Android: Pantalla de bloqueo Mapa + Situar marcador Aceptar dirección @@ -2157,8 +2163,8 @@ - %1$d persona no se añadirá a la llamada. - %1$d personas no se añadirán a la llamada. + No se añadirá a %1$d persona a la llamada. + No se añadirá a %1$d personas a la llamada. Denegar todas @@ -2500,7 +2506,7 @@ Ver - No se han encontrado resultados para \"%1$s\" + No se ha encontrado ningún resultado para \"%1$s\" @@ -2522,6 +2528,7 @@ Mensaje de Signal + Más @@ -2553,6 +2560,7 @@ No hay ningún sticker instalado Los stickers que recibas en mensajes aparecerán aquí Sin nombre + Desconocido @@ -2774,6 +2782,7 @@ El archivo multimedia ya no está disponible. No se ha podido reproducir el archivo. + Error al encontrar el mensaje. No se puede encontrar una aplicación para compartir este archivo. Cerrar @@ -2845,6 +2854,7 @@ Mensajes Llamadas + Fallos Copias de seguridad Estado de bloqueo @@ -2854,6 +2864,7 @@ Desconocido Notas de voz Alguien comienza a usar Signal + No hay actividad disponible para abrir los ajustes del canal de notificaciones. Conexión en segundo plano @@ -2877,7 +2888,7 @@ Buscar Buscar chats sin leer - Buscar chats, personas y mensajes + Buscar chats, contactos y mensajes Cerrar @@ -3046,7 +3057,7 @@ No, gracias - Permite el acceso a tus contactos. Tus contactos están cifrados y no son visibles para el servicio de Signal. + Permite el acceso a tus contactos. Tus contactos están protegidos mediante cifrado y no son visibles para Signal. Molly necesita acceso a tus contactos para poder mostrarlos. @@ -3295,8 +3306,8 @@ Fallo en la entrega - No se ha podido recibir un mensaje, sticker, reacción o notificación de lectura de %1$s. Puede haberlo enviado en un chat privado o en un grupo común. - No se ha podido recibir un mensaje, sticker, reacción o notificación de lectura de %1$s. + No se ha podido entregar un mensaje, sticker, reacción o confirmación de lectura que %1$s te ha enviado directamente o en un chat grupal en común. + No se ha podido entregar un mensaje, sticker, reacción o confirmación de lectura de %1$s. Nombre (obligatorio) @@ -3422,13 +3433,13 @@ Describe el problema detalladamente para ayudarnos a entender la incidencia. Selecciona una opción - Algo no está funcionando - Solicitud de función + Hay algo que no funciona bien + Solicitar función Pregunta Feedback Otros Pagos (MobileCoin) - Donaciones; Insignias + Donaciones e insignias Envío de registro de depuración de Android Signal @@ -3638,10 +3649,12 @@ El historial completo de mensajes se eliminará de forma permanente de todos tus dispositivos. Esta acción no se puede deshacer. Borrar todos ahora + Para siempre 1 año 6 meses 30 días + Ninguna %1$s mensaje @@ -3666,6 +3679,7 @@ Mostrar Tono de llamada Tamaño de fuente de los mensajes + Prioridad Solución de problemas con las notificaciones @@ -3799,7 +3813,7 @@ Contactos - Encuentra a las personas que conoces. Tus contactos están cifrados y no son visibles para el servicio Signal. + Encuentra a personas que ya conoces. Tus contactos están protegidos mediante cifrado y no son visibles para Signal. Llamadas telefónicas @@ -3894,6 +3908,7 @@ Escanea el código QR de la persona que recibirá el pago + Solicitar Pagar Saldo disponible: %1$s @@ -4025,6 +4040,7 @@ Puedes fijar hasta %1$d chats destacados + Foto de contacto Archivados @@ -4033,6 +4049,10 @@ Nuevo chat Abrir cámara Todavía no hay chats.\nComienza a chatear con tus amistades. + + No hay chats para mostrar + + Ajustes de las carpetas @@ -4265,6 +4285,7 @@ Copias de seguridad de los chats Transferir cuenta Transferir cuenta a un dispositivo Android nuevo + Introducir contraseña de la copia de seguridad Restaurar No se pueden importar nuevas copias de seguridad @@ -4472,6 +4493,7 @@ No se han podido abrir los ajustes de Wi-Fi. Activa manualmente el Wi-Fi. + Permitir acceso a la ubicación Activar servicios de ubicación Activar Wi-Fi @@ -4693,7 +4715,7 @@ Eliminar %1$s en tu cuenta de pagos Código de país no especificado Número no especificado - El número de teléfono que has introducido no coincide con el de tu cuenta. + El número de teléfono que has introducido no coincide con el de tu cuenta de Signal. ¿Seguro que quieres eliminar tu cuenta? Esta acción elimina tu cuenta de Signal y reinicia la aplicación. Signal se cerrará después de completarse el proceso. Fallo al eliminar los datos locales. Puedes hacerlo manualmente desde los ajustes del sistema para la aplicación. @@ -4725,6 +4747,7 @@ Compartir + Enviar , %1$s @@ -4931,7 +4954,7 @@ Datos de tu cuenta - Exporta un informe de los datos de tu cuenta de Signal. Este informe no incluye ningún mensaje o archivo multimedia. %1$s + Exporta un informe de los datos de tu cuenta de Signal. Este informe no incluye ningún mensaje ni archivo multimedia. %1$s Más información @@ -4966,7 +4989,7 @@ Generando informe… - Tu informe solo se genera en el momento de la exportación y Signal no lo almacena en tu dispositivo. + Tu informe solo se genera en el momento en que se exporta y Signal no lo almacena en tu dispositivo. Puedes cambiar tu número de teléfono a uno nuevo. Este cambio es irreversible.\n Antes de continuar, comprueba que tu número nuevo puede recibir SMS o llamadas. @@ -4982,7 +5005,7 @@ Número de teléfono anterior Tu número nuevo Número de teléfono nuevo - El número introducido no coincide con el de tu cuenta de Signal. + El número de teléfono que has introducido no coincide con el de tu cuenta de Signal. Debes especificar el código de país de tu número anterior Debes especificar tu número de teléfono anterior Debes especificar el código de país de tu número nuevo @@ -5028,6 +5051,119 @@ Teclado Enviar con Intro + + Carpetas de chats + + Añadir una carpeta de chats + + + + Organiza tus chats en carpetas y cambia rápidamente de una a otra en tu lista de chats. + + Carpetas + + Nueva carpeta + + Todos los chats + + Carpetas sugeridas + + No leídos + + Mensajes no leídos de todos los chats + + Chats individuales + + Solo mensajes de chats directos + + Grupos + + Solo mensajes de chats grupales + + Añadir + + Carpeta añadida: %1$s + + Editar carpeta + + Eliminar carpeta + + Añadir nueva carpeta + + Silenciar todos + + Reordenar carpetas + + Marcar todos como leídos + + + %1$d tipo de chat + %1$d tipos de chat + + + + %1$d chat + %1$d chats + + + + %1$d chat excluido + %1$d chats excluidos + + + + + Nueva carpeta + + Nombre de la carpeta (obligatorio) + + Chats incluidos + + Añadir chats + + Selecciona los chats que quieres que aparezcan en esta carpeta. + + Excepciones + + Excluir chats + + Selecciona los chats que no quieres que aparezcan en esta carpeta. + + Mostrar solo los chats no leídos + + Cuando esta opción está habilitada, solo se mostrarán en esta carpeta los chats con mensajes no leídos. + + Considerar chats silenciados + + Crear + + ¿Crear carpeta? + + ¿Quieres crear la carpeta de chats \"%1$s\"? + + Crear carpeta + + Editar carpeta + + Guardar + + ¿Guardar cambios? + + ¿Quieres guardar los cambios que has hecho en esta carpeta de chats? + + Guardar cambios + + Descartar + + Eliminar carpeta + + ¿Eliminar esta carpeta de chats? + + + + Tipos de chat + + Listo Mensajes @@ -5111,8 +5247,9 @@ Licencia GNU AGPLv3 - Calidad de fotos y vídeos - Calidad de fotos y vídeos enviados + Calidad de archivos multimedia + + Calidad de fotos y vídeos Si seleccionas la opción de alta calidad, se usarán más datos. Alta @@ -5154,7 +5291,7 @@ Donar a Signal - Signal se mantiene gracias a gente como tú. Dona mensualmente y recibe una insignia. + Personas como tú hacen que Signal sea una realidad. Haz una donación mensual y recibe una insignia para lucir en tu perfil. Donar @@ -5177,7 +5314,7 @@ Apoya la misión de Signal - Signal se mantiene gracias a gente como tú. Dona y recibe una insignia para tu perfil. + Personas como tú hacen que Signal sea una realidad. Haz tu donación y recibe una insignia para lucir en tu perfil. Ahora no Donar @@ -5474,9 +5611,9 @@ %1$s apoya a Signal - %1$s apoya a Signal con una donación mensual. Signal es una asociación sin ánimo de lucro, sin anuncios ni fondos de inversión, sostenida por gente como tú. + %1$s apoya a Signal con una donación mensual. Al ser una organización sin ánimo de lucro, sin anuncios ni inversores, Signal se sostiene gracias al apoyo de personas como tú. - %1$s apoya a Signal con una donación. Signal es una asociación sin ánimo de lucro, sin anuncios ni fondos de inversión, sostenida por gente como tú. + %1$s apoya a Signal con una donación. Al ser una organización sin ánimo de lucro, sin anuncios ni inversores, Signal se sostiene gracias al apoyo de personas como tú. Insignia @@ -5514,10 +5651,10 @@ Mostrar en mi perfil Insignia a mostrar Continuar - Si tienes más de una insignia, puedes seleccionar cuál mostrar en tu perfil a otras personas. + Si tienes más de una insignia, puedes seleccionar cuál quieres que otras personas vean en tu perfil. Consigue insignias para tu perfil al ayudar a Signal. - Signal es una organización sin ánimo de lucro, sin anuncios ni inversores. Nuestra misión se sostiene únicamente gracias al apoyo de personas como tú. + Al ser una organización sin ánimo de lucro, sin anuncios ni inversores, Signal se sostiene gracias al apoyo de personas como tú. Donar a Signal @@ -5697,11 +5834,11 @@ El número CVC de tu tarjeta es incorrecto. Actualízalo en Google Pay e inténtalo de nuevo. - Tu tarjeta no dispone de fondos suficientes para completar esta compra. Inténtalo con otro método de pago. + Tu tarjeta no dispone de fondos suficientes para completar este pago. Inténtalo con otro método de pago. - El mes de vencimiento de tu método de pago no es correcto. Actualízalo en Google Pay e inténtalo de nuevo. + El mes de vencimiento de tu método de pago es incorrecto. Actualízalo en Google Pay e inténtalo de nuevo. - El año de vencimiento de tu método de pago no es correcto. Actualízalo en Google Pay e inténtalo de nuevo. + El año de vencimiento de tu método de pago es incorrecto. Actualízalo en Google Pay e inténtalo de nuevo. Intenta completar la donación de nuevo o contacta a tu banco para más información. @@ -5717,15 +5854,15 @@ El número CVC de tu tarjeta es incorrecto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. - El mes de vencimiento de tu tarjeta no es correcto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. + El mes de vencimiento de tu tarjeta es incorrecto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. - El año de vencimiento de tu tarjeta no es correcto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. + El año de vencimiento de tu tarjeta es incorrecto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. - Tu número de tarjeta no es correcto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. + Tu número de tarjeta es incorrecto. Comprueba que los datos de tu tarjeta son correctos e inténtalo de nuevo. - La cuenta bancaria proporcionada no tiene fondos suficientes para completar esta compra. Vuelve a intentarlo o contacta con tu banco para obtener más información. + La cuenta bancaria proporcionada no tiene fondos suficientes para completar este pago. Vuelve a intentarlo o contacta con tu banco para obtener más información. Esta donación fue revocada por el titular de la cuenta y no pudo procesarse. No se te ha cobrado. @@ -6618,7 +6755,7 @@ Correo - ¿Dónde encuentro los datos bancarios? + ¿Dónde encuentro mis datos bancarios? Donar %1$s/mes @@ -6678,7 +6815,7 @@ Más información - Hecho + Listo No se ha podido procesar la donación @@ -6692,9 +6829,9 @@ Donación completada - Se ha recibido tu transferencia bancaria. Puedes añadir esta insignia en tu perfil para mostrar que apoyas a Signal. + Hemos recibido tu transferencia bancaria. Puedes añadir esta insignia a tu perfil para mostrar que apoyas a Signal. - Hecho + Listo Cancelando… @@ -6972,7 +7109,7 @@ Compartir enlace - Hecho + Listo No se puede compartir el enlace de la llamada. @@ -7057,7 +7194,7 @@ Reiniciar - Hecho + Listo Código @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Tu suscripción al plan de copias de seguridad ha caducado - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Tu plan de copia de seguridad ha caducado porque no se ha podido renovar con tu método de pago actual. Transcurrido %1$d día, se eliminarán los archivos multimedia de tu copia de seguridad. + Tu plan de copia de seguridad ha caducado porque no se ha podido renovar con tu método de pago actual. Transcurridos %1$d días, se eliminarán los archivos multimedia de tu copia de seguridad. Puedes volver a pagar por las copias de seguridad en cualquier momento para seguir haciendo copias de todos tus archivos multimedia. @@ -7254,9 +7391,9 @@ Si eliges \"Omitir\", los archivos multimedia de tu copia de seguridad se eliminarán en %1$d días. - Your backups subscription failed to renew + No se ha renovar tu suscripción al plan de copias de seguridad - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Asegúrate de que tu método de pago esté actualizado. Toca \"Gestionar suscripción\" y, en Métodos de pago, selecciona \"Actualizar\". Copia de seguridad incompleta @@ -7268,7 +7405,7 @@ Gestionar suscripción - Subscribe for %1$s/month + Suscríbete por %1$s/mes Descargar archivos @@ -7303,6 +7440,17 @@ %1$s de %2$s + + + Cancelar descarga + + Descargando: %1$s de %2$s (%3$s %%) + + No hay suficiente espacio para descargar tu copia de seguridad. Para continuar, libera %1$s de espacio. + + Omitir descarga + + "No se ha podido completar tu última copia de seguridad. Asegúrate de que tu teléfono esté conectado a una red Wi-Fi y toca \"Iniciar copia\" para volver a intentarlo." @@ -7356,18 +7504,18 @@ La optimización de almacenamiento solo se puede utilizar con el nivel de pago de las copias de seguridad de Signal. Actualiza tu plan de copias de seguridad para empezar a usar esta función. - Subscribe for %1$s/month + Suscríbete por %1$s/mes - This media is no longer available + Este archivo ya no está disponible - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Tu plan de copia de seguridad actual de Signal incluye tu último día de archivos multimedia. Para comenzar a hacer una copia de seguridad de todos tus archivos, actualiza tu suscripción ahora. + Tu plan de copia de seguridad actual de Signal incluye tus últimos %1$d días de archivos multimedia. Para comenzar a hacer una copia de seguridad de todos tus archivos, actualiza tu suscripción ahora. - Subscribe for %1$s/month + Suscríbete por %1$s/mes Ahora, la eliminación de mensajes se sincroniza en todos tus dispositivos @@ -7415,6 +7563,8 @@ Descarga completa La copia de seguridad se creará durante la noche. + + Suscripción inactiva Plan de copias de seguridad @@ -7423,8 +7573,12 @@ %1$s/mes Tu plan de copias de seguridad es gratis - + Se renueva el %1$s + + Caduca el %1$s + + Caduca el %1$s Haz una copia de seguridad de tu historial de mensajes para no perder ningún dato cuando compras un teléfono nuevo o reinstalas Molly. @@ -7469,6 +7623,10 @@ Copia de seguridad manual Introduce el PIN, la contraseña o el patrón de tu dispositivo. + + Volver a habilitar copias + + Se han desactivado las copias de seguridad y se han eliminado tus datos del servicio de almacenamiento seguro de Signal. @@ -7488,7 +7646,7 @@ La clave de tu copia de seguridad - La clave de tu copia de seguridad es un código de 64 dígitos que te permite restaurar tu copia de seguridad cuando vuelves a instalar Molly. + La clave de tu copia de seguridad es un código de 64 dígitos que te permite restaurar tu copia de seguridad cuando vuelves a instalar Molly. Si olvidas tu clave, no podrás restaurar tu copia de seguridad. Molly no puede ayudarte a recuperar tu copia de seguridad. @@ -7500,7 +7658,7 @@ Se necesita esta clave para recuperar tu cuenta y tus datos. Guárdala en un lugar seguro. Si la pierdes, no podrás recuperar tu cuenta. - Copiar en el portapapeles + Copiar al portapapeles Siguiente diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 6d87af73f0..51ced187ab 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -365,6 +365,8 @@ Vestlused Sõnumid + + Vestluste tüübid Sõnum %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Ongi valmis. Alusta kohe varundamisega. Olenevalt varukoopia suurusest võib selleks kuluda palju aega. Varundamise ajal saad oma telefoni tavapäraselt kasutada. @@ -1966,6 +1968,7 @@ +%1$d kutsutud +%1$d kutsutud + %1$d lisagrupp %1$d lisagrupp @@ -1992,6 +1995,7 @@ Seadet ei leitud. Võrgu viga. Sobimatu QR-kood. + Vabandust, sul on juba liiga palju seadmeid lingitud, proovi mõned eemaldada Vabandust, see ei ole sobiv seadme linkimise QR-kood. Lingid Signali seadme? @@ -2014,11 +2018,13 @@ Saada salasõna Sobimatu salasõna! Lukusta Molly lahti + Molly Android: ekraanilukk Kaart + Kukuta nööpnõel Kinnita aadress @@ -2522,6 +2528,7 @@ Signali sõnum + Rohkem @@ -2553,6 +2560,7 @@ Kleepse pole paigaldatud Kleepsud sissetulevatelt sõnumitelt kuvatakse siin Nimetu + Tundmatu @@ -2774,6 +2782,7 @@ Meedia ei ole enam saadaval. Meediat ei saa esitada. + Viga sõnumi leidmisel. Ei leia rakendust, mis oleks võimeline seda meediafaili jagama. Sulge @@ -2845,6 +2854,7 @@ Sõnumid Kõned + Ebaõnnestumised Varukoopiad Luku olek @@ -2854,6 +2864,7 @@ Tundmatu Häälmärkmed Kontakt liitus Signaliga + Teavituste kanali sätete avamiseks pole tegevusi. Taustaühendus @@ -3638,10 +3649,12 @@ Kogu sõnumiajalugu kustutatakse püsivalt. Seda toimingut ei saa tagasi võtta. Kustuta kõik kohe + Igaveseks 1 aasta 6 kuud 30 päeva + Puudub %1$s sõnum @@ -3666,6 +3679,7 @@ Kuva Helin Sõnumi fondisuurus + Prioriteet Teavituste tõrkeotsing @@ -3894,6 +3908,7 @@ Sisesta makse saaja QR-koodi aadress + Taotlus Maksa Saadavalolev saldo: %1$s @@ -4025,6 +4040,7 @@ Sa saad kinnitada kuni %1$d vestlust + Kontakti foto pilt Arhiveeritud @@ -4033,6 +4049,10 @@ Uus vestlus Ava kaamera Vestlused puuduvad.\nTee algust ja saada sõbrale sõnum. + + Kuvamiseks ei ole ühtegi vestlust + + Kausta sätted @@ -4265,6 +4285,7 @@ Vestluste varukoopiad Kanna konto üle Kanna konto üle uude Android-seadmesse + Sisesta varukoopia salasõna Taasta Uuematest Signali versioonidest ei saa varukoopiaid importida @@ -4472,6 +4493,7 @@ WiFi sätete avamine ei õnnestunud. Palun lülita WiFi käsitsi sisse. + Luba juurdepääs asukohale Lülita sisse asukohateenused Lülita Wi-Fi sisse @@ -4725,6 +4747,7 @@ Jaga + Saada , %1$s @@ -5028,6 +5051,119 @@ Klaviatuur Saada Enter-klahviga + + Vestluste kaustad + + Lisa vestluste kaust + + + + Sorteeri oma vestlused kaustadesse ja lülitu nende vahel kiiresti ja mugavalt vestluse loendi kaudu. + + Kaustad + + Loo kaust + + Kõik vestlused + + Soovitatud kaustad + + Mitteloetud + + Lugemata sõnumid kõigist vestlustest + + Üks-ühele vestlused + + Ainult sõnumid otsevestlustest + + Grupid + + Ainult sõnumid grupivestlustest + + Lisa + + Lisatud kaust: „%1$s“. + + Muuda kausta + + Kustuta kaust + + Lisa uus kaust + + Vaigista kõik + + Muuda kaustade järjestust + + Märgi kõik loetuks + + + %1$d vestluse tüüp + %1$d vestluse tüüpi + + + + %1$d vestlus + %1$d vestlust + + + + %1$d vestlus välja arvatud + %1$d vestlust välja arvatud + + + + + Loo kaust + + Kausta nimi (kohustuslik) + + Kaustas olevad vestlused + + Lisa vestlusi + + Vali vestlused, mida tahaksid selles kaustas näha. + + Erandid + + Jäta vestlusi välja + + Vali vestlused, mida sa ei taha selles kaustas näha. + + Näita ainult lugemata vestlusi + + Kui see on sisse lülitatud, kuvatakse selles kaustas ainult lugemata sõnumitega vestlusi. + + Kaasa vaigistatud vestlused + + Loo + + Kas luua kaust? + + Kas soovid luua vestluste kausta „%1$s“? + + Loo kaust + + Muuda kausta + + Salvesta + + Kas salvestada muudatused? + + Kas soovid salvestada selle vestluste kaustaga tehtud muudatused? + + Salvesta muudatused + + Loobu + + Kustuta kaust + + Kas kustutada see vestluste kaust? + + + + Vestluste tüübid + + Valmis Sõnumid @@ -5112,6 +5248,7 @@ Meedia kvaliteet + Saadetud meedia kvaliteet Kõrge kvaliteediga meedia saatmine kasutab rohkem andmesidet. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Sinu varundamiste tellimus lõppes - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Sinu varundamise plaan on aegunud, sest me ei saanud seda su praeguse maksemeetodiga uuendada. %1$d päeva pärast varukoopias olev meedia kustutatakse. + Sinu varundamise plaan on aegunud, sest me ei saanud seda su praeguse maksemeetodiga uuendada. %1$d päeva pärast varukoopias olev meedia kustutatakse. Selleks, et oma meedia varundamist jätkata, saad igal ajal uuesti varundamise eest tasumist alustada. @@ -7254,9 +7391,9 @@ Kui valid „Jäta vahele“, kustutatakse su varukoopias olev meedia %1$d päeva pärast. - Your backups subscription failed to renew + Sinu varukoopiate tellimust ei saanud uuendada - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Palun veendu, et sinu maksemeetod on ajakohane. Toksa Halda tellimust ning seejärel Maksete all Uuenda. Varundamine ei õnnestunud @@ -7268,7 +7405,7 @@ Tellimuse haldamine - Subscribe for %1$s/month + Telli hinnaga %1$s kuus Lae meedia alla @@ -7303,6 +7440,17 @@ %1$s / %2$s + + + Tühista allalaadimine + + Allalaadimine: %1$s kogumahust %2$s (%3$s%%) + + Sinu varukoopia allalaadimiseks ei ole piisavalt ruumi. Jätkamiseks vabasta %1$s ruumi. + + Jäta allalaadimine vahele + + "Sinu viimast varukoopiat ei saanud lõpule viia. Veendu, et sinu telefon on Wi-Figa ühendatud ning toksa Varunda nüüd, et uuesti proovida." @@ -7356,18 +7504,18 @@ Salvestusruumi saab optimeerida ainult Signali tasulise varundamise tasemega. Selle funktsiooni kasutamiseks uuenda oma varundamisplaani. - Subscribe for %1$s/month + Telli hinnaga %1$s kuus - This media is no longer available + See meedia ei ole enam saadaval - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Sinu praegune Signali varundamise plaan sisaldab viimase %1$d päeva meediat. Uuenda tellimust, et alustada kogu meedia varundamist. + Sinu praegune Signali varundamise plaan sisaldab viimase %1$d päeva meediat. Uuenda tellimust, et alustada kogu meedia varundamist. - Subscribe for %1$s/month + Telli hinnaga %1$s kuus Kustutamine on nüüd kõigi su seadmete üleselt sünkroniseeritud @@ -7415,6 +7563,8 @@ Allalaadimine on lõpetatud Varukoopia luuakse öösel. + + Tellimus on mitteaktiivne Varundamisplaan @@ -7423,8 +7573,12 @@ %1$s/kuu Sul on tasuta varundamisplaan - + Uueneb %1$s + + Aegub %1$s + + Aegus %1$s Varunda oma sõnumiajalugu, et mitte kaotada andmeid, kui telefoni välja vahetad ja Mollyi uuesti paigaldad. @@ -7469,6 +7623,10 @@ Varunda käsitsi Sisesta oma seadme PIN-kood, salasõna või muster. + + Luba varundamine uuesti + + Varundamine on välja lülitatud ja sinu andmed on Signali turvalisest salvestusteenusest kustutatud. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index f5094b4da6..dec37d7e83 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -365,6 +365,8 @@ Txatak Mezuak + + Txat motak Mezu %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Prest! Hasi babeskopia egiten. Babeskopiaren tamainaren arabera, baliteke luze jotzea. Babeskopia sortu bitartean, telefonoa normaltasunez erabil dezakezu. @@ -1966,6 +1968,7 @@ + %1$d gonbidatuta +%1$d gonbidatuta + talde %1$d gehiago %1$d talde gehiago @@ -1992,6 +1995,7 @@ Ez da gailurik aurkitu. Sare errorea. Baliogabeko QR kodea. + Zoritxarrez, gailu gehiegi dauzkazu lotuta, saia zaitez batzuk ezabatzen Barkatu, hau ez da gailua lotzeko baliozko QR kodea. Lotu Signal gailu bat? @@ -2014,11 +2018,13 @@ Bidali pasaesaldia Pasaesaldi baliogabea! Desblokeatu Molly + Molly Android - Blokeatu pantaila Mapa + Baztertu pin-a Onartu helbidea @@ -2522,6 +2528,7 @@ Signal mezua + Gehiago @@ -2553,6 +2560,7 @@ Ez dago eranskailurik instalatuta Jasotako mezuetako eranskailuak hemen agertuko dira Izenbururi gabe + Ezezaguna @@ -2774,6 +2782,7 @@ Medioa jada ez dago eskuragarri. Ezin da erreproduzitu multimedia-edukia. + Errore bat gertatu da mezua bilatzean. Ez da topatu multimedia eduki hau partekatzeko gai den aplikaziorik. Itxi @@ -2845,6 +2854,7 @@ Mezuak Deiak + Hutsegiteak Babeskopiak Blokeo egoera @@ -2854,6 +2864,7 @@ Ezezaguna Ahots Oharrak Kontaktua orain Signalen dago + Ez dago jakinarazpen-kanalaren ezarpenak irekitzeko jarduerarik. Atzeko planoko konexioa @@ -3638,10 +3649,12 @@ Mezuen historia betiko ezabatu da gailu guztietan. Ekintza hau ezin da desegin. Ezabatu dena orain + Betirako Urte 1 6 hilabete 30 egun + Bat ere ez %1$s mezu @@ -3666,6 +3679,7 @@ Erakutsi Doinua Mezuaren letra-tipoaren tamaina + Lehentasuna Konpondu jakinarazpenak @@ -3894,6 +3908,7 @@ Eskaneatu onuradunaren helbidearen QR kodea. + Eskaera Ordaindu Balantze eskuragarria :%1$s @@ -4025,6 +4040,7 @@ Gehienez %1$d txat aingura ditzakezu + Kontaktuaren argazkia Artxibatuta @@ -4033,6 +4049,10 @@ Txat berria Ireki kamera Ez dago txatik.\nBidali mezu bat lagun bati. + + Ez dago txatik erakusteko + + Karpetaren ezarpenak @@ -4265,6 +4285,7 @@ Txaten babeskopiak Transferitu kontua Transferitu kontua Android gailu berri batera + Idatzi babeskopiaren pasaesaldia Berreskuratu Ezin dira inportatu Signal bertsio berrien babeskopiak @@ -4472,6 +4493,7 @@ Ezin dira Wi-Fi ezarpenak ireki. Mesedez, aktibatu Wi-Fi eskuz. + Eman kokapen-baimena Aktibatu kokapen zerbitzuak Aktibatu Wi-Fi-a @@ -4725,6 +4747,7 @@ Elkarbanatu + Bidali , %1$s @@ -5028,6 +5051,119 @@ Teklatua Bidali \"Sartu\" tekla sakatzean + + Txat-karpetak + + Gehitu txat-karpeta bat + + + + Antolatu txatak karpetatan eta joan bizkor batetik bestera txat-zerrendan. + + Karpetak + + Sortu karpeta bat + + Txat guztiak + + Iradokitako karpetak + + Irakurri gabeak + + Txat guztietako mezu irakurri gabeak + + Banako txatak + + Zuzeneko txatetako mezuak bakarrik + + Taldeak + + Taldeko txatetako mezuak bakarrik + + Gehitu + + Gehitu da %1$s karpeta. + + Editatu karpeta + + Ezabatu karpeta + + Gehitu karpeta berri bat + + Desaktibatu denen jakinarazpenak + + Antolatu karpetak + + Irakurritako gisa markatu guztiak + + + %1$d txat mota + %1$d txat mota + + + + %1$d txat + %1$d txat + + + + %1$d txat atera da + %1$d txat atera dira + + + + + Sortu karpeta bat + + Karpetaren izena (beharrezkoa) + + Karpetako txatak + + Gehitu txatak + + Aukeratu karpeta honetan agertzea nahi duzun txatak. + + Salbuespenak + + Atera txatak + + Aukeratu karpeta honetan agertzerik nahi ez duzun txatak. + + Erakutsi irakurri gabeko txatak soilik + + Gaitzen baduzu, irakurri gabeko mezuak dituzten txatak bakarrik agertuko dira karpeta honetan. + + Sartu jakinarazpenak desaktibatuta dauzkaten txatak + + Sortu + + Karpeta sortu nahi duzu? + + \"%1$s\" txat-karpeta sortu nahi duzu? + + Sortu karpeta bat + + Editatu karpeta + + Gorde + + Aldaketak gorde nahi dituzu? + + Txat-karpeta honetan egindako aldaketak gorde nahi dituzu? + + Gorde aldaketak + + Baztertu + + Ezabatu karpeta + + Txat-karpeta hau ezabatu nahi duzu? + + + + Txat motak + + Eginda Mezuak @@ -5112,6 +5248,7 @@ Media kalitatea + Bidali media kalitatea Kalitate handiko multimedia bidaltzeak datu gehiago erabiliko ditu. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Babeskopien harpidetza iraungi egin da - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Babeskopien plana iraungi egin da, ezin izan baita berritu oraingo ordainketa-metodoarekin. %1$d egun igarotakoan, babeskopiako multimedia-edukia ezabatu egingo da. + Babeskopien plana iraungi egin da, ezin izan baita berritu oraingo ordainketa-metodoarekin. %1$d egun igarotakoan, babeskopiako multimedia-edukia ezabatu egingo da. Multimedia-edukiaren babeskopiak egiten jarraitzeko, babeskopiak berriro ordaintzen has zaitezke. @@ -7254,9 +7391,9 @@ \"Saltatu\" aukeratzen baduzu, babeskopiako multimedia-edukia %1$d egunen buruan ezabatuko da. - Your backups subscription failed to renew + Ezin izan da berritu babeskopien harpidetza - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Egiaztatu ordainketa-metodoa eguneratuta daukazula. Sakatu \"Kudeatu harpidetza\" eta, \"Ordainketa-metodoak\" atalean, sakatu Eguneratu. Ezin izan da osatu babeskopia @@ -7268,7 +7405,7 @@ Kudeatu harpidetza - Subscribe for %1$s/month + Harpidetu hilean %1$s ordainduta Deskargatu multimedia-edukia @@ -7303,6 +7440,17 @@ %1$s / %2$s + + + Utzi deskarga bertan behera + + %1$s/%2$s deskargatzen (%% %3$s) + + Ez dago nahikoa tokirik babeskopia deskargatzeko. Aurrera egiteko, utzi %1$s libre. + + Saltatu deskarga + + "Ezin izan da osatu azken babeskopia. Ziurtatu telefonoa wifira konektatuta dagoela eta, berriro saiatzeko, sakatu Egin babeskopia orain." @@ -7356,18 +7504,18 @@ Biltegia optimizatzeko aukera erabiltzeko, Signal-en Babeskopiak eginbidearen ordainpeko mailaren batean egon behar duzu. Eginbide hau erabiltzen hasteko, igo babeskopia-plana mailaz. - Subscribe for %1$s/month + Harpidetu hilean %1$s ordainduta - This media is no longer available + Multimedia-eduki hau jada ez dago erabilgarri - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Zure Signal-eko babeskopia-planak %1$d eguneko multimedia-eduki berriena hartzen du barnean. Multimedia-eduki guztiaren babeskopia egiten hasteko, igo mailaz. + Zure Signal-eko babeskopia-planak %1$d eguneko multimedia-eduki berriena hartzen du barnean. Multimedia-eduki guztiaren babeskopia egiten hasteko, igo mailaz. - Subscribe for %1$s/month + Harpidetu hilean %1$s ordainduta Orain, ezabatzeko ekintza gailu guztietan sinkronizatzen da @@ -7415,6 +7563,8 @@ Deskarga osatuta Babeskopia gauez sortuko da. + + Harpidetza inaktibo dago Babeskopia-plana @@ -7423,8 +7573,12 @@ %1$s/hilabete Zure babeskopia-plana doakoa da - + Berritze-data: %1$s + + Iraungitze-data: %1$s + + Iraungitze-data: %1$s Egin mezu-historiaren babeskopia, gailuz aldatzean edo Molly berriro instalatzean ez dezazun daturik galdu. @@ -7469,6 +7623,10 @@ Egin babeskopiak eskuz Sartu gailuaren PIN, pasahitz edo patroia. + + Gaitu babeskopiak berriro + + Babeskopiak desaktibatu egin dira, eta zure datuak ezabatu egin dira Signal-en biltegiratze-zerbitzu segurutik. diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 60cf837b47..84d060d383 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -365,6 +365,8 @@ گفتگوها پیام‌ها + + انواع گفتگوها ارسال پیام به %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + همه چیز آماده است. اکنون پشتیبان‌گیری را شروع کنید. بسته به اندازه پشتیبان، این امر ممکن است زمان زیادی طول بکشد. هنگام پشتیبان‌گیری، می‌توانید مثل همیشه از تلفن خود استفاده کنید. @@ -1966,6 +1968,7 @@ +%1$d دعوت شدند +%1$d دعوت شدند + %1$d گروه دیگر %1$d گروه دیگر @@ -1992,6 +1995,7 @@ هیچ دستگاهی یافت نشد. خطای شبکه. کد QR نامعتبر است. + پوزش، شما دارای دستگاه‌های پیوند داده شدهٔ زیادی هستید، سعی کنید تعدادی از آن‌ها را حذف کنید متاسفانه این کد QR برای اتصال دستگاه معتبر نيست. پیوند یک دستگاه سیگنال؟ @@ -2014,11 +2018,13 @@ ارسال گذرواژه گذرواژه معتبر نیست! باز کردن قفل سیگنال + سیگنال اندروید - صفحهٔ قفل نقشه + قرار دادن نشانگر پذیرفتن نشانی @@ -2522,6 +2528,7 @@ پیام سیگنال + بیشتر @@ -2553,6 +2560,7 @@ هیچ استیکری نصب نشده است استیکرهایی که از پیام‌های ورودی دریافت می‌شوند اینجا نمایش داده خواهند شد بدون نام + ناشناخته @@ -2774,6 +2782,7 @@ رسانه دیگر در دسترس نیست. پخش رسانه امکان‌پذیر نیست. + خطا در یافتن پیام. برنامه‌ای برای اشتراک‌گذاری این رسانه پیدا نشد. بستن @@ -2845,6 +2854,7 @@ پیام‌ها تماس‌ها + خرابی‌ها پشتیبان‌ها وضعیت قفل @@ -2854,6 +2864,7 @@ ناشناخته یادداشت‌های صوتی مخاطب به سیگنال پیوست + هیچ فعالیتی برای باز کردن تنظیمات کانال اعلان‌ها در دسترس نیست. اتصال پس‌زمینه @@ -3638,10 +3649,12 @@ کل تاریخچه پیام برای همیشه از همه دستگاه‌ها حذف خواهد شد. این کار بازگشت‌پذیر نیست. پاک کردن همه، اکنون + برای همیشه ۱ سال ۶ ماه ۳۰ روز + هیچ‌کدام %1$s پیام @@ -3666,6 +3679,7 @@ نمایش صدای زنگ اندازهٔ قلم پیام + اولویت اعلان‌های عیب‌یابی @@ -3894,6 +3908,7 @@ کد QR نشانی پرداخت شونده را اسکن کنید + درخواست پرداخت موجودی قابل برداشت: %1$s @@ -4025,6 +4040,7 @@ فقط تا %1$d مکالمه را می‌توانید سنجاق کنید + تصویر مخاطب بایگانی شده @@ -4033,6 +4049,10 @@ گفتگوی جدید باز کردن دوربین هنوز هیچ گفتگویی وجود ندارد.\n با پیام دادن به یک دوست شروع کنید. + + گفتگویی برای نمایش وجود ندارد + + تنظیمات پوشه @@ -4265,6 +4285,7 @@ پشتیبان‌های گفتگو انتقال حساب کاربری انتقال حساب کاربری به یک دستگاه اندروید‌ی جدید + وارد کردن گذرواژهٔ پشتیبان بازگردانی امکان وارد کردن پشتیبان از نسخه‌های جدیدتر سیگنال نیست @@ -4472,6 +4493,7 @@ باز کردن تنظیمات Wi-Fi ممکن نیست. لطفاً Wi-Fi را به صورت دستی روشن کنید. + اعطای مجوز مکان سرویس‌های مکان را روشن کنید روشن کردن Wi-Fi @@ -4725,6 +4747,7 @@ اشتراک‌گذاری + ارسال ، %1$s @@ -5028,6 +5051,119 @@ صفحه‌کلید ارسال با enter + + پوشه‌های گفتگو + + افزودن پوشه گفتگو + + + + گفتگوهای خود را در پوشه‌ها مرتب کنید و به‌سرعت بین آنها در فهرست گفتگوها جابه‌جا شوید. + + پوشه‌ها + + ایجاد پوشه + + همه گفتگوها + + پوشه‌های پیشنهادی + + خوانده‌نشده‌ها + + پیام‌های خوانده‌نشده‌ی همه گفتگوها + + گفتگوهای فرد به فرد + + فقط پیام‌ گفتگوهای مستقیم + + گروه‌ها‌ + + فقط پیام گفتگوهای گروهی + + افزودن + + پوشه %1$s اضافه شد. + + ویرایش پوشه + + حذف پوشه + + افزودن پوشه جدید + + بی‌صدا کردن همه + + تغییر ترتیب پوشه‌ها + + علامت‌گذاری همه به صورت خوانده شده + + + %1$d نوع گفتگو + %1$d نوع گفتگو + + + + %1$d گفتگو + %1$d گفتگو + + + + %1$d گفتگو شامل نشده است + %1$d گفتگو شامل نشده است + + + + + ایجاد پوشه + + نام پوشه (الزامی) + + گفتگوهای شامل‌شده + + افزودن گفتگو + + گفتگوهایی را که می‌خواهید در این پوشه باشند انتخاب کنید. + + موارد استثناء + + حذف گفتگو + + گفتگوهایی را که نمی‌خواهید در این پوشه باشند انتخاب کنید. + + فقط گفتگوهای خوانده‌نشده را نشان بده + + وقتی این گزینه فعال باشد، فقط گفتگوهایی که پیام‌های خوانده‌نشده دارند در این پوشه نشان داده می‌شود. + + گنجاندن گفتگوهای بی‌صداشده + + ایجاد + + پوشه ایجاد شود؟ + + می‌خواهید پوشه گفتگو «%1$s» را ایجاد کنید؟ + + ایجاد پوشه + + ویرایش پوشه + + ذخیره + + تغییرات ذخیره شود؟ + + آیا می‌خواهید تغییراتی را که در این پوشه گفتگو ایجاد کرده‌اید ذخیره کنید؟ + + ذخیره تغییرات + + دور انداختن + + حذف پوشه + + این پوشه گفتگو حذف شود؟ + + + + انواع گفتگوها + + انجام شد پیام‌ها @@ -5112,6 +5248,7 @@ کیفیت رسانه + کیفیت ارسال رسانه ارسال رسانه با کیفیت بالا از داده‌های بیشتری استفاده خواهد کرد. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + اشتراک نسخه پشتیبان شما منقضی شده است - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + طرح پشتیبان شما منقضی شده است زیرا با روش پرداخت فعلی‌تان قابل تمدید نیست. پس از %1$d روز، رسانه موجود در نسخه پشتیبان شما حذف خواهد شد. + طرح پشتیبان شما منقضی شده است زیرا با روش پرداخت فعلی شما قابل تمدید نیست. پس از %1$d روز، رسانه موجود در نسخه پشتیبان شما حذف خواهد شد. برای ادامه پشتیبان‌گیری از تمام رسانه‌های خود، می‌توانید هر زمان که خواستید دوباره هزینه پشتیبان‌گیری خود را پرداخت کنید. @@ -7254,9 +7391,9 @@ اگر «رد کردن» را انتخاب کنید، رسانه موجود در نسخه پشتیبان شما ظرف %1$d روز حذف خواهد شد. - Your backups subscription failed to renew + اشتراک نسخه پشتیبان شما تمدید نشد - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + بررسی کنید تا مطمئن شوید که روش پرداخت شما به‌روز است. روی «مدیریت اشتراک» ضربه بزنید و در قسمت «روش‌های پرداخت»، روی «به‌روزرسانی» ضربه بزنید. پشتیبان‌گیری انجام نشد @@ -7268,7 +7405,7 @@ مدیریت اشتراک - Subscribe for %1$s/month + اشتراک به‌قیمت %1$s در ماه اکنون رسانه را دانلود کنید @@ -7303,6 +7440,17 @@ %1$s از %2$s + + + لغو دانلود + + در حال دانلود: %1$s از %2$s (%3$s%%) + + فضای کافی برای دانلود نسخه پشتیبان وجود ندارد. برای ادامه، %1$s فضا خالی کنید. + + رد کردن دانلود + + "آخرین پشتیبان‌گیری شما انجام نشد. مطمئن شوید که تلفن‌تان به Wi-Fi وصل است و برای امتحان دوباره، روی «اکنون پشتیبان‌گیری شود» ضربه بزنید." @@ -7356,18 +7504,18 @@ بهینه‌سازی فضای ذخیره‌سازی فقط با نسخه پولی پشتیبان‌گیری سیگنال امکان‌پذیر است. برای استفاده از این قابلیت، طرح پشتیبان‌گیری خود را ارتقا دهید. - Subscribe for %1$s/month + اشتراک به‌قیمت %1$s در ماه - This media is no longer available + این رسانه دیگر در دسترس نیست - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + طرح پشتیبان فعلی سیگنال شما شامل رسانه %1$d روز اخیر است. برای شروع پشتیبان‌گیری از همه رسانه‌های خود، همین حالا به‌روزرسانی کنید. + طرح پشتیبان فعلی سیگنال شما شامل رسانه %1$d روز اخیر است. برای شروع پشتیبان‌گیری از همه رسانه‌های خود، همین حالا به‌روزرسانی کنید. - Subscribe for %1$s/month + اشتراک به‌قیمت %1$s در ماه اکنون حذف در همه دستگاه‌های شما همگام‌سازی می‌شود @@ -7415,6 +7563,8 @@ دانلود کامل شد پشتیبان‌گیری در طول شب انجام می‌شود. + + اشتراک غیرفعال است طرح پشتیبان @@ -7423,8 +7573,12 @@ %1$s در ماه طرح پشتیبان شما خالی است - + در %1$s تمدید می‌شود + + انقضا: %1$s + + انقضا: %1$s از تاریخچه پیام خود پشتیبان‌گیری کنید تا بعد از خرید تلفن جدید یا نصب مجدد سیگنال، هرگز اطلاعات خود را از دست ندهید. @@ -7469,6 +7623,10 @@ پشتیبان‌گیری دستی لطفا پین، رمز عبور یا الگوی دستگاه خود را وارد کنید. + + فعال‌سازی مجدد پشتیبان‌گیری‌ها + + پشتیبان‌گیری خاموش شده و داده‌های شما از سرویس ذخیره‌سازی امن سیگنال حذف شده است. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5571afd9f0..14e3668a14 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -365,6 +365,8 @@ Keskustelut Viestit + + Keskustelutyypit Viesti: %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Kaikki on valmista. Aloita varmuuskopiointi nyt. Varmuuskopion koosta riippuen tämä voi kestää pitkään. Voit käyttää puhelinta tavalliseen tapaan varmuuskopioinnin aikana. @@ -1966,6 +1968,7 @@ +%1$d kutsuttu +%1$d kutsuttu + %1$d toinen ryhmä %1$d muuta ryhmää @@ -1992,6 +1995,7 @@ Laitetta ei löytynyt. Verkkovirhe. Virheellinen QR-koodi. + Valitettavasti sinulla on jo liian monta laitetta yhdistettynä. Kokeile poistaa joitakin. Valitettavasti tämä ei ole laitteen yhdistämiseksi tarkoitettu QR-koodi. Yhdistetäänkö Signal-laite? @@ -2014,11 +2018,13 @@ Syötä salalause Salalause ei kelpaa! Avaa Mollyin lukitus + Molly Android - Lukitusnäyttö Kartta + Tee karttamerkintä Hyväksy osoite @@ -2522,6 +2528,7 @@ Signal-viesti + Lisää @@ -2553,6 +2560,7 @@ Tarroja ei ole asennettu Vastaanotetut tarrat näytetään tässä Nimetön + Tuntematon @@ -2774,6 +2782,7 @@ Media ei ole enää saatavilla. Mediasisältöä ei voi toistaa. + Virhe etsittäessä viestiä. Mikään sovellus ei tue tämän median jakamista. Sulje @@ -2845,6 +2854,7 @@ Viestit Puhelut + Viat Varmuuskopiot Lukituksen tila @@ -2854,6 +2864,7 @@ Tuntematon Ääniviestit Yhteystieto liittyi Signaliin + Ilmoituskanavan asetuksen avaavaa toimintaa ei ole saatavana. Taustayhteys @@ -3638,10 +3649,12 @@ Koko viestihistoria poistetaan pysyvästi kaikista laitteista. Toimintoa ei voi kumota. Tätä toimintoa ei voi perua. Poista kaikki nyt + Pysyvästi 1 vuosi 6 kuukautta 30 päivää + Ei mitään %1$s viesti @@ -3666,6 +3679,7 @@ Näytä Soittoääni Viestien tekstin koko + Prioriteetti Ilmoitusten vianetsintä @@ -3894,6 +3908,7 @@ Skannaa maksun saajan QR-koodi + Pyyntö Maksa Käytettävissä oleva saldo: %1$s @@ -4025,6 +4040,7 @@ Voit kiinnittää enintään %1$d keskustelua + Yhteystiedon kuva Arkistoitu @@ -4033,6 +4049,10 @@ Uusi keskustelu Avaa kamera Keskusteluita ei vielä ole.\nAloita lähettämällä viesti kaverillesi. + + Ei näytettäviä keskusteluja + + Kansion asetukset @@ -4265,6 +4285,7 @@ Keskustelujen varmuuskopiot Siirrä tili Siirrä tili uuteen Android-laitteeseen + Syötä varmuuskopion salalause Palauta Varmuuskopiota ei voi tuoda uudemmasta Signal-versiosta @@ -4472,6 +4493,7 @@ Wi-Fi-asetusten avaaminen ei onnistunut. Laita Wi-Fi päälle käsin. + Salli paikannus Laita päälle sijaintipalvelut Laita Wi-Fi päälle @@ -4725,6 +4747,7 @@ Jaa + Lähetä , %1$s @@ -5028,6 +5051,119 @@ Näppäimistö Lähetä enter-painikkeella + + Keskustelukansiot + + Lisää keskustelukansio + + + + Järjestä keskustelut kansioihin ja siirry nopeasti kansiosta toiseen keskusteluluettelossa. + + Kansiot + + Luo kansio + + Kaikki keskustelut + + Ehdotetut kansiot + + Lukemattomat + + Lukemattomat viestit kaikista keskusteluista + + Kahdenväliset keskustelut + + Vain viestit kahdenvälisistä keskusteluista + + Ryhmät + + Vain viestit ryhmäkeskusteluista + + Lisää + + Kansio %1$s lisätty. + + Muokkaa kansiota + + Poista kansio + + Lisää uusi kansio + + Mykistä kaikki + + Järjestä kansiot uudelleen + + Merkitse kaikki luetuiksi + + + %1$d keskustelutyyppi + %1$d keskustelutyyppiä + + + + %1$d keskustelu + %1$d keskustelua + + + + %1$d keskustelu suljettu pois + %1$d keskustelua suljettu pois + + + + + Luo kansio + + Kansion nimi (pakollinen) + + Sisältyvät keskustelut + + Lisää keskusteluja + + Valitse keskustelut, joiden haluat näkyvän kansiossa. + + Poikkeukset + + Sulje pois keskusteluja + + Valitse keskustelut, joiden et halua näkyvän tässä kansiossa. + + Näytä vain lukemattomat keskustelut + + Kun tämä on käytössä, kansiossa näytetään vain keskustelut, joissa on lukemattomia viestejä. + + Sisällytä mykistetyt keskustelut + + Luo + + Luodaanko kansio? + + Haluatko luoda keskustelukansion %1$s? + + Luo kansio + + Muokkaa kansiota + + Tallenna + + Tallennetaanko muutokset? + + Haluatko tallentaa keskustelukansioon tekemäsi muutokset? + + Tallenna muutokset + + Hylkää + + Poista kansio + + Poistetaanko keskustelukansio? + + + + Keskustelutyypit + + Valmis Viestit @@ -5112,6 +5248,7 @@ Median laatu + Lähetettävän median laatu Korkealaatuisen median lähetys kuluttaa enemmän dataa. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Varmuuskopioinnin tilauksesi on vanhentunut - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Varmuuskopiointitilauksesi on vanhentunut, koska sitä ei voitu uusia käytössä olevalla maksutavalla. Varmuuskopiossasi oleva media poistetaan %1$d päivän kuluttua. + Varmuuskopiointitilauksesi on vanhentunut, koska sitä ei voitu uusia käytössä olevalla maksutavalla. Varmuuskopiossasi oleva media poistetaan %1$d päivän kuluttua. Voit jatkaa varmuuskopiopalvelun maksamista uudelleen milloin tahansa jatkaaksesi kaiken mediasi varmuuskopiointia. @@ -7254,9 +7391,9 @@ Jos valitset Ohita, varmuuskopiossasi oleva media poistetaan %1$d päivän kuluttua. - Your backups subscription failed to renew + Varmuuskopiointitilauksesi uusiminen epäonnistui - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Varmista, että maksutapasi on ajan tasalla. Napauta Hallinnoi tilausta ja napauta Päivitä Maksutavat-kohdassa. Varmuuskopiointia ei voitu suorittaa loppuun @@ -7268,7 +7405,7 @@ Hallinnoi tilausta - Subscribe for %1$s/month + Tilaa hintaan %1$s / kk Lataa media nyt @@ -7303,6 +7440,17 @@ %1$s / %2$s + + + Peruuta lataus + + Ladataan: %1$s / %2$s (%3$s %%) + + Tila ei riitä varmuuskopion lataamiseen. Vapauta %1$s tilaa jatkaaksesi. + + Ohita lataus + + "Viimeistä varmuuskopiointia ei voitu suorittaa loppuun. Varmista, että puhelimesi on yhdistetty Wi-Fi-verkkoon, ja yritä uudelleen napauttamalla Varmuuskopioi nyt." @@ -7356,18 +7504,18 @@ Tallennustilan optimointia voidaan käyttää vain Signalin maksullisen varmuuskopiointitilauksen yhteydessä. Päivitä varmuuskopioinnin tilaus, jotta voit alkaa käyttää tätä ominaisuutta. - Subscribe for %1$s/month + Tilaa hintaan %1$s / kk - This media is no longer available + Media ei ole enää saatavilla - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Signal-varmuuskopioinnin tilauksesi sisältää viimeisen %1$d päivän mediasisällön. Päivitä tilaus, jotta voit aloittaa kaiken mediasisällön varmuuskopioinnin. + Signal-varmuuskopioinnin tilauksesi sisältää viimeisten %1$d päivän mediasisällön. Päivitä tilaus, jotta voit aloittaa kaiken mediasisällön varmuuskopioinnin. - Subscribe for %1$s/month + Tilaa hintaan %1$s / kk Poistaminen synkronoidaan nyt kaikkien laitteidesi välillä @@ -7415,6 +7563,8 @@ Lataus valmis Varmuuskopio luodaan yön aikana. + + Tilaus ei ole aktiivinen Varmuuskopioinnin tilaus @@ -7423,8 +7573,12 @@ %1$s/kk Varmuuskopioinnin tilaus on ilmainen - + Uusiutuu %1$s + + Päättyy %1$s + + Päättyi %1$s Varmuuskopioi viestihistoriasi, jotta et koskaan menetä tietoja, kun hankit uuden puhelimen tai asennat Mollyin uudelleen. @@ -7469,6 +7623,10 @@ Varmuuskopioi manuaalisesti Anna laitteesi PIN-koodi, salasana tai kuvio. + + Ota varmuuskopiot uudelleen käyttöön + + Varmuuskopiointi on poistettu käytöstä ja tietosi on poistettu Signalin suojatusta tallennuspalvelusta. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b0e8255c58..e9ce9698f3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -167,7 +167,7 @@ Numéro de carte non valide - Carte expirée + Carte arrivée à expiration CVC trop court @@ -177,7 +177,7 @@ Mois non valide - Année requise + Veuillez indiquer une année. Année non valide @@ -329,7 +329,7 @@ Mettre à jour Ne pas mettre à jour Avertissement - Votre version de Molly est expirée. Vous pouvez afficher l’historique de vos messages, mais vous ne pourrez pas échanger de messages tant que vous n’aurez pas mis Molly à jour. + Votre version de Molly est arrivée à expiration. Vous pouvez toujours afficher l\'historique de vos messages, mais vous ne pouvez pas en échanger. Pour envoyer et recevoir de nouveaux messages, merci de mettre à jour Molly. Navigateur web introuvable. @@ -365,6 +365,8 @@ Conversations Messages + + Types de conversations Message %1$s @@ -394,7 +396,7 @@ Non envoyé. Appuyer pour afficher des infos. - Envoi partiel. Appuyer pour afficher des infos. + Envoi partiel. Toucher pour afficher plus d\'infos. Non envoyé. %1$s a quitté le groupe. Envoi mis en pause @@ -566,17 +568,17 @@ L’enregistrement des %1$d médias dans l\'espace de stockage permettra à n’importe quelle autre appli de votre appareil d’y accéder.\n\nPoursuivre ? - Erreur d’enregistrement du fichier joint dans l\'espace de stockage ! - Erreur d’enregistrement des fichiers joints dans l\'espace de stockage ! + Impossible d\'enregistrer la pièce jointe dans l\'espace de stockage. + Impossible d\'enregistrer les pièces jointes dans l\'espace de stockage. Impossible d’écrire dans l\'espace de stockage - Enregistrement du fichier joint - Enregistrement de %1$d fichiers joints + Enregistrement de la pièce jointe + Enregistrement de %1$d pièces jointes - Enregistrement du fichier joint dans l\'espace de stockage… - Enregistrement de %1$d fichiers joints dans l\'espace de stockage… + Enregistrement de la pièce jointe dans l\'espace de stockage… + Enregistrement de %1$d pièces jointes dans l\'espace de stockage… En attente… @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + À vos marques… Prêts ? Lancez votre sauvegarde. Selon la taille de la sauvegarde, l’opération peut prendre du temps. Vous pouvez continuer d’utiliser votre téléphone pendant que nous sauvegardons vos données. @@ -1030,7 +1032,7 @@ Cet appareil ne prend pas en charge les services Google Play. Pour désactiver les optimisations système de la batterie qui empêchent Molly de récupérer les messages lorsque l\'application est inactive, appuyez ici. - Votre version de Molly est expirée. Mettez-la à jour maintenant afin d’échanger des messages. + Votre version de Molly est arrivée à expiration. Pour échanger des messages, passez à la nouvelle version. Mettre Signal à jour maintenant @@ -1259,7 +1261,7 @@ Vous pouvez ajouter ou inviter des amis après avoir créé ce groupe. Nom du groupe (requis) Nom du groupe (facultatif) - Ce champ est requis. + Ce champ est obligatoire. Échec de création du groupe. Réessayez plus tard. Retirer @@ -1352,7 +1354,7 @@ Nom de profil Nom d’utilisateur À propos - Échec de définition de l’avatar + Impossible de définir la photo de profil Macarons Lien ou code QR @@ -1544,7 +1546,7 @@ Suppression Suppression des messages… - Récupération des fichiers joints… + Récupération des pièces jointes… Trier par Le plus récent Le plus ancien @@ -1576,9 +1578,9 @@ Envoyé par %1$s - Envoyé par vous + Vous avez envoyé ce média Envoyé par %1$s à %2$s - Envoyé par vous à %1$s + Vous avez envoyé ce média à %1$s Me le rappeler plus tard @@ -1754,9 +1756,9 @@ La description du groupe a changé. - Vous avez changé l’avatar du groupe. - %1$s a changé l’avatar du groupe. - L’avatar du groupe a été changé. + Vous avez changé la photo du groupe. + %1$s a changé photo du groupe. + La photo du groupe a été changée. Vous avez défini l\'autorisation de modifier les informations du groupe sur \"%1$s\". @@ -1966,6 +1968,7 @@ + %1$d invité + %1$d invités + %1$d groupe supplémentaire %1$d groupes supplémentaires @@ -1992,6 +1995,7 @@ Aucun appareil n’a été trouvé. Erreur réseau. Le code QR est invalide + Vous avez déjà associé un trop grand nombre d’appareils. Veuillez en supprimer quelques-uns. Le code QR utilisé pour associer l’appareil n’est pas un code valide. Associer un appareil Signal ? @@ -2014,11 +2018,13 @@ Envoyer la phrase de passe La phrase de passe est erronée. Déverrouiller Molly + Molly pour Android – Écran de verrouillage Carte + Marquer Accepter l’adresse @@ -2522,6 +2528,7 @@ Message Signal + Plus @@ -2553,6 +2560,7 @@ Aucun sticker n’est installé Les stickers des messages reçus s’affichent ici Sans titre + Inconnu @@ -2774,6 +2782,7 @@ Le média n’est plus disponible. Impossible d’ouvrir le fichier. + Le message n’a pas été trouvé. Impossible de trouver une appli qui peut partager ce média. Fermer @@ -2845,6 +2854,7 @@ Messages Appels + Échecs Sauvegardes État de verrouillage @@ -2854,6 +2864,7 @@ Inconnu Notes vocales Un contact a rejoint Signal + Aucune activité n’est disponible pour ouvrir les paramètres du canal de notification. Connexion en arrière-plan @@ -3072,7 +3083,7 @@ Envoyer Rédaction d’un message Afficher/masquer le clavier des émojis - Imagette de fichiers joints + Miniature de la pièce jointe Afficher/masquer le tiroir de l’appareil photo à basse résolution Enregistrer et envoyer un message audio en pièce jointe @@ -3299,7 +3310,7 @@ Impossible de distribuer du contenu de %1$s. Il peut s’agir d’un message, d’un sticker, d’une réaction ou d’une confirmation de lecture. - Prénom (requis) + Prénom (champ obligatoire) Nom de famille (facultatif) Suivant Vous seul pouvez afficher le nom personnalisé du groupe MMS et ses photos. @@ -3374,7 +3385,7 @@ En attente Envoyé à - Envoyé de + Envoyé par Remis à Lu par N’a pas été envoyé @@ -3638,10 +3649,12 @@ Vous allez définitivement supprimer tout l’historique de vos messages de tous vos appareils. Cette action est irréversible. Tout supprimer maintenant + Pour toujours 1 an 6 mois 30 jours + Aucune %1$s message @@ -3666,6 +3679,7 @@ Afficher Sonnerie Taille de police des messages + Priorité Notifications retardées @@ -3894,6 +3908,7 @@ Lisez le code QR de l’adresse du bénéficiaire + Demande Payer Solde disponible : %1$s @@ -4025,6 +4040,7 @@ Vous ne pouvez épingler plus de %1$d conversations + Photo du contact Archivée @@ -4033,6 +4049,10 @@ Nouvelle conversation Ouvrir l’appareil photo Aucune conversation pour le moment.\nPour commencer, envoyez un message à un ami. + + Aucune conversation à afficher + + Paramètres du dossier @@ -4265,6 +4285,7 @@ Sauvegardes des conversations Transfert de compte Transférer le compte vers un nouvel appareil Android + Saisissez la phrase de passe de la sauvegarde Restaurer Import des données de versions ultérieures impossible @@ -4472,6 +4493,7 @@ Impossible d’ouvrir les paramètres du Wi-Fi. Veuillez activer le Wi-Fi manuellement. + Accorder l’autorisation pour la localisation Activer les services de localisation Activer le Wi-Fi @@ -4725,6 +4747,7 @@ Partager + Envoyer , %1$s @@ -5028,6 +5051,119 @@ Clavier Touche Entrée pour envoyer + + Dossiers de conversations + + Créer un dossier de conversations + + + + Organisez vos conversations en dossiers et passez facilement d\'un dossier à l\'autre depuis votre liste de conversations. + + Dossiers + + Nouveau dossier + + Toutes les conversations + + Dossiers suggérés + + Non lus + + Messages non lus dans l\'ensemble des conversations + + Conversations individuelles + + Messages des conversations individuelles uniquement + + Groupes + + Messages des conversations de groupe uniquement + + Créer + + Dossier %1$s ajouté. + + Modifier le dossier + + Supprimer le dossier + + Nouveau dossier + + Tout mettre en sourdine + + Réorganiser les dossiers + + Tout marquer comme lu + + + %1$d type de conversations + %1$d types de conversations + + + + %1$d conversation + %1$d conversations + + + + %1$d conversation exclue + %1$d conversations exclues + + + + + Nouveau dossier + + Nom du dossier (champ obligatoire) + + Conversations comprises dans le dossier + + Ajouter des conversations + + Choisissez les conversations à afficher dans ce dossier. + + Exceptions + + Exclure des conversations + + Choisissez les conversations à exclure de ce dossier. + + N\'afficher que les conversations non lues + + Quand cette option est activée, seules les conversations qui contiennent des messages non lus sont affichées dans ce dossier. + + Inclure les conversations mises en sourdine + + Créer + + Créer le dossier ? + + Voulez-vous créer le dossier de conversations \"%1$s\" ? + + Créer le dossier + + Modifier le dossier + + Enregistrer + + Enregistrer les modifications ? + + Voulez-vous enregistrer les modifications apportées à ce dossier de conversations ? + + Enregistrer les modifications + + Supprimer + + Supprimer le dossier + + Supprimer ce dossier de conversations ? + + + + Types de conversations + + Terminé Messages @@ -5112,6 +5248,7 @@ Qualité des médias + Qualité des médias envoyés Envoyer des médias de haute qualité demande plus de données. @@ -5328,7 +5465,7 @@ - Aperçu de l’avatar + Aperçu de la photo de profil Appareil photo Prendre une photo Choisir une photo @@ -5336,8 +5473,8 @@ Texte Enregistrer - Supprimer l’avatar - Échec d’enregistrement de l’avatar + Supprimer la photo de profil + Impossible d\'enregistrer la photo de profil Aperçu @@ -5562,7 +5699,7 @@ Installez la dernière version de Molly - Cette version de Molly a expiré. Mettez Molly à jour pour continuer à utiliser l’appli. + Cette version de Molly est arrivée à expiration. Pour continuer d\'utiliser l\'appli, passez à la nouvelle version. Mettre à jour @@ -5687,7 +5824,7 @@ Votre carte ne permet pas ce type d’achat. Essayez un autre mode de paiement. - Votre carte est expirée. Mettez à jour votre mode de paiement dans Google Pay, puis réessayez. + Votre carte est arrivée à expiration. Mettez à jour votre mode de paiement dans Google Pay, puis réessayez. Allez sur Google Pay @@ -5713,7 +5850,7 @@ Veuillez vérifier que les informations de votre carte sont correctes puis réessayez. Si le problème persiste, veuillez contacter votre banque. - Votre carte a expiré. Veuillez vérifier que les informations de votre carte sont correctes puis réessayez. + Votre carte est arrivée à expiration. Vérifiez que les informations de votre carte sont à jour, puis réessayez. Le code CVV de votre carte est erroné. Veuillez vérifier que les informations de votre carte sont correctes puis réessayez. @@ -6186,13 +6323,13 @@ Vous seul pouvez voir le titre de cette story. - Titre de la story (requis) + Titre de la story (champ obligatoire) Spectateurs Créer - Ce champ est requis. + Ce champ est obligatoire. Titre déjà utilisé pour une autre story. @@ -6366,7 +6503,7 @@ %1$d minutes restantes - Expiré + Don arrivé à expiration Appuyez pour avancer @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Expiration de votre abonnement de sauvegarde - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Votre mode de paiement actuel ne nous permet pas de traiter votre paiement et de renouveler votre forfait de sauvegarde. Vous disposez d\'un délai d\'%1$d jour pour récupérer les médias de votre sauvegarde. Passé ce délai, ils seront tous supprimés. + Votre mode de paiement actuel ne nous permet pas de traiter votre paiement et de renouveler votre forfait de sauvegarde. Vous disposez d\'un délai de %1$d jours pour récupérer les médias de votre sauvegarde. Passé ce délai, ils seront tous supprimés. Pour continuer de sauvegarder vos fichiers multimédias, vous pouvez de nouveau souscrire un forfait. @@ -7254,9 +7391,9 @@ Si vous choisissez d’ignorer ce message, les fichiers stockés dans votre sauvegarde seront supprimés d’ici %1$d jours. - Your backups subscription failed to renew + Impossible de renouveler votre abonnement de sauvegarde - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Vérifiez que votre mode de paiement est à jour. Appuyez sur \"Gérer l\'abonnement\", puis sur \"Modes de paiement\" et sur \"Mettre à jour\". Impossible de terminer la sauvegarde @@ -7266,9 +7403,9 @@ Ignorer - Gérer l’abonnement + Gérer l\'abonnement - Subscribe for %1$s/month + S\'abonner pour %1$s/mois Télécharger les médias maintenant @@ -7303,6 +7440,17 @@ %1$s sur %2$s + + + Annuler le téléchargement + + Téléchargement en cours : %1$s sur %2$s (%3$s %%) + + Espace insuffisant pour télécharger votre sauvegarde. Pour continuer, libérez %1$s d\'espace. + + Ignorer le téléchargement + + "Impossible de terminer votre dernière sauvegarde. Vérifiez que votre téléphone est connecté au Wi-Fi, puis appuyez sur \"Sauvegarder maintenant\" pour réessayer." @@ -7356,18 +7504,18 @@ L\'optimisation de l\'espace de stockage n\'est disponible qu\'avec la version payante du forfait de sauvegarde Signal. Donnez un coup de pouce à Signal et passez à la version payante pour utiliser cette fonctionnalité. - Subscribe for %1$s/month + S\'abonner pour %1$s/mois - This media is no longer available + Ce média n\'est plus disponible - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Avec votre forfait actuel, seuls vos médias des dernières 24 heures sont sauvegardés. Pour sauvegarder tous vos médias, veuillez mettre à niveau votre abonnement. + Avec votre forfait actuel, seuls vos médias des %1$d derniers jours sont sauvegardés. Pour sauvegarder tous vos médias, veuillez mettre à niveau votre abonnement. - Subscribe for %1$s/month + S\'abonner pour %1$s/mois La suppression des messages est maintenant synchronisée sur tous vos appareils. @@ -7415,6 +7563,8 @@ Sauvegarde téléchargée Signal créera une sauvegarde cette nuit. + + Abonnement inactif Forfait de sauvegarde @@ -7423,8 +7573,12 @@ %1$s/mois Votre forfait de sauvegarde est gratuit - + Prochaine échéance le %1$s + + Date d\'expiration : %1$s + + Est arrivé à expiration le %1$s Sauvegardez l\'historique de vos messages pour conserver toutes vos données – même si vous changez de téléphone ou réinstallez Molly. @@ -7469,6 +7623,10 @@ Sauvegarde manuelle Saisissez le code PIN, mot de passe ou schéma de déverrouillage de votre appareil. + + Réactiver les sauvegardes + + Nous avons désactivé les sauvegardes et supprimé vos données du service de stockage sécurisé de Signal. diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml index 102b475d0d..a9bc884f40 100644 --- a/app/src/main/res/values-ga/strings.xml +++ b/app/src/main/res/values-ga/strings.xml @@ -374,6 +374,8 @@ Comhráite Teachtaireachtaí + + Cineálacha comhráite Teachtaireacht %1$s @@ -873,7 +875,7 @@ - You\'re all set. Start your backup now. + Tá tú ullamh anois. Tosaigh ar do chúltacú anois. Ag brath ar mhéid do chúltaca, d\'fhéadfadh sé seo go leor ama a thógáil. Beidh tú in ann do ghuthán a úsáid mar is gnáth le linn an chúltacaithe. @@ -2149,6 +2151,7 @@ +%1$d a fuair cuireadh +%1$d a fuair cuireadh + %1$d ghrúpa sa bhreis %1$d ghrúpa sa bhreis @@ -2178,6 +2181,7 @@ Níor aimsíodh aon ghléas. Botún líonra. QR code neamhbhailí. + Faraor, tá a thuilleadh gléasanna nascaithe, cuir de le cúpla cinn. Faraor, ní QR code nacs gléis bailí é seo. Nasc gléas Signal? @@ -2203,11 +2207,13 @@ Seol isteach an nath faire Nath faire neamhbhailí! Díghlasáil Molly + Molly Android — Scáileán Glasála Léarscáil + Caith uait an biorán Glac leis an seoladh @@ -2777,6 +2783,7 @@ Teachtaireacht Signal + Tuilleadh @@ -2808,6 +2815,7 @@ Níl aon ghreamáin suiteáilte Taispeánfar greamáin ó theachtaireachtaí isteach anseo Gan teideal + Anaithnid @@ -3032,6 +3040,7 @@ Níl an meán sin ar fáil a thuilleadh. Ní féidir meáin a sheinm. + Earráid leis an teachtaireacht a aimsiú. Ní féidir aip a aimsiú atá in ann an meán seo a chomhroinnt. Dún @@ -3109,6 +3118,7 @@ Teachtaireachtaí Glaonna + Teipeanna Cúltacaithe An chaoi ina bhfuil an glas @@ -3118,6 +3128,7 @@ Anaithnid Glórnótaí Chuaigh an teagmhálaí isteach in Signal + Níl aon ghníomhaíocht ar fáil chun socruithe an chainéil fógraí a oscailt. Nasc cúlra @@ -3941,10 +3952,12 @@ Bainfear an stair teachtaireachtaí go léir ó gach gléas go buan. Ní féidir an gníomh sin a chealú. Scrios iad uile anois + Choíche 1 bhliain amháin 6 mhí 30 lá + Gan Fuaim %1$s teachtaireacht @@ -3972,6 +3985,7 @@ Taispeáin Glaofhuaim Méid chlófhoirne na teachtaireachta + Tosaíocht Fabhtcheartaigh fógraí @@ -4200,6 +4214,7 @@ Scan cód QR seolta an íocaí + Iarratas Íoc Available Balance: %1$s @@ -4334,6 +4349,7 @@ Ní féidir leat ach suas leis an líon seo comhráite a phionnáil: %1$d + Íomha ghrianghraif den teagmhálaí Curtha sa chartlann @@ -4342,6 +4358,10 @@ Comhrá nua Oscail an Grianghrafadán No chats yet.\nGet started by messaging a friend. + + Níl aon chomhrá le taispeáint + + Socruithe an fhillteáin @@ -4598,6 +4618,7 @@ Cúltacaí na gcomhráite Cuntas a Aistriú Aistrigh cuntas chuig gléas nua Android + Cuir isteach frása faire an chúltaca Cuir ar ais Ní féidir cúltaca a iompórtáil ó leaganacha níos nuaí @@ -4805,6 +4826,7 @@ Ní féidir Socruithe Wi-Fi a oscailt. Cas air Wi-Fi de láimh. + Tabhair cead chun do shuíomh a aimsiú Cuir na seirbhísí suímh ar siúl Cuir Wi-Fi ar siúl @@ -5079,6 +5101,7 @@ Comhroinn + Seol , %1$s @@ -5385,6 +5408,128 @@ An méarchlár Seol leis an eochair iontrála + + Fillteáin comhráite + + Cuir fillteán comhráite leis + + + + Eagraigh do chomhráite i bhfillteáin agus aistrigh eatarthu go tapa ar do liosta comhráite. + + Fillteáin + + Cruthaigh fillteán + + Gach comhrá + + Fillteáin mholta + + Neamhléite + + Teachtaireachtaí neamhléite ó gach comhrá + + Comhráite 1:1 + + Teachtaireachtaí ó chomhráite díreacha amháin + + Grúpaí + + Teachtaireachtaí ó ghrúpchomhráite amháin + + Cuir leis + + Fillteán %1$s curtha leis. + + Cuir fillteán in eagar + + Scrios an fillteán + + Cuir fillteán leis + + Balbhaigh gach comhrá + + Cuir fillteáin in ord nua + + Marcáil iad uile léite + + + %1$d chineál comhrá + %1$d chineál comhráite + %1$d chineál comhráite + %1$d gcineál comhráite + %1$d cineál comhráite + + + + %1$d chomhrá + %1$d chomhrá + %1$d chomhrá + %1$d gcomhrá + %1$d comhrá + + + + %1$d chomhrá as an áireamh + %1$d chomhrá as an áireamh + %1$d chomhrá as an áireamh + %1$d gcomhrá as an áireamh + %1$d comhrá as an áireamh + + + + + Cruthaigh fillteán + + Ainm an fhillteáin (de dhíth) + + Comhráite atá san áireamh + + Cuir comhráite leis + + Roghnaigh comhráite is mian leat a thaispeáint san fhillteán seo. + + Eisceachtaí + + Cuir comhráite as an áireamh + + Roghnaigh na comhráite nach mian leat a thaispeáint san fhillteán seo. + + Ná taispeáin ach comhráite neamhléite + + Agus é cumasaithe, ní thaispeánfar san fhillteán seo ach comhráite le teachtaireachtaí neamhléite. + + Cuir comhráite balbhaithe san áireamh + + Cruthaigh + + Cruthaigh fillteán? + + An bhfuil fonn ort an fillteán comhráite \"%1$s\" a chruthú? + + Cruthaigh fillteán + + Cuir fillteán in eagar + + Sábháil + + Sábháil na hathruithe? + + An bhfuil fonn ort na hathruithe a rinne tú ar an bhfillteán comhráite seo a shábháil? + + Sábháil na hathruithe + + Cuileáil + + Scrios an fillteán + + Scrios an fillteán comhráite seo? + + + + Cineálacha comhráite + + Déanta Teachtaireachtaí @@ -5472,6 +5617,7 @@ Media Quality + Sent Media Quality Sending high quality media will use more data. @@ -7700,14 +7846,14 @@ - Your backups subscription expired + Chuaigh do shíntiús le cúltacaí in éag - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Chuaigh do phlean cúltacaithe in éag toisc nárbh fhéidir é a nuashonrú le do mhodh reatha íocaíochta. Tar éis %1$d lá, scriosfar na meáin i do chúltaca. + Chuaigh do phlean cúltacaithe in éag toisc nárbh fhéidir é a nuashonrú le do mhodh reatha íocaíochta. Tar éis %1$d lá, scriosfar na meáin i do chúltaca. + Chuaigh do phlean cúltacaithe in éag toisc nárbh fhéidir é a nuashonrú le do mhodh reatha íocaíochta. Tar éis %1$d lá, scriosfar na meáin i do chúltaca. + Chuaigh do phlean cúltacaithe in éag toisc nárbh fhéidir é a nuashonrú le do mhodh reatha íocaíochta. Tar éis %1$d lá, scriosfar na meáin i do chúltaca. + Chuaigh do phlean cúltacaithe in éag toisc nárbh fhéidir é a nuashonrú le do mhodh reatha íocaíochta. Tar éis %1$d lá, scriosfar na meáin i do chúltaca. Is féidir leat tosú ag íoc as cúltacaí arís am ar bith le leanúint le cúltacú do mheán uile. @@ -7728,9 +7874,9 @@ Má roghnaíonn tú \"Gabh thar\" scriosfar na meáin i do chúltaca i gceann %1$d lá.. - Your backups subscription failed to renew + Theip ar nuashonrú do shíntiúis le cúltacaí - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Seiceáil go bhfuil do mhodh íocaíochta suas chun dáta. Tapáil Bainistigh síntiús agus, faoi Mhodhanna íocaíochta, tapáil Nuashonraigh. Níorbh fhéidir an cúltaca a chur i gcrích @@ -7742,7 +7888,7 @@ Bainistigh síntiús - Subscribe for %1$s/month + Íoc síntiús %1$s/sa mhí Íoslódáil meáin anois @@ -7777,6 +7923,17 @@ %1$s as %2$s + + + Cuir íoslódáil ar ceal + + Íoslódáil: %1$s as %2$s (%3$s%%) + + Níl go leor spáis ann chun do Chúltaca a íoslódáil. Déan %1$s de spás le leanúint leis. + + Scipeáil íoslódáil + + "Níorbh fhéidir do chúltaca deiridh a chur i gcrích. Cinntigh go bhfuil do ghuthán nasctha le Wi-Fi agus tapáil Cúltacaigh anois lena thriail arís." @@ -7830,21 +7987,21 @@ Ní féidir optamú stórais a úsáid ach leis an leibhéal íoctha de Chúltacaí Signal. Uasghrádaigh do phlean cúltacaithe le tosú ar úsáid na gné sin. - Subscribe for %1$s/month + Íoc síntiús %1$s/sa mhí - This media is no longer available + Níl na meáin seo ar fáil a thuilleadh - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Áirítear i do phlean reatha cúltacaí Signal an %1$d lá is déanaí de do mheáin. Le tosú ar do mheáin uile a chúltacú, uasghrádaigh anois. + Áirítear i do phlean reatha cúltacaí Signal an %1$d lá is déanaí de do mheáin. Le tosú ar do mheáin uile a chúltacú, uasghrádaigh anois. + Áirítear i do phlean reatha cúltacaí Signal na %1$d lá is déanaí de do mheáin. Le tosú ar do mheáin uile a chúltacú, uasghrádaigh anois. + Áirítear i do phlean reatha cúltacaí Signal na %1$d lá is déanaí de do mheáin. Le tosú ar do mheáin uile a chúltacú, uasghrádaigh anois. + Áirítear i do phlean reatha cúltacaí Signal na %1$d lá is déanaí de do mheáin. Le tosú ar do mheáin uile a chúltacú, uasghrádaigh anois. - Subscribe for %1$s/month + Íoc síntiús %1$s/sa mhí Tá scriosadh sioncronaithe trasna do ghléasanna uile anois @@ -7887,11 +8044,13 @@ Athraíodh an cineál cúltaca agus cuireadh an síntiús ar ceal - Cuireadh an síntiús ar ceal + Síntiús curtha ar ceal Íoslódáil críochnaithe Cruthófar cúltaca thar oíche. + + Síntiús neamhghníomhach Plean cúltaca @@ -7900,8 +8059,12 @@ %1$s/mí Tá do phlean cúltaca saor in aisce - + Athnuachan %1$s + + Rachaidh in éag an %1$s + + Chuaigh in éag an %1$s Cúltacaigh do stair teachtaireachtaí ionas nach gcaillfidh tú sonraí nuair a fhaigheann tú guthán nua nó nuair a athshuiteálann tú Molly. @@ -7946,6 +8109,10 @@ Déan cúltaca de láimh Cuir isteach UAP, pasfhocal, nó patrún do ghléis. + + Athchumasaigh cúltacaí + + Tá cúltacaí casta as agus tá do shonraí scriosta ó sheirbhís stórála shlán Signal. diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 062579e843..5c9b050b72 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -365,6 +365,8 @@ Conversas Mensaxes + + Tipos de conversas Mensaxe %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Acabaches. Xa podes iniciar a copia de seguranza. En función do tamaño da copia, isto pode tardar bastante tempo. Pero non te preocupes, podes seguir usando o teu teléfono como de costume mentres se completa o proceso. @@ -1966,6 +1968,7 @@ +%1$d convidados +%1$d convidado + %1$d grupo adicional %1$d grupos adicionais @@ -1992,6 +1995,7 @@ Ningún dispositivo atopado. Erro de rede. Código QR non válido. + Sentímolo, mais xa tes moitos dispositivos vinculados. Proba a eliminar algún Desculpa, este non é un código QR válido para vincular o dispositivo. Vincular un dispositivo a Signal? @@ -2014,11 +2018,13 @@ Enviar frase de acceso Frase de acceso non válida! Desbloquear Molly + Molly Android - Bloqueo de pantalla Mapa + Engadir marcador Aceptar enderezo @@ -2522,6 +2528,7 @@ Mensaxe de Signal + Máis @@ -2553,6 +2560,7 @@ Sen adhesivos instalados Os adhesivos das mensaxes entrantes aparecerán aquí Sen título + Descoñecido @@ -2774,6 +2782,7 @@ Contido multimedia xa non dispoñible. Non se pode reproducir. + Erro ao buscar a mensaxe. Non se atopa unha aplicación con que compartir este contido multimedia. Pechar @@ -2845,6 +2854,7 @@ Mensaxes Chamadas + Erros Copias de seguranza Bloquear estado @@ -2854,6 +2864,7 @@ Descoñecido Notas de voz Un contacto únese a Signal + Non hai actividade dispoñible para abrir a configuración de notificacións. Conexión en segundo plano @@ -3638,10 +3649,12 @@ Borrarase o historial de mensaxes de forma permanente de todos os dispositivos. Esta acción non se pode desfacer. Borrar todo agora + Para sempre 1 ano 6 meses 30 días + Ningún %1$s mensaxe @@ -3666,6 +3679,7 @@ Mostrar Ton de chamada Tamaño da fonte + Prioridade Solucionar problemas coas notificacións @@ -3894,6 +3908,7 @@ Escanea o código QR do enderezo do destinatario + Solicitude Pagar Saldo dispoñible: %1$s @@ -4025,6 +4040,7 @@ Só podes fixar %1$d conversas + Foto do contacto No arquivo @@ -4033,6 +4049,10 @@ Nova conversa Abrir cámara Aínda non hai conversas.\nInicia unha conversa cunha amizade. + + Non hai conversas para mostrar + + Configuración do cartafol @@ -4265,6 +4285,7 @@ Copias de seguranza das conversas Transferir conta Transferir a conta un novo dispositivo Android + Inserir frase de acceso para a copia de seguranza Restaurar Non se importan copias dende novas versións de Signal @@ -4472,6 +4493,7 @@ Non se puido abrir o axuste Wi-Fi. Activa a Wi-Fi de xeito manual. + Conceder permiso de localización Activar servizos de localización Activar Wi-Fi @@ -4725,6 +4747,7 @@ Compartir + Enviar , %1$s @@ -5028,6 +5051,119 @@ Teclado Enviar coa tecla de retorno + + Cartafois de conversas + + Engadir un novo cartafol + + + + Organiza as túas conversas en cartafois e accede a elas de forma rápida na lista de conversas. + + Cartafois + + Crear un cartafol + + Todas as conversas + + Cartafois suxeridos + + Sen ler + + Mensaxes sen ler de todas as conversas + + Conversas individuais + + Só mostrar mensaxes de conversas individuais + + Grupos + + Só mostrar mensaxes de conversas grupais + + Engadir + + Cartafol engadigo: %1$s + + Editar cartafol + + Eliminar cartafol + + Engadir un novo cartafol + + Silenciar todas + + Reordenar cartafois + + Marcar todas como lidas + + + %1$d tipo de conversa + %1$d tipos de conversas + + + + %1$d conversa + %1$d conversas + + + + %1$d conversa excluída + %1$d conversas excluídas + + + + + Crear un cartafol + + Nome do cartafol (obrigatorio) + + Conversas incluídas + + Engadir conversas + + Escolle as conversas que queiras que aparezan neste cartafol. + + Agás + + Excluír conversas + + Escolle as conversas que non queiras que aparezan neste cartafol. + + Só mostrar conversas sen ler + + Ao activarse, só aparecerán neste cartafol as conversas con mensaxes sen ler. + + Incluír conversas silenciadas + + Crear + + Crear cartafol? + + Queres crear o cartafol «%1$s»? + + Crear cartafol + + Editar cartafol + + Gardar + + Gardar cambios? + + Queres gardar os cambios que fixeches neste cartafol? + + Gardar cambios + + Descartar + + Eliminar cartafol + + Eliminar cartafol? + + + + Tipos de conversas + + Feito Mensaxes @@ -5112,6 +5248,7 @@ Calidade multimedia + Calidade dos envíos Enviando multimedia con alta calidade usarás máis datos @@ -7232,11 +7369,11 @@ - Your backups subscription expired + A túa subscrición da copia de seguranza venceu - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + O teu plan venceu porque non se puido renovar o teu método de pagamento actual. Pasado %1$d día, o contido multimedia da túa copia eliminarase. + O teu plan venceu porque non se puido renovar o teu método de pagamento actual. Pasados %1$d días, o contido multimedia da túa copia eliminarase. Se queres volver a facer unha copia de seguranza de todos os teus arquivos multimedia, podes ter acceso de novo ao plan pagando en calquera momento. @@ -7254,9 +7391,9 @@ Se escolles «Omitir», os arquivos multimedia da túa copia de seguranza eliminaranse en %1$d días. - Your backups subscription failed to renew + A túa subscrición da copia de seguranza non se puido renovar - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Asegúrate de que o teu método de pagamento está actualizado. Preme en «Xestionar subscrición» e, na sección de Métodos de pagamento, preme «Actualizar». Non se realizou a copia de seguranza @@ -7268,7 +7405,7 @@ Xestionar subscrición - Subscribe for %1$s/month + Subscríbete por %1$s/mes Descargar contido agora @@ -7303,6 +7440,17 @@ %1$s de %2$s + + + Cancelar descarga + + Descargando: %1$s de %2$s (%3$s %%) + + Non hai espazo suficiente para descargar a túa copia de seguranza. Para poder facelo, tes que liberar %1$s de espazo. + + Omitir descarga + + "A túa última copia de seguranza non se completou. Comproba que o teu teléfono estea conectado a unha rede wifi e preme «Facer copia agora»." @@ -7356,18 +7504,18 @@ Só se pode acceder á optimización de almacenamento co nivel de pago das copias de seguranza de Signal. Cambia o teu plan para gozar desta función. - Subscribe for %1$s/month + Subscríbete por %1$s/mes - This media is no longer available + O contido multimedia xa non está dispoñible - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + O teu plan actual á copia de seguranza de Signal inclúe os arquivos do último día. Para protexer todo o teu contido multimedia, mellora o teu plan. + O teu plan actual á copia de seguranza de Signal inclúe os arquivos dos últimos %1$d días. Para protexer todo o teu contido multimedia, mellora o teu plan. - Subscribe for %1$s/month + Subscríbete por %1$s/mes Agora a acción de borrar está sincronizada en todos os teus dispositivos @@ -7415,6 +7563,8 @@ Descarga completa A copia de seguranza crearase durante a noite. + + Subscrición inactiva Plan de copia de seguranza @@ -7423,8 +7573,12 @@ %1$s/mes O teu plan é gratuíto - + Renóvase o %1$s + + Caduca o %1$s + + Caducado o %1$s Fai unha copia de seguranza do teu historial de mensaxes para que nunca perdas datos cando cambies de teléfono ou volvas instalar Molly. @@ -7469,6 +7623,10 @@ Facer manualmente Escribe o PIN, contrasinal ou patrón do dispositivo. + + Activar de novo a copia de seguranza + + Desactiváronse as copias de seguranza e os elimináronse os teus datos do servizo de almacenamento seguro de Signal. diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 469ba5648a..5de2891c28 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -365,6 +365,8 @@ ચેટ મેસેજ + + ચેટના પ્રકારો મેસેજ %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + તમે એકદમ તૈયાર છો. હવે તમારું બેકઅપ શરૂ કરો. તમારા બેકઅપની સાઇઝના આધારે, આમાં લાંબો સમય લાગી શકે છે. જ્યારે બેકઅપ લેવામાં આવે ત્યારે તમે સામાન્ય રીતે કરતાં હોવ તેમ તમે તમારા ફોનનો ઉપયોગ કરી શકો છો. @@ -1966,6 +1968,7 @@ +%1$dને આમંત્રિત કર્યા +%1$dને આમંત્રિત કર્યા + %1$d વધારાના જૂથો %1$d વધારાના જૂથો @@ -1992,6 +1995,7 @@ કોઈ ડિવાઇસ મળ્યું નથી. નેટવર્ક ભૂલ. અમાન્ય QR કોડ. + માફ કરશો, તમારી પાસે ઘણા બધા ડિવાઇસ પહેલાથી જોડાયેલા છે, કેટલાકને દૂર કરવાનો પ્રયાસ કરો માફ કરશો, આ માન્ય ડિવાઇસ લિંક QR કોડ નથી. Signal ડિવાઇસ ને લિંક કરીએ? @@ -2014,11 +2018,13 @@ પાસફ્રેઝ સબમિટ કરો અમાન્ય પાસફ્રેઝ! Molly અનલૉક કરો + Molly એન્ડ્રોઇડ - લૉક સ્ક્રીન નકશો + ડ્રોપ પિન સરનામું સ્વીકારો @@ -2522,6 +2528,7 @@ Signal મેસેજ + વધુ @@ -2553,6 +2560,7 @@ કોઈ સ્ટીકરો ઇન્સ્ટોલ કરેલા નથી આવતા મેસેજ ના સ્ટીકરો અહીં દેખાશે શીર્ષક વિનાનું + અજાણ્યું @@ -2774,6 +2782,7 @@ મીડિયા હવે ઉપલબ્ધ નથી. મીડિયા ચલાવવામાં અસમર્થ. + મેસેજ શોધવામાં ભૂલ. આ મીડિયાને શેર કરવા માટે સક્ષમ એપ્લિકેશન શોધી શકાતી નથી. બંધ @@ -2845,6 +2854,7 @@ મેસેજ કૉલ્સ + નિષ્ફળતા બેકઅપ્સ લૉક સ્ટેટસ @@ -2854,6 +2864,7 @@ અજાણ્યું વૉઈસ નોટ્સ સંપર્ક Signal સાથે જોડાયો + સૂચના ચેનલ સેટિંગ્સ ખોલવા માટે કોઈ પ્રવૃત્તિ ઉપલબ્ધ નથી. બેકગ્રાઉંડ કનેક્શન @@ -3638,10 +3649,12 @@ બધી મેસેજ હિસ્ટ્રી આ ડિવાઇસ પરથી કાયમ માટે ડિલીટ કરવામાં આવશે. આ ક્રિયાને પૂર્વવત કરી શકાશે નહીં. બધુ હમણાં ડિલીટ કરો + હમેશા 1 વર્ષ 6 મહિના 30 દિવસો + કંઈ નહીં %1$s મેસેજ @@ -3666,6 +3679,7 @@ બતાવો રીંગટોન મેસેજ ફોન્ટ કદ + પ્રાથમિકતા નોટિફિકેશનનું મુશ્કેલીનિવારણ કરો @@ -3894,6 +3908,7 @@ ચૂકવનારનું એડ્રેસ QR કોડ સ્કેન કરો + વિનંતી ચૂકવો ઉપલબ્ધ બેલેન્સ: %1$s @@ -4025,6 +4040,7 @@ તમે ફક્ત %1$d ચેટ સુધી જ પિન અપ શકો છો + સંપર્ક ફોટો છબી આર્કાઇવ કરેલ @@ -4033,6 +4049,10 @@ નવી ચેટ કેમેરો ખોલો હજી સુધી કોઈ ચેટ નથી.\nમિત્રને મેસેજ કરીને પ્રારંભ કરો. + + બતાવવા માટે કોઈ ચેટ નથી + + ફોલ્ડરના સેટિંગ્સ @@ -4265,6 +4285,7 @@ ચેટ બૅકઅપ એકાઉન્ટ ટ્રાન્સફર કરો નવા Android ડિવાઇસમાં એકાઉન્ટ ટ્રાન્સફર કરો + બૅકઅપ પાસફ્રેઝ દાખલ કરો રિસ્ટોર Signalના નવા વર્ઝનમાંથી બેકઅપ આયાત કરી શકાતો નથી @@ -4472,6 +4493,7 @@ વાઇફાઇ સેટિંગ્સ ખોલવામાં અસમર્થ. કૃપા કરીને જાતે વાઇફાઇ ચાલુ કરો. + સ્થાન પરવાનગી આપો સ્થાન સેવાઓ ચાલુ કરો Wi-Fi ચાલુ કરો @@ -4725,6 +4747,7 @@ શેર કરો + મોકલો , %1$s @@ -5028,6 +5051,119 @@ કીબોર્ડ એન્ટર દબાવીને મોકલો + + ચેટના ફોલ્ડર + + ચેટ ફોલ્ડર ઉમેરો + + + + તમારી ચેટને ફોલ્ડરમાં ગોઠવો અને તમારી ચેટ લિસ્ટ પર તેમની વચ્ચે ઝડપથી સ્વિચ કરો. + + ફોલ્ડર + + ફોલ્ડર બનાવો + + બધી ચેટ + + સૂચવેલા ફોલ્ડર + + ન વાંચેલા + + બધી ચેટમાંથી વાંચ્યા વગરના મેસેજ + + 1:1 ચેટ + + ફક્ત ડાયરેક્ટ ચેટના જ મેસેજ + + ગ્રૂપ + + ફક્ત ગ્રૂપ ચેટના જ મેસેજ + + ઉમેરો + + %1$s ફોલ્ડર ઉમેર્યું. + + ફોલ્ડરમાં ફેરફાર કરો + + ફોલ્ડર ડિલીટ કરો + + નવું ફોલ્ડર ઉમેરો + + બધાને મ્યૂટ કરો + + ફોલ્ડરને ફરીથી ગોઠવો + + બધાને વાંચેલા તરીકે માર્ક કરો + + + %1$d ચેટના પ્રકાર + %1$d ચેટના પ્રકારો + + + + %1$d ચેટ + %1$d ચેટ + + + + %1$d ચેટ બાકાત કરી + %1$d ચેટ બાકાત કરી + + + + + ફોલ્ડર બનાવો + + ફોલ્ડરનું નામ (આવશ્યક) + + સમાવિષ્ટ ચેટ + + ચેટ ઉમેરો + + તમે આ ફોલ્ડરમાં બતાવવા માંગતા હો તે ચેટ પસંદ કરો. + + અપવાદો + + ચેટ બાકાત કરો + + તમે આ ફોલ્ડરમાં બતાવવા ન માંગતા હો તે ચેટ પસંદ કરો. + + ફક્ત ન વાંચેલી ચેટ જ બતાવો + + જ્યારે સક્ષમ હોય, ત્યારે આ ફોલ્ડરમાં ફક્ત ન વાંચેલા મેસેજ સાથેની ચેટ જ બતાવવામાં આવશે. + + મ્યૂટ કરેલી ચેટ સામેલ કરો + + બનાવો + + ફોલ્ડર બનાવવું છે? + + શું તમે ચેટ ફોલ્ડર \"%1$s\" બનાવવા માંગો છો? + + ફોલ્ડર બનાવો + + ફોલ્ડરમાં ફેરફાર કરો + + સેવ કરો + + ફેરફારો સેવ કરવા છે? + + શું તમે આ ચેટ ફોલ્ડરમાં કરેલા ફેરફારોને સેવ કરવા માંગો છો? + + ફેરફારો સેવ કરો + + કાઢી નાખો + + ફોલ્ડર ડિલીટ કરો + + આ ચેટ ફોલ્ડર ડિલીટ કરવું છે? + + + + ચેટના પ્રકારો + + થઈ ગયું મેસેજ @@ -5112,6 +5248,7 @@ મીડિયા ગુણવત્તા + મોકલેલ મીડિયાની ગુણવત્તા ઉચ્ચ ગુણવત્તાના મીડિયા મોકલવાથી વધુ ડેટા વાપરશે. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + તમારું બેકઅપ સબ્સ્ક્રિપ્શન સમાપ્ત થઈ ગયું - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + તમારા બેકઅપ પ્લાનની સમયસીમા સમાપ્ત થઈ ગઈ છે કારણ કે તે તમારી વર્તમાન ચુકવણી પદ્ધતિ સાથે રિન્યૂ કરી શકાયું નથી. %1$d દિવસ પછી, તમારા બેકઅપમાંના મીડિયાને ડિલીટ કરવામાં આવશે. + તમારા બેકઅપ પ્લાનની સમયસીમા સમાપ્ત થઈ ગઈ છે કારણ કે તે તમારી વર્તમાન ચુકવણી પદ્ધતિ સાથે રિન્યૂ કરી શકાયું નથી. %1$d દિવસ પછી, તમારા બેકઅપમાંના મીડિયાને ડિલીટ કરવામાં આવશે. તમે તમારા તમામ મીડિયાનું બેકઅપ લેવાનું ચાલુ રાખવા માટે કોઈ પણ સમયે ફરીથી બેકઅપ માટે ચુકવણી કરવાનું શરૂ કરી શકો છો. @@ -7254,9 +7391,9 @@ જો તમે \"છોડો\" પસંદ કરો છો, તો તમારા બેકઅપમાંના મીડિયા %1$d દિવસમાં ડિલીટ કરવામાં આવશે. - Your backups subscription failed to renew + તમારા બેકઅપ સબ્સ્ક્રિપ્શનને રિન્યૂ કરવાનું નિષ્ફળ થયું - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + તમારી ચુકવણી પદ્ધતિ અપ ટૂ ડેટ છે તેની ખાતરી કરવા માટે તપાસો. સબ્સ્ક્રિપ્શન મેનેજ કરો પર ટેપ કરો અને ચુકવણી પદ્ધતિઓ હેઠળ અપડેટ કરો પર ટેપ કરો. બેકઅપ પૂર્ણ કરી શકાયું નથી @@ -7268,7 +7405,7 @@ સબ્સ્ક્રિપ્શન મેનેજ કરો - Subscribe for %1$s/month + %1$s/મહિને સબ્સ્ક્રાઇબ કરો હમણાં જ મીડિયા ડાઉનલોડ કરો @@ -7303,6 +7440,17 @@ %1$sની%2$s + + + ડાઉનલોડ રદ કરો + + ડાઉનલોડ થઈ રહ્યું છે: %2$s માંથી %1$s (%3$s%%) + + તમારા બેકઅપને ડાઉનલોડ કરવા માટે પૂરતી જગ્યા નથી. ચાલુ રાખવા માટે %1$s જગ્યા ખાલી કરો. + + ડાઉનલોડ કરવાનું છોડો + + "તમારું છેલ્લું બેકઅપ પૂર્ણ કરી શકાયું નથી. ખાતરી કરો કે તમારો ફોન Wi-Fiથી કનેક્ટ થયેલો છે અને ફરી પ્રયાસ કરવા માટે હમણાં બેકઅપ લો પર ટેપ કરો." @@ -7356,18 +7504,18 @@ સ્ટોરેજ ઑપ્ટિમાઇઝેશનનો ઉપયોગ માત્ર Signal બેકઅપના પેઇડ ટીયર સાથે જ થઈ શકે છે. આ ફીચરનો ઉપયોગ શરૂ કરવા માટે તમારા બેકઅપ પ્લાનને અપગ્રેડ કરો. - Subscribe for %1$s/month + %1$s/મહિને સબ્સ્ક્રાઇબ કરો - This media is no longer available + આ મીડિયા હવે ઉપલબ્ધ નથી - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + તમારા વર્તમાન Signal બેકઅપ પ્લાનમાં તમારા સૌથી તાજેતરના %1$d દિવસના મીડિયાનો સમાવેશ થાય છે. તમારા બધા મીડિયાનું બેકઅપ લેવાનું શરૂ કરવા માટે, હમણાં જ અપગ્રેડ કરો. + તમારા વર્તમાન Signal બેકઅપ પ્લાનમાં તમારા સૌથી તાજેતરના %1$d દિવસના મીડિયાનો સમાવેશ થાય છે. તમારા બધા મીડિયાનું બેકઅપ લેવાનું શરૂ કરવા માટે, હમણાં જ અપગ્રેડ કરો. - Subscribe for %1$s/month + %1$s/મહિને સબ્સ્ક્રાઇબ કરો ડિલીટ કરવાનું હવે તમારા બધા ડિવાઇસ પર સિંક કરવામાં આવ્યું છે @@ -7415,6 +7563,8 @@ ડાઉનલોડ પૂર્ણ બેકઅપ રાત્રિ દરમિયાન લેવામાં આવશે. + + સબ્સ્ક્રિપ્શન નિષ્ક્રિય બેકઅપ પ્લાન @@ -7423,8 +7573,12 @@ %1$s/માસ તમારો બેકઅપ પ્લાન મફત છે - + %1$sના રોજ રિન્યૂ થશે + + %1$sના રોજ સમાપ્ત થશે + + %1$sના રોજ સમાપ્ત થયું તમારી મેસેજ હિસ્ટ્રીનું બેકઅપ લો જેથી જ્યારે તમે નવો ફોન લો અથવા Mollyને ફરીથી ઇન્સ્ટોલ કરો ત્યારે તમે ક્યારેય ડેટા ગુમાવશો નહીં. @@ -7469,6 +7623,10 @@ મેન્યુઅલી બેકઅપ કૃપા કરીને તમારો ડિવાઇસ પિન, પાસવર્ડ અથવા પેટર્ન દાખલ કરો. + + બેકઅપ ફરીથી સક્ષમ કરો + + બેકઅપ બંધ કરવામાં આવ્યા છે અને તમારો ડેટા Signalની સુરક્ષિત સ્ટોરેજ સેવામાંથી ડિલીટ કરવામાં આવ્યો છે. diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 5bddf41840..298263a5ba 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -365,6 +365,8 @@ चैट मैसेज + + चैट के प्रकार %1$s को मेसेज @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + अब आप तैयार हैं। अभी अपना बैकअप शुरू करें। आपके बैकअप के आकार के आधार पर, इसमें लंबा समय लग सकता है। बैकअप के दौरान, आप अपना फ़ोन सामान्य रूप से इस्तेमाल कर सकते हैं। @@ -1966,6 +1968,7 @@ +%1$d आमंत्रित किए गए +%1$d आमंत्रित किए गए + %1$d अतिरिक्त ग्रुप %1$d अतिरिक्त ग्रुप्स @@ -1992,6 +1995,7 @@ कोई डिवाइस नहीं मिला नेटवर्क त्रुटि अवैध क्यूआर कोड + क्षमा करें, आपके पास पहले से जुड़े बहुत से डिवाइस हैं, कुछ को हटाने का प्रयास करें क्षमा करें, यह एक वैध डिवाइस लिंक क्यूआर कोड नहीं है। Signal डिवाइस को लिंक करें? @@ -2014,11 +2018,13 @@ पासफ्रेज जमा करें अमान्य पासफ्रेज Molly खोलो + Molly Android - लॉक स्क्रीन नक्शा + पीन दें पता स्वीकारें @@ -2522,6 +2528,7 @@ Signal मेसेज + अधिक @@ -2553,6 +2560,7 @@ कोई स्टीकर स्थापित नहीं है आने वाले मेसेजों के स्टिकर यहां दिखाई देंगे शीर्षकहीन + अनजान @@ -2774,6 +2782,7 @@ मीडिया अब उपलब्ध नहीं है। मीडिया चलाने में असमर्थ + संदेश ढूँढ़ने में त्रुटि हुई। इस मीडिया को शेयर करने के लिए कोई ऐप नहीं मिल रही। बंद करो @@ -2845,6 +2854,7 @@ मेसेज कॉल + विफलतायें बैकअप लॉक स्थिति @@ -2854,6 +2864,7 @@ अनजान ऑडियो नोट्स संपर्क Signal में शामिल हो गए + अधिसूचना चैनल सेटिंग्ज़ खोलने के लिए कोई गतिविधि उपलब्ध नहीं है। बैकग्राउंड कनेक्शन @@ -3638,10 +3649,12 @@ सभी संदेश इतिहास सभी डिवाइस से स्थायी रूप से हटा दिए जाएंगे। इसे फिर से पहले जैसा नहीं किया जा सकेगा। सभी कुछ अभी डिलीट करें + हमेशा के लिए 1 वर्ष 6 महीने 30 दिन + कुछ नहीं %1$s संदेश @@ -3666,6 +3679,7 @@ दिखाएं रिंगटोन मेसेज फ़ॉन्ट आकार + प्राथमिकता ट्रबलशूट नोटिफ़िकेशन @@ -3894,6 +3908,7 @@ भुगतान प्राप्तकर्ता के पते का QR कोड स्कैन करें + निवेदन भुगतान करें उपलब्ध बैलेंस: %1$s @@ -4025,6 +4040,7 @@ आप केवल %1$d तक चैट को पिन कर सकते हैं + संपर्क फोटो छवि संग्रहीत @@ -4033,6 +4049,10 @@ नई चैट कैमरा खोलें अभी तक कोई चैट नहीं हैं।\nकिसी मित्र को मेसेज करके शुरू करें। + + दिखाने के लिए कोई चैट नहीं है + + फ़ोल्डर सेटिंग्स @@ -4265,6 +4285,7 @@ बैकअप चैट करें खाता ट्रांसफ़र करें खाते को किसी नए Android डिवाइस पर ट्रांसफ़र करें + बैकअप पासफ्रेज दर्ज करें पुन:इंस्टॉल करें Signal के नये वर्ज़न से बैकअप लाना संभव नहीं है @@ -4472,6 +4493,7 @@ Wi-Fi सेटिंग्ज़ नहीं खोल पा रहे हैं। कृपया Wi-Fi को मन्युअल रूप से चालू करें। + लोकेशन अनुमति प्रदान करें लोकेशन सेवाएँ चालू करें Wi-Fi चालू करें @@ -4725,6 +4747,7 @@ साझा करें + भेजें , %1$s @@ -5028,6 +5051,119 @@ कीबोर्ड एंटर करके भेजें + + चैट फ़ोल्डर + + चैट फ़ोल्डर जोड़ें + + + + अपनी चैट को फ़ोल्डर्स में व्यवस्थित करें और अपनी चैट की सूची में उनके बीच तुरंत स्विच करें। + + फ़ोल्डर + + फ़ोल्डर बनाएँ + + सभी चैट + + सुझाए गए फ़ोल्डर + + पढ़े न गए + + सभी चैट से पढ़े न गए संदेश + + 1:1 चैट + + सिर्फ़ डायरेक्ट चैट से संदेश + + ग्रुप + + सिर्फ़ ग्रुप चैट से संदेश + + जोड़ें + + %1$s फ़ोल्डर जोड़ा गया। + + फ़ोल्डर संपादित करें + + फ़ोल्डर डिलीट करें + + नया फ़ोल्डर जोड़ें + + सभी को म्यूट करें + + फ़ोल्डर का क्रम बदलें + + सभी को पढ़ा दिखाएं + + + %1$d चैट प्रकार + %1$d चैट प्रकार + + + + %1$d चैट + %1$d चैट + + + + %1$d चैट छोड़कर + %1$d चैट छोड़कर + + + + + फ़ोल्डर बनाएँ + + फ़ोल्डर का नाम (ज़रूरी) + + शामिल की गई चैट्स + + चैट जोड़ें + + आप इस फ़ोल्डर में जिन चैट को देखना चाहते हैं उन्हें चुनें। + + अपवाद + + चैट छोड़ें + + आप इस फ़ोल्डर में जिन चैट को नहीं देखना चाहते हैं उन्हें चुनें। + + सिर्फ़ पढ़ी न गई चैट दिखाएँ + + चालू होने पर, सिर्फ़ वे चैट दिखाई जाएँगी जिनमें संदेश पढ़े नहीं गए हैं। + + म्यूट की गई चैट शामिल करें + + बनाएँ + + फ़ोल्डर बनाएँ? + + क्या आप चैट फ़ोल्डर \"%1$s\" को बनाना चाहते हैं? + + फ़ोल्डर बनाएँ + + फ़ोल्डर संपादित करें + + सेव + + बदलाव सेव करें? + + क्या आप इस चैट फ़ोल्डर में किए गए बदलावों को सेव करना चाहते हैं? + + बदलाव सेव करें + + रद्द करें + + फ़ोल्डर डिलीट करें + + इस चैट फ़ोल्डर को डिलीट करें? + + + + चैट के प्रकार + + पूर्ण मेसेज @@ -5112,6 +5248,7 @@ मीडिया क्वालिटी + मीडिया क्वालिटी भेजी गई हाई क्वालिटी मीडिया भेजने के लिए अधिक डेटा खर्च होगा। @@ -7232,11 +7369,11 @@ - Your backups subscription expired + आपके बैकअप का सब्सक्रिप्शन खत्म हो गया - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + आपका बैकअप प्लान खत्म हो गया है, क्योंकि आपके मौजूदा भुगतान प्लान से इसे रिन्यू नहीं किया जा सका। %1$d दिन के बाद, आपके बैकअप में मौजूद मीडिया डिलीट कर दिया जाएगा। + आपका बैकअप प्लान खत्म हो गया है, क्योंकि आपके मौजूदा भुगतान प्लान से इसे रिन्यू नहीं किया जा सका। %1$d दिनों के बाद, आपके बैकअप में मौजूद मीडिया डिलीट कर दिया जाएगा। आप अपने सभी मीडिया का बैकअप लेना जारी रखने के लिए किसी भी समय फिर से बैकअप के लिए भुगतान करना शुरू कर सकते हैं। @@ -7254,9 +7391,9 @@ यदि आप \"छोड़ें\" चुनते हैं तो आपके बैकअप में मौजूद मीडिया %1$d दिनों में डिलीट कर दिया जाएगा। - Your backups subscription failed to renew + आपके बैकअप का सब्सक्रिप्शन रिन्यू नहीं हो पाया - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + जाँच करके पक्का करें कि आपके भुगतान का तरीका अप-टू-डेट है। \'सब्सक्रिप्शन प्रबंधित करें\' पर टैप करें और भुगतान के तरीकों में \'अपडेट करें\' पर टैप करें। बैकअप पूरा नहीं कर सका @@ -7268,7 +7405,7 @@ सब्सक्रिप्शन मैनेज करें - Subscribe for %1$s/month + %1$s/महीने में सब्सक्राइब करें अभी मीडिया डाउनलोड करें @@ -7303,6 +7440,17 @@ %1$s का %2$s + + + डाउनलोड रद्द करें + + %2$s में से %1$s को डाउनलोड किया जा रहा है (%3$s%%) + + आपके बैकअप को डाउनलोड करने के लिए जगह नहीं है। जारी रखने के लिए, %1$s जगह खाली करें। + + डाउनलोड छोड़ें + + "आपका आखिरी बैकअप पूरा नहीं किया जा सका। पक्का करें कि आपका फ़ोन वाई-फ़ाई से कनेक्ट हैं और फिर से कोशिश करने के लिए \'अभी बैकअप करें\' पर टैप करें।" @@ -7356,18 +7504,18 @@ स्टोरेज ऑप्टिमाइज़ेशन को सिर्फ़ Signal Backups के भुगतान वाले टियर के साथ इस्तेमाल किया जा सकता है। इस फ़ीचर को इस्तेमाल करना शुरू करने के लिए, अपना बैकअप प्लान अपग्रेड करें। - Subscribe for %1$s/month + %1$s/महीने में सब्सक्राइब करें - This media is no longer available + अब यह मीडिया उपलब्ध नहीं है - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + आपके मौजूदा Signal बैकअप प्लान में आपका पिछले %1$d दिन का मीडिया है। अपने पूरे मीडिया का बैकअप लेना शुरू करने के लिए, अभी अपग्रेड करें। + आपके मौजूदा Signal बैकअप प्लान में आपका पिछले %1$d दिनों का मीडिया है। अपने पूरे मीडिया का बैकअप लेना शुरू करने के लिए, अभी अपग्रेड करें। - Subscribe for %1$s/month + %1$s/महीने में सब्सक्राइब करें डिलीट करना अब आपकी सभी डिवाइस पर सिंक हो गया है @@ -7415,6 +7563,8 @@ डाउनलोड पूरा हुआ बैकअप को रात के समय बनाया जाएगा। + + सब्सक्रिप्शन निष्क्रिय है बैकअप प्लान @@ -7423,8 +7573,12 @@ %1$s/महीना आपका बैकअप प्लान मुफ़्त है - + %1$s को नवीकृत होता है + + %1$s को खत्म होगा + + %1$s को खत्म हो गया अपना संदेश इतिहास बैकअप करें, ताकि नया फ़ोन लेने या Molly को फिर से इंस्टॉल करने पर आपका डेटा न खोए। @@ -7469,6 +7623,10 @@ मैन्युअल रूप से बैकअप लें कृपया अपना डिवाइस पिन, पासवर्ड या पैटर्न डालें। + + बैकअप फिर से चालू करें + + बैकअप को बंद कर दिया गया है और आपका डेटा Signal की सुरक्षित स्टोरेज डिवाइस से डिलीट कर दिया गया है। diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index c48d63588a..ca702fa9d2 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -371,6 +371,8 @@ Razgovori Poruke + + Vrste razgovora Poruka %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Sve je spremno. Započnite sigurnosno kopiranje. Ovisno o veličini sigurnosne kopije, ovo bi moglo malo duže potrajati. Tijekom sigurnosnog kopiranja možete normalno koristiti svoj telefon. @@ -2088,6 +2090,7 @@ +%1$d pozvanih +%1$d pozvanih + %1$d dodatna grupa %1$d dodatne grupe @@ -2116,6 +2119,7 @@ Nema uređaja. Mrežna pogreška. Nevažeći QR kôd. + Nažalost, već imate previše povezanih uređaja. Pokušajte ukloniti neke. Nažalost, ovo nije valjani QR kôd za povezivanje uređaja. Poveži Signal uređaj? @@ -2140,11 +2144,13 @@ Pošaljite lozinku Nevažeća lozinka! Otključaj Molly + Molly Android - Zaključani zaslon Mapa + Ispusti značku Prihvati adresu @@ -2692,6 +2698,7 @@ Signal poruka + Više @@ -2723,6 +2730,7 @@ Nema instaliranih naljepnica Ovdje će se pojaviti naljepnice iz dolaznih poruka Bez naslova + Nepoznato @@ -2946,6 +2954,7 @@ Medijski zapis više nije dostupan. Nije moguće reproducirati medijske zapise. + Pogreška pri pronalaženju poruke. Nije moguće pronaći aplikaciju za dijeljenje ovog medijskog zapisa. Zatvori @@ -3021,6 +3030,7 @@ Poruke Pozivi + Neuspjesi Sigurnosne kopije Status zaključavanja @@ -3030,6 +3040,7 @@ Nepoznato Glasovne bilješke Kontakt se pridružio/la Signalu + Nema dostupnih aktivnosti za otvaranje postavki kanala za obavijesti. Pozadinska veza @@ -3840,10 +3851,12 @@ Sva povijest razgovora bit će trajno uklonjena sa svih uređaja. Ova se radnja ne može poništiti. Izbriši sve + Zauvijek 1 godina 6 mjeseci 30 dana + Nijedno %1$s poruka @@ -3870,6 +3883,7 @@ Prikaži Melodija zvona Veličina fonta poruka + Prioritet Rješavanje problema s obavijestima @@ -4098,6 +4112,7 @@ Skenirajte QR kôd adresu primatelja + Zahtjev Plati Dostupno stanje: %1$s @@ -4231,6 +4246,7 @@ Možete prikvačiti najviše %1$d razgovora + Slika kontakta Arhivirano @@ -4239,6 +4255,10 @@ Novi razgovor Otvori kameru Još nema razgovora.\nZapočnite slanjem poruke prijatelju. + + Nema razgovora za prikaz + + Postavke mape @@ -4487,6 +4507,7 @@ Sigurnosne kopije razgovora Prijenos računa Prijenos računa na novi Android uređaj + Unesi lozinku sigurnosne kopije Vrati Nije moguće uvesti backupove novijih verzija Signala @@ -4694,6 +4715,7 @@ Nije moguće otvoriti Wi-Fi postavke. Uključite Wi-Fi ručno. + Omogući dozvolu za lokaciju Uključi lokacijske usluge Uključi Wi-Fi @@ -4961,6 +4983,7 @@ Podijeli + Pošalji , %1$s @@ -5266,6 +5289,125 @@ Tipkovnica Pošaljite pritiskom na enter + + Mape razgovora + + Dodajte mapu razgovora + + + + Organizirajte svoje razgovore u mape i brzo se prebacujte između njih na popisu razgovora. + + Mape + + Stvori novu mapu + + Svi razgovori + + Prijedlozi mapa + + Nepročitane poruke + + Nepročitane poruke iz svih razgovora + + Privatni razgovori + + Samo poruke iz privatnih razgovora + + Grupe + + Samo poruke iz grupnih razgovora + + Dodaj + + Dodana je mapa „%1$s“. + + Uredi mapu + + Izbriši mapu + + Dodaj novu mapu + + Utišaj sve + + Promjeni raspored mapa + + Označi sve kao pročitano + + + %1$d vrsta razgovora + %1$d vrste razgovora + %1$d vrsta razgovora + %1$d vrsta razgovora + + + + %1$d razgovor + %1$d razgovora + %1$d razgovora + %1$d razgovora + + + + isključeni razgovori: %1$d + isključeni razgovori: %1$d + isključeni razgovori: %1$d + isključeni razgovori: %1$d + + + + + Stvori novu mapu + + Naziv mape (obavezno) + + Uključeni razgovori + + Dodaj razgovore + + Odaberite razgovore koje želite da se pojave u ovoj mapi. + + Iznimke + + Isključi razgovore + + Odaberite razgovore koje ne želite da se pojave u ovoj mapi. + + Prikaži samo nepročitane razgovore + + Ako uključite ovu opciju, u ovoj mapi će se prikazivati samo razgovori s nepročitanim porukama. + + U broj uključi i utišane razgovore + + Stvori + + Stvoriti novu mapu? + + Želite li stvoriti mapu razgovora pod nazivom „%1$s“? + + Stvori mapu + + Uredi mapu + + Spremi + + Spremiti promjene? + + Želite li spremiti promjene koje ste napravili u ovoj mapi? + + Spremi promjene + + Odbaci + + Izbriši mapu + + Izbrisati mapu razgovora? + + + + Vrste razgovora + + Gotovo Poruke @@ -5352,6 +5494,7 @@ Kvaliteta medija + Kvaliteta poslanih medija Slanje visokokvalitetnih medija zahtjeva veću potrošnju mobilnih podataka. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Vaša pretplata na sigurnosno kopiranje je istekla - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Vaša pretplata na sigurnosno kopiranje je istekla jer nije bilo moguće provesti plaćanje odabranim načinom plaćanja. Nakon %1$d dana medijski zapisi u vašoj sigurnosnoj kopiji bit će izbrisani. + Vaša pretplata na sigurnosno kopiranje je istekla jer nije bilo moguće provesti plaćanje odabranim načinom plaćanja. Nakon %1$d dana medijski zapisi u vašoj sigurnosnoj kopiji bit će izbrisani. + Vaša pretplata na sigurnosno kopiranje je istekla jer nije bilo moguće provesti plaćanje odabranim načinom plaćanja. Nakon %1$d dana medijski zapisi u vašoj sigurnosnoj kopiji bit će izbrisani. + Vaša pretplata na sigurnosno kopiranje je istekla jer nije bilo moguće provesti plaćanje odabranim načinom plaćanja. Nakon %1$d dana medijski zapisi u vašoj sigurnosnoj kopiji bit će izbrisani. U bilo kojem trenutku možete ponovno početi plaćati sigurnosno kopiranje kako biste sačuvali sve svoje medijske zapise. @@ -7570,9 +7713,9 @@ Ako preskočite ovaj korak, medijski zapisi spremljeni u sigurnosnoj kopiji bit će izbrisani za %1$d dana. - Your backups subscription failed to renew + Obnova vaše pretplate na sigurnosno kopiranje nije uspjela - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Provjerite je li vaš način plaćanja ažuran. Dodirnite Upravljanje pretplatom i pod Načini plaćanja dodirnite Ažuriraj. Nije moguće dovršiti sigurnosno kopiranje @@ -7584,7 +7727,7 @@ Upravljanje pretplatom - Subscribe for %1$s/month + Pretplati se za %1$s mjesečno Preuzmi medijske zapise @@ -7619,6 +7762,17 @@ %1$s od %2$s + + + Otkaži preuzimanje + + Preuzimanje: %1$s od %2$s (%3$s %%) + + Nema dovoljno prostora za preuzimanje sigurnosne kopije. Oslobodite %1$s prostora za nastavak preuzimanja. + + Preskoči preuzimanje + + "Posljednje sigurnosno kopiranje podataka nije uspjelo. Provjerite je li vaš uređaj spojen na Wi-Fi i pokušajte ponovno dodirom na \"Izradi sigurnosnu kopiju sada\"." @@ -7672,20 +7826,20 @@ Optimizacija pohrane dostupna je samo uz plaćenu pretplatu na sigurnosno kopiranje Signala. Pretplatite se na sigurnosno kopiranje kako biste koristili ovu značajku. - Subscribe for %1$s/month + Pretplati se za %1$s mjesečno - This media is no longer available + Medijski zapis više nije dostupan - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Vaš trenutni plan za sigurnosno kopiranje Signala uključuje posljednji dan medijskih zapisa. Da biste započeli sigurnosno kopiranje svih svojih medijskih zapisa, nadogradite svoj plan sada. + Vaš trenutni plan za sigurnosno kopiranje Signala uključuje posljednja %1$d dana medijskih zapisa. Da biste započeli sigurnosno kopiranje svih svojih medijskih zapisa, nadogradite svoj plan sada. + Vaš trenutni plan za sigurnosno kopiranje Signala uključuje posljednjih %1$d dana medijskih zapisa. Da biste započeli sigurnosno kopiranje svih svojih medijskih zapisa, nadogradite svoj plan sada. + Vaš trenutni plan za sigurnosno kopiranje Signala uključuje posljednjih %1$d dana medijskih zapisa. Da biste započeli sigurnosno kopiranje svih svojih medijskih zapisa, nadogradite svoj plan sada. - Subscribe for %1$s/month + Pretplati se za %1$s mjesečno Brisanje je sada sinkronizirano na svim vašim uređajima @@ -7733,6 +7887,8 @@ Preuzimanje je dovršeno Sigurnosna kopija bit će izrađena tijekom noćnih sati. + + Pretplata nije aktivna Plan za sigurnosno kopiranje @@ -7741,8 +7897,12 @@ %1$s mjesečno Vaš plan za sigurnosno kopiranje je besplatan - + Obnavlja se %1$s + + Istječe %1$s + + Istekla %1$s Stvorite sigurnosnu kopiju svojih razgovora kako ih ne biste izgubili prilikom zamjene telefona ili ponovne instalacije Mollya. @@ -7787,6 +7947,10 @@ Ručno sigurnosno kopiranje Unesite PIN, lozinku ili uzorak svoga uređaja. + + Ponovno uključi + + Sigurnosno kopiranje je isključeno te su vaši podaci izbrisani iz Signalovog zaštićenog sustava pohrane. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index b119e06fe9..e1d5e3b839 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -365,6 +365,8 @@ Csevegések Üzenetek + + Csevegéstípusok Üzenet %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Kész is vagy! Kezdd el a biztonsági mentést most. A biztonsági másolat méretétől függően ez hosszú ideig tarthat. A biztonsági mentés közben a szokásos módon használhatod a telefonodat. @@ -1966,6 +1968,7 @@ +%1$d meghívott +%1$d meghívott + %1$d további csoport %1$d további csoport @@ -1992,6 +1995,7 @@ Nem található eszköz. Hálózati hiba. Érvénytelen QR kód. + Sajnáljuk, de jelenleg túl sok eszköz van társítva, próbálj meg eltávolítani néhányat Sajnáljuk, de ez nem egy érvényes eszköz-társítási QR kód. Signal eszköz társítása? @@ -2014,11 +2018,13 @@ Jelmondat küldése Érvénytelen jelmondat! Molly feloldása + Molly Android - Képernyőzár Térkép + Rajztű ledobása Cím elfogadása @@ -2522,6 +2528,7 @@ Signal üzenet + Továbbiak @@ -2553,6 +2560,7 @@ Nincsenek matricák telepítve A beérkezett üzenetekben szereplő matricák itt fognak megjelenni Névtelen + Ismeretlen @@ -2774,6 +2782,7 @@ A médiafájl már nem érhető el Nem lehet lejátszani a médiát. + Hiba az üzenet keresése során. Nem található alkalmazás ezen médiafájl megnyitásához. Bezárás @@ -2845,6 +2854,7 @@ Üzenetek Hívások + Hibák Biztonsági mentések Zár státusza @@ -2854,6 +2864,7 @@ Ismeretlen Hangjegyzetek Ismerős csatlakozott a Signalhoz + Nincs elérhető aktivitás, hogy megnyissuk az értesítési csatorna beállításokat. Háttérben futó kapcsolat @@ -3638,10 +3649,12 @@ A teljes üzenetelőzmény véglegesen törlésre kerül minden eszközről. Ez a művelet nem vonható vissza. Összes törlése most + örökké 1 év 6 hónap 30 nap + Egyik sem %1$s üzenet @@ -3666,6 +3679,7 @@ Megjelenítés Csengőhang Üzenetek betűmérete + Prioritás Értesítések hibaelhárítása @@ -3894,6 +3908,7 @@ Olvasd be a kedvezményezett QR kódját + Kérés Fizetés Elérhető egyenleg: %1$s @@ -4025,6 +4040,7 @@ Maximum %1$d csevegést rögzíthetsz + Kontakt fotó kép Archív @@ -4033,6 +4049,10 @@ Új csevegés Kamera megnyitása Még üres a csevegéslista.\nKezdésként üzenj egy barátodnak. + + Nincs megjeleníthető csevegés + + Mappabeállítások @@ -4265,6 +4285,7 @@ Csevegések biztonsági mentése Fiók átvitele Fiók átvitele egy másik Android eszközre + Biztonsági mentés jelmondatának megadása Visszaállítás Az újabb verziókból nincs biztonsági másolat import @@ -4472,6 +4493,7 @@ Sikertelen a Wi-Fi beállítások megnyitása. Kérjük kapcsold be a Wi-Fi-t kézzel! + Helymeghatározás jogosultságok megadása Helymeghatározás-szolgáltatások bekapcsolása Wi-Fi bekapcsolása @@ -4725,6 +4747,7 @@ Megosztás + Küldés , %1$s @@ -5028,6 +5051,119 @@ Billentyűzet Küldés Enterrel + + Csevegési mappák + + Adj hozzá egy csevegési mappát + + + + Csevegéseid mappákba rendezheted, és gyorsan válthatsz közöttük a Csevegőlistán. + + Mappák + + Mappa létrehozása + + Összes csevegés + + Javasolt mappák + + Olvasatlan üzenetek + + Olvasatlan üzenetek az összes csevegésből + + 1:1 csevegések + + Csak a közvetlen csevegésekből származó üzenetek + + Csoportok + + Csak a csoportos csevegésekből származó üzenetek + + Hozzáadás + + %1$s mappa hozzáadva. + + Mappa szerkesztése + + Mappa törlése + + Új mappa hozzáadása + + Összes némítása + + Mappák átrendezése + + Összes megjelölése olvasottként + + + %1$d csevegéstípus + %1$d csevegéstípus + + + + %1$d csevegés + %1$d csevegés + + + + %1$d csevegés kizárva + %1$d csevegés kizárva + + + + + Mappa létrehozása + + Mappa neve (kötelező) + + A csevegésekkel együtt + + Csevegések hozzáadása + + Válaszd ki azokat a csevegéseket, amelyeket meg szeretnél jeleníteni ebben a mappában. + + Kivételek + + Csevegések kizárása + + Válaszd ki azokat a csevegéseket, amelyeket nem szeretnél megjeleníteni ebben a mappában. + + Csak az olvasatlan csevegések megjelenítése + + Ha engedélyezve van, csak az olvasatlan üzeneteket tartalmazó csevegések jelennek meg ebben a mappában. + + A némított csevegéseket is tartalmazza + + Létrehozás + + Mappa létrehozása? + + Létrehozod a(z) „%1$s” csevegési mappát? + + Mappa létrehozása + + Mappa szerkesztése + + Mentés + + Módosítások mentése? + + Mented a csevegési mappában végzett módosításokat? + + Módosítások mentése + + Elvetés + + Mappa törlése + + Törlöd ezt a csevegési mappát? + + + + Csevegéstípusok + + Kész Üzenetek @@ -5112,6 +5248,7 @@ Médiafájl minősége + Elküldött médiafájl minősége A nagy felbontású médiafájl elküldése több adatforgalommal jár. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + A biztonsági mentésre vonatkozó előfizetésed lejárt - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + A biztonsági mentésre vonatkozó előfizetésed lejárt, mert a jelenlegi fizetési móddal nem lehetett megújítani. %1$d nap elteltével a biztonsági mentésben lévő médiafájlok törlődnek. + A biztonsági mentésre vonatkozó előfizetésed lejárt, mert a jelenlegi fizetési móddal nem lehetett megújítani. %1$d nap elteltével a biztonsági mentésben lévő médiafájlok törlődnek. Bármikor újra elkezdhetsz fizetni a biztonsági mentésekért, hogy folytathasd az összes médiafájl biztonsági mentését. @@ -7254,9 +7391,9 @@ Ha a „Kihagyás” lehetőséget választod, a biztonsági mentésben tárolt médiafájlok %1$d napon belül törlődnek. - Your backups subscription failed to renew + Nem sikerült megújítani a biztonsági mentésre vonatkozó előfizetésedet - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Ellenőrizd, hogy a megadott fizetési mód naprakész-e. Koppints az „Előfizetés kezelése” elemre, majd a Fizetési módok alatt koppints a Frissítés lehetőségre. Nem sikerült elvégezni a biztonsági mentést @@ -7268,7 +7405,7 @@ Előfizetés kezelése - Subscribe for %1$s/month + Fizess elő %1$s/hó áron Médiafájl letöltése most @@ -7303,6 +7440,17 @@ %1$s / %2$s + + + Letöltés megszakítása + + Letöltés: %1$s/%2$s (%3$s%%) + + Nincs elég hely a biztonsági másolat letöltéséhez. A folytatáshoz szabadíts fel %1$s helyet. + + Letöltés kihagyása + + "Az utolsó biztonsági mentést nem lehetett befejezni. Győződj meg róla, hogy a telefonod csatlakozik a wifihez, és az újrapróbálkozáshoz koppints a Biztonsági mentés most elemre." @@ -7356,18 +7504,18 @@ A tárhely-optimalizálás csak a díj ellenében igénybe vehető Signal biztonsági mentésekkel használható. A funkció használatának megkezdéséhez frissítsd a biztonsági csomagodat. - Subscribe for %1$s/month + Fizess elő %1$s/hó áron - This media is no longer available + Ez a médiafájl már nem érhető el - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + A jelenlegi Signal biztonsági mentési csomagod tartalmazza a legutóbbi %1$d nap médiafájljait. Az összes médiafájl biztonsági mentésének megkezdéséhez frissíts most. + A jelenlegi Signal biztonsági mentési csomagod tartalmazza a legutóbbi %1$d nap médiafájljait. Az összes médiafájl biztonsági mentésének megkezdéséhez frissíts most. - Subscribe for %1$s/month + Fizess elő %1$s/hó áron A törlés mostantól az összes eszközödön szinkronizálva van @@ -7415,6 +7563,8 @@ A letöltés kész A biztonsági mentés éjszaka kerül létrehozásra. + + Az előfizetés inaktív Biztonsági terv @@ -7423,8 +7573,12 @@ %1$s/hó A biztonsági terv ingyenes - + Megújul ekkor: %1$s + + %1$s dátummal lejár + + %1$s dátummal lejárt Készíts biztonsági másolatot az üzenetelőzményeidről, hogy soha ne veszíts el adatot új telefon vásárlásakor vagy a Molly újratelepítésekor. @@ -7469,6 +7623,10 @@ Manuális biztonsági mentés Kérjük, add meg az eszköz PIN-kódját, jelszavát vagy mintáját. + + Engedélyezd újra a biztonsági mentéseket + + A biztonsági mentéseket kikapcsoltuk, az adataidat töröltük a Signal biztonságos tárolási szolgáltatásából. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 9599aae806..b4769f262d 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -362,6 +362,8 @@ Obrolan Pesan + + Jenis obrolan Pesan %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + Semua sudah siap. Mulai pencadangan Anda sekarang. Tergantung ukuran data cadangan Anda, ini bisa memakan waktu lama. Anda dapat menggunakan ponsel seperti biasa saat pencadangan berlangsung. @@ -1905,6 +1907,7 @@ +%1$d diundang + %1$d grup tambahan @@ -1930,6 +1933,7 @@ Perangkat tidak ditemukan. Jaringan gagal. Kode QR tidak valid. + Maaf, Anda memiliki terlalu banyak perangkat yang terhubung, coba buang beberapa Maaf, ini bukan tautan perangkat kode QR yang valid. Hubungkan perangkat Signal? @@ -1951,11 +1955,13 @@ Kirim frasa sandi Frasa sandi tidak valid! Buka kunci Molly + Molly Android - Kunci Layar Peta + Pasang pointer tempat Terima alamat @@ -2437,6 +2443,7 @@ Pesan Signal + Selanjutnya @@ -2468,6 +2475,7 @@ Tidak ada stiker terpasang Stiker-stiker dari pesan masuk akan muncul di sini Tanpa judul + Tidak dikenal @@ -2688,6 +2696,7 @@ Media tidak tersedia. Tidak dapat memutar media. + Eror saat menemukan pesan. Tidak dapat menemukan aplikasi untuk berbagi media ini. Tutup @@ -2757,6 +2766,7 @@ Pesan Panggilan + Gagal Cadangan Status penguncian @@ -2766,6 +2776,7 @@ Tidak dikenal Pesan suara Kontak bergabung dengan Signal + Tidak ada aktivitas yang tersedia untuk membuka pengaturan notifikasi saluran. Koneksi belakang layar @@ -3537,10 +3548,12 @@ Semua riwayat pesan akan dihapus dari semua perangkat secara permanen. Tindakan ini tidak dapat dibatalkan. Hapus semua sekarang + Selamanya 1 tahun 6 bulan 30 hari + Kosong %1$s pesan @@ -3564,6 +3577,7 @@ Tampilkan Nada dering Ukuran huruf pesan + Prioritas Pemecahan masalah terkait notifikasi @@ -3792,6 +3806,7 @@ Pindai kode QR alamat untuk penerima pembayaran + Permintaan Bayar Saldo tersedia: %1$s @@ -3922,6 +3937,7 @@ Anda hanya dapat menyematkan hingga %1$d obrolan + Gambar Foto Kontak Diarsipkan @@ -3930,6 +3946,10 @@ Obrolan baru Buka Kamera Belum ada obrolan.\nMulailah dengan mengirim pesan ke seorang teman. + + Tidak ada obrolan untuk ditampilkan + + Pengaturan folder @@ -4154,6 +4174,7 @@ Cadangan obrolan Transfer akun Transfer akun ke perangkat Android baru + Masukkan frasa sandi cadangan Pulihkan Tidak bisa impor cadangan dari versi lebih baru Signal @@ -4361,6 +4382,7 @@ Tidak dapat membuka Pengaturan Wi-Fi. Mohon nyalakan Wi-Fi secara manual. + Izinkan penggunaan lokasi Nyalakan layanan lokasi Nyalakan Wi-Fi @@ -4607,6 +4629,7 @@ Bagikan + Kirim , %1$s @@ -4909,6 +4932,116 @@ Papan ketik Kirim dengan enter + + Folder obrolan + + Tambahkan folder obrolan + + + + Susun obrolan ke dalam folder agar bisa beralih dengan cepat antarfolder di daftar obrolan. + + Folder + + Buat folder + + Semua obrolan + + Folder yang disarankan + + Belum dibaca + + Pesan yang belum dibaca dari semua obrolan + + Obrolan 1:1 + + Hanya pesan dari obrolan langsung + + Grup + + Hanya pesan dari obrolan grup + + Tambahkan + + Folder %1$s ditambahkan. + + Edit folder + + Hapus folder + + Tambahkan folder baru + + Bisukan semua + + Susun ulang folder + + Tandai semua sudah dibaca + + + %1$d jenis obrolan + + + + %1$d obrolan + + + + %1$d obrolan dikecualikan + + + + + Buat folder + + Nama folder (wajib) + + Obrolan yang disertakan + + Tambahkan obrolan + + Pilih obrolan yang ingin Anda tampilkan di folder ini. + + Pengecualian + + Kecualikan obrolan + + Pilih obrolan yang tidak ingin Anda tampilkan di folder ini. + + Hanya tampilkan obrolan yang belum dibaca + + Jika diaktifkan, hanya obrolan dengan pesan belum dibaca yang akan ditampilkan di folder ini. + + Sertakan obrolan yang dibisukan + + Buat + + Buat folder? + + Mau buat folder obrolan \"%1$s\"? + + Buat folder + + Edit folder + + Simpan + + Simpan perubahan? + + Mau simpan perubahan yang telah dibuat pada folder obrolan ini? + + Simpan perubahan + + Hapus + + Hapus folder + + Hapus folder obrolan ini? + + + + Jenis obrolan + + Selesai Pesan @@ -4992,6 +5125,7 @@ Kualitas media + Kualitas media terkirim Mengirimkan media dengan kualitas tinggi akan menggunakan lebih banyak data. @@ -7076,10 +7210,10 @@ - Your backups subscription expired + Langganan pencadangan Anda kedaluwarsa - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Paket pencadangan Anda telah kedaluwarsa karena tidak dapat diperpanjang dengan metode pembayaran Anda saat ini. Setelah %1$d hari, media di cadangan Anda akan dihapus. Anda dapat kembali membayar paket pencadangan data kapan saja agar bisa lanjut mencadangkan semua media Anda. @@ -7096,9 +7230,9 @@ Jika Anda memilih \"Lewati\", media di cadangan Anda akan dihapus dalam %1$d hari. - Your backups subscription failed to renew + Langganan pencadangan Anda gagal diperpanjang - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Cek dan pastikan metode pembayaran Anda sudah yang terbaru. Ketuk Kelola langganan, dan di bagian Metode pembayaran ketuk Perbarui. Tidak dapat menyelesaikan pencadangan @@ -7110,7 +7244,7 @@ Kelola langganan - Subscribe for %1$s/month + Langganan dengan %1$s/bulan Unduh media sekarang @@ -7145,6 +7279,17 @@ %1$s dari %2$s + + + Batalkan pengunduhan + + Mengunduh: %1$s dari %2$s (%3$s%%) + + Ruang tidak cukup untuk mengunduh Cadangan Anda. Untuk lanjut, kosongkan ruang %1$s. + + Lewati pengunduhan + + "Pencadangan terakhir Anda tidak dapat diselesaikan. Pastikan ponsel terhubung ke Wi-Fi dan ketuk Cadangkan sekarang untuk coba lagi." @@ -7198,17 +7343,17 @@ Pengoptimalan penyimpanan hanya dapat digunakan dengan Pencadangan Signal berbayar. Upgrade paket pencadangan Anda untuk mulai menggunakan fitur ini. - Subscribe for %1$s/month + Langganan dengan %1$s/bulan - This media is no longer available + Media ini sudah tidak tersedia - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Paket pencadangan Signal Anda saat ini mencakup media selama %1$d hari terakhir. Untuk mulai mencadangkan semua media, tingkatkan paket sekarang. - Subscribe for %1$s/month + Langganan dengan %1$s/bulan Penghapusan kini disinkronkan di semua perangkat Anda @@ -7256,6 +7401,8 @@ Unduhan selesai Pencadangan akan diproses dalam semalam. + + Langganan tidak aktif Paket pencadangan @@ -7264,8 +7411,12 @@ %1$s/bulan Paket pencadangan Anda gratis - + Diperpanjang %1$s + + Kedaluwarsa pada %1$s + + Kadaluwarsa pada %1$s Cadangkan riwayat pesan sehingga data Anda tidak akan hilang saat Anda memakai ponsel baru atau menginstal ulang Molly. @@ -7310,6 +7461,10 @@ Cadangkan manual Masukkan pin, kata sandi, atau pola kunci perangkat Anda. + + Aktifkan kembali cadangan + + Pencadangan telah dinonaktifkan dan data Anda telah dihapus dari layanan penyimpanan aman Signal. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4ec6409375..06822bdd70 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -365,6 +365,8 @@ Chat Messaggi + + Tipi di chat Messaggio %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Non devi fare nient\'altro. Comincia subito il tuo backup. A seconda delle dimensioni del tuo backup, potrebbe essere necessario più tempo. Puoi usare il tuo telefono normalmente mentre il backup è in corso. @@ -1966,6 +1968,7 @@ +%1$d persona invitata +%1$d persone invitate + %1$d gruppo ulteriore %1$d gruppi ulteriori @@ -1992,6 +1995,7 @@ Nessun dispositivo trovato. Errore di rete. Codice QR non valido. + Siamo spiacenti, hai troppi dispositivi connessi, prova a scollegarne qualcuno Ci spiace, questo non è un codice QR valido per collegare il dispositivo. Collegare un dispositivo Signal? @@ -2014,11 +2018,13 @@ Inserisci password Password non valida! Sblocca Molly + Molly Android - Blocco schermo Mappa + Posiziona l\'indicatore Accetta indirizzo @@ -2522,6 +2528,7 @@ Messaggio Signal + Altro @@ -2553,6 +2560,7 @@ Nessun pacchetto di adesivi installato Gli adesivi dei messaggi in arrivo appariranno qui Senza titolo + Sconosciuto @@ -2774,6 +2782,7 @@ Media non più disponibile. Impossibile riprodurre il video. + Errore durante la ricerca del messaggio. Impossibile trovare un\'app per condividere questo media. Chiudi @@ -2845,6 +2854,7 @@ Messaggi Chiamate + Errori Backup In stato bloccato @@ -2854,6 +2864,7 @@ Sconosciuto Note vocali Quando un contatto si unisce a Signal + Nessuna attività disponibile per aprire le impostazioni del canale di notifica. Connessione in background @@ -3638,10 +3649,12 @@ Tutta la cronologia messaggi verrà rimossa definitivamente da tutti i dispositivi. Quest\'azione non può essere annullata. Elimina tutto ora + Per sempre 1 anno 6 mesi 30 giorni + Nessuno %1$s messaggio @@ -3666,6 +3679,7 @@ Mostra Suoneria Dimensione carattere messaggio + Priorità Risoluzione dei problemi relativi alle notifiche @@ -3894,6 +3908,7 @@ Scansiona il codice QR dell\'indirizzo del beneficiario + Richiedi Paga Saldo disponibile: %1$s @@ -4025,6 +4040,7 @@ Puoi fissare solo fino a %1$d chat + Foto del contatto Archiviate @@ -4033,6 +4049,10 @@ Nuova chat Apri Fotocamera Ancora nessuna chat.\nInizia inviando un messaggio a un amico. + + Nessuna chat da mostrare + + Impostazioni cartella @@ -4265,6 +4285,7 @@ Backup delle chat Trasferisci account Trasferisci l\'account su un nuovo dispositivo Android + Inserire passphrase del backup Ripristina Imposs. importare backup da versioni recenti di Signal @@ -4472,6 +4493,7 @@ Impossibile aprire le impostazioni Wi-Fi. Attiva il Wi-Fi manualmente. + Concedi l\'autorizzazione alla posizione Attiva i servizi di localizzazione Attiva il Wi-Fi @@ -4725,6 +4747,7 @@ Condividi + Invia , %1$s @@ -5028,6 +5051,119 @@ Tastiera Invia premendo invio + + Cartelle delle chat + + Aggiungi una cartella per le chat + + + + Suddividi le tue chat in più cartelle e passa al volo da una cartella all\'altra nell\'elenco delle chat. + + Cartelle + + Crea una cartella + + Tutte le chat + + Cartelle suggerite + + Da leggere + + Messaggi non letti da tutte le chat + + Chat singole + + Solo messaggi da chat singole + + Gruppi + + Solo messaggi da chat di gruppo + + Aggiungi + + %1$s cartella aggiunta. + + Modifica cartella + + Elimina cartella + + Aggiungi nuova cartella + + Silenzia tutte + + Riordina cartelle + + Segna tutto come già letto + + + %1$d tipo di chat + %1$d tipi di chat + + + + %1$d chat + %1$d chat + + + + %1$d chat esclusa + %1$d chat escluse + + + + + Crea una cartella + + Nome cartella (obbligatorio) + + Chat incluse + + Aggiungi chat + + Scegli le chat che vuoi vedere in questa cartella. + + Eccezioni + + Escludi chat + + Scegli le chat che non vuoi vedere in questa cartella. + + Mostra solo chat non lette + + Se attivi questa opzione, in questa cartella vedrai solo chat con messaggi non letti. + + Includi chat silenziate + + Crea + + Creare la cartella? + + Vuoi creare la cartella \"%1$s\" per le chat? + + Crea cartella + + Modifica cartella + + Salva + + Salvare modifiche? + + Vuoi salvare le modifiche effettuate a questa cartella? + + Salva le modifiche + + Elimina + + Elimina cartella + + Vuoi eliminare questa cartella per le chat? + + + + Tipi di chat + + Fatto Messaggi @@ -5112,6 +5248,7 @@ Qualità media + Qualità media inviati L\'invio di media in alta qualità utilizzerà più dati. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Il tuo piano per i backup è scaduto - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Il tuo abbonamento per i backup è terminato perché non siamo riusciti a rinnovarlo usando il tuo metodo di pagamento attuale. Tra %1$d giorno, tutti i media nel tuo backup verranno eliminati. + Il tuo abbonamento per i backup è terminato perché non siamo riusciti a rinnovarlo usando il tuo metodo di pagamento attuale. Tra %1$d giorni, tutti i media nel tuo backup verranno eliminati. Puoi tornare a pagare per il backup dei tuoi media in qualsiasi momento. @@ -7254,9 +7391,9 @@ Se scegli \"Salta\", i media presenti nel tuo backup verranno eliminati tra %1$d giorni. - Your backups subscription failed to renew + Il tuo piano per i backup non è stato rinnovato - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Assicurati che il tuo metodo di pagamento sia aggiornato. Vai su \"Gestisci abbonamento\" e sotto l\'opzione \"Metodi di pagamento\" seleziona \"Aggiorna\". Impossibile completare il backup @@ -7266,9 +7403,9 @@ Salta - Gestisci contributo + Gestisci abbonamento - Subscribe for %1$s/month + Abbonati a %1$s al mese Scarica ora i media @@ -7303,6 +7440,17 @@ %1$s di %2$s + + + Annulla download + + Download in corso: %1$s di %2$s (%3$s%%) + + Spazio insufficiente per scaricare il tuo backup. Per continuare devi liberare %1$s. + + Salta download + + "Non è stato possibile completare il tuo ultimo backup. Assicurati che il tuo dispositivo sia collegato a una rete Wi-Fi e tocca su \"Fai ora il backup\" per riprovare." @@ -7356,18 +7504,18 @@ L\'ottimizzazione dello spazio di archiviazione è una funzione disponibile solo con i piani a pagamento di Signal. Scegli il tuo piano di backup per poterla usare. - Subscribe for %1$s/month + Abbonati a %1$s al mese - This media is no longer available + Questo media non è più disponibile - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Il tuo piano per i backup su Signal include %1$d giorno di media (il più recente). Se desideri un backup completo di tutti i tuoi media, passa a un altro abbonamento. + Il tuo piano per i backup su Signal include gli ultimi %1$d giorni di media. Se desideri un backup completo di tutti i tuoi media, passa a un altro abbonamento. - Subscribe for %1$s/month + Abbonati a %1$s al mese Il processo di eliminazione è ora sincronizzato su tutti i tuoi dispositivi @@ -7410,11 +7558,13 @@ Tipo di backup cambiato e donazione annullata - Contributo annullato + Abbonamento annullato Download completato Il backup verrà creato stanotte. + + Abbonamento non attivo Piano del backup @@ -7423,8 +7573,12 @@ %1$s al mese Piano gratuito per i backup - + Rinnovo %1$s + + Scade il giorno %1$s + + Scaduto il giorno %1$s Salva la cronologia dei tuoi messaggi con dei backup per non perdere neanche una virgola quando compri un nuovo telefono o reinstalli Molly. @@ -7469,6 +7623,10 @@ Backup manuale Inserisci PIN, password o pattern del dispositivo. + + Riattiva i backup + + I backup sono stati disattivati e i tuoi dati sono stati eliminati dal servizio di archiviazione sicura di Signal. diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 64b80e5aa5..afbd2076ca 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -371,6 +371,8 @@ צ׳אטים הודעות + + סוגי צ׳אטים %1$s של הודעה @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + הכל מוכן. אפשר להתחיל את הגיבוי. בהתאם לגודל הגיבוי שלך, זה עשוי להימשך זמן רב. אפשר להשתמש בטלפון שלך כרגיל בזמן שהגיבוי מתבצע. @@ -2088,6 +2090,7 @@ +%1$d הוזמנו +%1$d הוזמנו + קבוצה %1$d נוספת %1$d קבוצות נוספות @@ -2116,6 +2119,7 @@ לא נמצא מכשיר. שגיאת רשת. קוד QR בלתי תקף. + סליחה, יש לך יותר מדי מכשירים מקושרים, נסה להסיר כמה סליחה, זה לא קוד QR תקף של קישור מכשיר. לקשר מכשיר Signal? @@ -2140,11 +2144,13 @@ הגש משפט־סיסמה משפט־סיסמה בלתי תקף! שחרר נעילת Molly + Molly Android - מסך נעילה מפה + זרוק מצביע אשר כתובת @@ -2692,6 +2698,7 @@ הודעת Signal + עוד @@ -2723,6 +2730,7 @@ אין מדבקות מותקנות מדבקות מהודעות נכנסות יופיעו כאן ללא כותרת + בלתי ידוע @@ -2946,6 +2954,7 @@ מדיה אינה זמינה יותר. לא ניתן לנגן מדיה. + שגיאה במציאת הודעה. לא ניתן למצוא יישום שמסוגל לשתף מדיה זו. סגור @@ -3021,6 +3030,7 @@ הודעות שיחות + כישלונות גיבויים מעמד נעילה @@ -3030,6 +3040,7 @@ בלתי ידוע הערות קוליות איש קשר הצטרף אל Signal + אין פעילות זמינה כדי לפתוח הגדרות של ערוץ התראות. חיבור רקע @@ -3840,10 +3851,12 @@ כל היסטוריית ההודעות תוסר לצמיתות מכל המכשירים. פעולה זו לא ניתנת לביטול. למחוק הכל עכשיו + לנצח שנה 1 6 חודשים 30 ימים + אין הודעה %1$s @@ -3870,6 +3883,7 @@ הראה צלצול גודל גופן הודעה + עדיפות פתרון תקלות של התראות @@ -4098,6 +4112,7 @@ סרוק את קוד ה־QR של הכתובת של המשלם + בקשה שלם מאזן זמין: %1$s @@ -4231,6 +4246,7 @@ אפשר להצמיד רק עד %1$d צ׳אטים + תמונת איש קשר בארכיון @@ -4239,6 +4255,10 @@ צ\'אט חדש פתח מצלמה אין צ׳אטים עדיין.\nאפשר להתחיל באמצעות שליחת הודעה לחבר או חברה. + + אין צ׳אטים להצגה + + הגדרות תיקיה @@ -4487,6 +4507,7 @@ גיבויי צ׳אטים העבר חשבון העבר חשבון אל מכשיר Android חדש + הכנס משפט־סיסמה של גיבוי שחזר לא ניתן לייבא גיבויים מגרסאות חדשות יותר של Signal @@ -4694,6 +4715,7 @@ לא היה ניתן לפתוח הגדרות Wi-Fi. אנא הפעל Wi-Fi באופן ידני. + הענק הרשאת מיקום הפעל שירותי מיקום הפעל Wi-Fi @@ -4961,6 +4983,7 @@ שתף + שלח , %1$s @@ -5266,6 +5289,125 @@ מקלדת שליחה עם enter + + תיקיות צ׳אטים + + הוספת תיקיית צ׳אטים + + + + ארגון הצ׳אטים שלך בתיקיות והחלפה מהירה ביניהם ברשימת הצ׳אטים שלך. + + תיקיות + + יצירת תיקיה + + כל הצ׳אטים + + תיקיות מוצעות + + לא נקראו + + הודעות שלא נקראו מכל הצ׳אטים + + צ׳אטים 1:1 + + רק הודעות מצ׳אטים ישירים + + קבוצות + + רק הודעות מצ׳אטים קבוצתיים + + הוסף + + תיקיה נוספה: %1$s. + + עריכת תיקיה + + מחיקת תיקיה + + הוספת תיקיה חדשה + + השתקת הכל + + סידור תיקיות מחדש + + סמן הכול כנקרא + + + סוג צ׳אט %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$s״? + + יצירת תיקיה + + עריכת תיקיה + + שמירה + + לשמור שינויים? + + האם ברצונך לשמור את השינויים שביצעת בתיקיית הצ׳אטים הזו? + + שמירת שינויים + + השמט + + מחיקת תיקיה + + למחוק את תיקיית הצ׳אטים הזו? + + + + סוגי צ׳אטים + + סיום הודעות @@ -5352,6 +5494,7 @@ איכות מדיה + הגדר איכות מדיה שליחת מדיה באיכות גבוהה תשתמש ביותר נתונים. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + פג תוקף מנוי הגיבויים שלך - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + תכנית הגיבוי שלך פגה תוקף כי לא ניתן היה לחדש אותה באמצעות אמצעי התשלום הנוכחי שלך. לאחר יום %1$d, המדיה בגיבוי שלך תימחק. + תכנית הגיבוי שלך פגה תוקף כי לא ניתן היה לחדש אותה באמצעות אמצעי התשלום הנוכחי שלך. לאחר יומיים, המדיה בגיבוי שלך תימחק. + תכנית הגיבוי שלך פגה תוקף כי לא ניתן היה לחדש אותה באמצעות אמצעי התשלום הנוכחי שלך. לאחר %1$d ימים, המדיה בגיבוי שלך תימחק. + תכנית הגיבוי שלך פגה תוקף כי לא ניתן היה לחדש אותה באמצעות אמצעי התשלום הנוכחי שלך. לאחר %1$d ימים, המדיה בגיבוי שלך תימחק. אפשר לחזור לשלם על גיבויים בכל עת כדי להמשיך לגבות את כל המדיה שלך. @@ -7570,9 +7713,9 @@ בחירה ב״דילוג״ תגרום למחיקת המדיה בגיבוי שלך בעוד %1$d ימים. - Your backups subscription failed to renew + לא ניתן היה לחדש את מנוי הגיבויים שלך - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + כדאי לוודא שאמצעי התשלום שלך מעודכן. יש ללחוץ על ״ניהול מנוי,״ ותחת ״אמצעי תשלום״ ללחוץ על ״עדכון.״ לא היה ניתן להשלים את הגיבוי @@ -7584,7 +7727,7 @@ ניהול מנוי - Subscribe for %1$s/month + רכישת מנוי עבור %1$s/חודש הורדת מדיה כעת @@ -7619,6 +7762,17 @@ %1$s מתוך %2$s + + + ביטול הורדה + + מורידים: %1$s מתוך %2$s (%3$s%%) + + אין מספיק מקום כדי להוריד את הגיבוי שלך. כדי להמשיך, יש לפנות שטח של %1$s. + + דילוג על הורדה + + "לא ניתן היה להשלים את הגיבוי האחרון שלך. חשוב לוודא שהטלפון שלך מחובר ל–Wi–Fi וללחוץ ״לגבות כעת״ כדי לנסות שוב." @@ -7672,20 +7826,20 @@ ניתן להשתמש באופטימיזציה של אחסון רק עם אפשרות הגיבוי בתשלום של Signal. אפשר לשדרג את תכנית הגיבוי שלך כדי להתחיל להשתמש בפיצ׳ר. - Subscribe for %1$s/month + רכישת מנוי עבור %1$s/חודש - This media is no longer available + המדיה הזו לא זמינה יותר - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + תכנית הגיבוי הנוכחית שלך ב–Signal כוללת את היום האחרון ביותר של מדיה. כדי להתחיל לגבות את כל המדיה שלך, אפשר לשדרג עכשיו. + תכנית הגיבוי הנוכחית שלך ב–Signal כוללת את %1$d ימי המדיה האחרונים ביותר. כדי להתחיל לגבות את כל המדיה שלך, אפשר לשדרג עכשיו. + תכנית הגיבוי הנוכחית שלך ב–Signal כוללת את %1$d ימי המדיה האחרונים ביותר. כדי להתחיל לגבות את כל המדיה שלך, אפשר לשדרג עכשיו. + תכנית הגיבוי הנוכחית שלך ב–Signal כוללת את %1$d ימי המדיה האחרונים ביותר. כדי להתחיל לגבות את כל המדיה שלך, אפשר לשדרג עכשיו. - Subscribe for %1$s/month + רכישת מנוי עבור %1$s/חודש המחיקה מסונכרנת כעת בכל המכשירים שלך @@ -7728,11 +7882,13 @@ סוג הגיבוי השתנה והמנוי בוטל - מינוי בוטל + מנוי בוטל ההורדה הושלמה הגיבוי ייווצר במהלך הלילה. + + מנוי לא פעיל תכנית גיבוי @@ -7741,8 +7897,12 @@ %1$s לחודש תכנית הגיבוי שלך היא חינמית - + מתחדש ב–%1$s + + תאריך תפוגה: %1$s + + תאריך התפוגה היה: %1$s אפשר לגבות את היסטוריית ההודעות כך שאף פעם לא מאבדים נתונים כשמחליפים טלפון או מתקינים מחדש את Molly. @@ -7787,6 +7947,10 @@ גיבוי ידני יש להכניס את קוד ה–PIN, הסיסמה, או התבנית של המכשיר שלך. + + הפעלת גיבויים מחדש + + הגיבויים הושבתו והנתונים שלך נמחקו משירות האחסון המאובטח של Signal. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 08667eb02a..d73b57f413 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -362,6 +362,8 @@ チャット メッセージ + + チャットのタイプ %1$s にメッセージを送る @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + すべての設定が完了しています。今すぐバックアップを開始しましょう。 バックアップのサイズによっては、時間がかかる場合があります。バックアップが実行されている間でも、通常どおり電話を使用できます。 @@ -1905,6 +1907,7 @@ +%1$d人招待中 + ほか%1$dグループ @@ -1930,6 +1933,7 @@ 端末がありません。 ネットワークエラー。 QR コードが無効です。 + リンクしている端末が多すぎます。いくつか削除してください。 この端末リンク用QRコードは正しくありません。 Signal端末をリンクしますか? @@ -1951,11 +1955,13 @@ パスフレーズを設定する 不正なパスフレーズです! Mollyのロックを解除する + Molly Android - ロック画面 地図 + ピンを打つ アドレスを受け入れる @@ -2437,6 +2443,7 @@ Signalメッセージ + その他 @@ -2468,6 +2475,7 @@ ステッカーはインストールされていません 受信メッセージのステッカーはここに表示されます 無題 + 不明 @@ -2688,6 +2696,7 @@ メディアが存在しません。 メディアを再生できません。 + メッセージ検索中にエラーが発生しました。 このメディアを共有できるアプリが見つかりません。 閉じる @@ -2757,6 +2766,7 @@ メッセージ 通話 + 障害 バックアップ ロック状態 @@ -2766,6 +2776,7 @@ 不明 音声メモ 連絡先のSignal参加時 + 通知チャネルの設定を開くためのアクティビティがありません。 バックグラウンド接続 @@ -3537,10 +3548,12 @@ すべてのメッセージ履歴を、すべての端末から完全に削除します。削除すると復元することはできません。 すべて消去する + 無期限 1年 6ヶ月 30日 + なし %1$s件のメッセージ @@ -3564,6 +3577,7 @@ 表示 着信音 メッセージのフォントサイズ + 優先度 さまざまな通知のトラブルシューティング @@ -3792,6 +3806,7 @@ 受取人のアドレスQRコードをスキャンしてください + 請求する 送金 利用可能残高: %1$s @@ -3922,6 +3937,7 @@ ピン留めできるチャットは%1$d件までです + 連絡先の画像 アーカイブ済み @@ -3930,6 +3946,10 @@ 新しいチャット カメラを開く まだチャットがありません。\n友達にメッセージを送って始めましょう。 + + 表示するチャットがありません + + フォルダを設定する @@ -4154,6 +4174,7 @@ チャットのバックアップ アカウントの移行 新しいAndroid端末にアカウントを移行します。 + バックアップ用パスフレーズを入力してください 復元する 現在ご利用のものより新しいバージョンの Signal からはバックアップをインポートできません @@ -4361,6 +4382,7 @@ Wi-Fi設定を開けません。手動でWi-Fiを有効にしてください。 + 位置情報へのアクセスを許可する 位置情報サービスを有効にする Wi-Fiを有効にしてください @@ -4607,6 +4629,7 @@ 共有する + 送信する , %1$s @@ -4909,6 +4932,116 @@ キーボード Enterで送信 + + チャットフォルダ + + チャットフォルダを追加する + + + + チャットをフォルダに整理し、チャットリストですばやく切り替えることができます。 + + フォルダ + + フォルダを作成する + + すべてのチャット + + おすすめのフォルダ + + 未読 + + すべてのチャットの未読メッセージ + + 1対1のチャット + + 1対1のチャットのメッセージのみ + + グループ + + グループチャットのメッセージのみ + + 追加する + + 「%1$s」のフォルダが追加されました。 + + フォルダを編集する + + フォルダを消去する + + 新しいフォルダを追加する + + すべてミュートする + + フォルダの順序を変更する + + すべて既読にする + + + %1$d種類のチャットタイプ + + + + %1$d件のチャット + + + + %1$d件のチャットを除く + + + + + フォルダを作成する + + フォルダ名(必須) + + 対象のチャット + + チャットを追加する + + このフォルダに表示したいチャットを選択してください。 + + 例外 + + チャットを除外する + + このフォルダ内に表示したくないチャットを選択してください。 + + 未読のチャットだけを表示する + + 有効にすると、このフォルダ内に表示されるのは未読メッセージのあるチャットだけになります。 + + ミュート中のチャットも含める + + 作成する + + フォルダを作成しますか? + + 「%1$s」のチャットフォルダを作成しますか? + + フォルダを作成する + + フォルダを編集する + + 保存 + + 変更を保存しますか? + + このチャットフォルダへの変更を保存しますか? + + 変更を保存する + + 破棄する + + フォルダを消去する + + このチャットフォルダを消去しますか? + + + + チャットのタイプ + + 完了 メッセージ @@ -4992,6 +5125,7 @@ メディアの画質 + 送信メディアの画質 高画質なメディアの送信には、より多くのデータを使用します。 @@ -7076,10 +7210,10 @@ - Your backups subscription expired + バックアップサブスクリプションの有効期限が切れています - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + 現在のお支払い方法で更新できなかったため、バックアッププランの有効期限が切れました。%1$d日後にバックアップ内のメディアは消去されます。 決済の再開はいつでも可能であり、すべてのメディアのバックアップは継続されます。 @@ -7096,9 +7230,9 @@ 「スキップ」を選択すると、バックアップ内のメディアは%1$d日後に消去されます。 - Your backups subscription failed to renew + バックアップサブスクリプションの更新ができませんでした - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + お支払い方法が現在も有効なものであるかをご確認ください。「サブスクリプションを管理する」をタップして、お支払い方法の下に表示される「アップデートする」をタップします。 バックアップが完了していません @@ -7110,7 +7244,7 @@ サブスクリプションを管理する - Subscribe for %1$s/month + %1$s /月で申し込む 今すぐメディアをダウンロードする @@ -7145,6 +7279,17 @@ %1$s/%2$s + + + ダウンロードをキャンセルする + + ダウンロード中:%2$s のうち %1$s (%3$s%%) + + バックアップをダウンロードできる十分な空き容量がありません。続けるためには%1$sの空き容量を確保してください。 + + ダウンロードをスキップする + + "前回のバックアップは完了していません。ご利用中のスマートフォンがWi-Fiに接続されている事をご確認の上、「今すぐバックアップを実行する」をタップしてもう一度お試しください。" @@ -7198,17 +7343,17 @@ ストレージの最適化は、Signalバックアップの有料版でのみご利用いただけます。この機能をご利用になるには、バックアッププランをアップグレードしてください。 - Subscribe for %1$s/month + %1$s /月で申し込む - This media is no longer available + このメディアはすでに消去されています - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + ご利用中のSignalバックアッププランには、直近%1$d日間のメディアのバックアップが含まれています。すべてのメディアのバックアップを開始するには、今すぐアップグレードしてください。 - Subscribe for %1$s/month + %1$s /月で申し込む 消去機能がすべての端末で同期されるようになりました @@ -7256,6 +7401,8 @@ ダウンロード完了 バックアップは夜間に作成されます。 + + サブスクリプションは非アクティブです バックアッププラン @@ -7264,8 +7411,12 @@ %1$s/月プラン 現在のバックアッププランは無料プランです - + 更新 %1$s + + 有効期限:%1$s + + 有効期限:%1$s メッセージ履歴をバックアップしておくと、電話を買い替えたり、Mollyを再インストールしたりしてもデータが失われることはありません。 @@ -7310,6 +7461,10 @@ 手動でバックアップ ご利用の端末のPIN、パスワード、またはパターンを入力してください。 + + バックアップをもう一度有効にする + + バックアップがオフになり、データはSignalの安全なストレージサービスから消去されました。 diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 2510a6ce82..abadfe6699 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -365,6 +365,8 @@ ჩატები შეტყობინებები + + ჩატის ტიპები შეტყობინება %1$s @@ -1966,6 +1968,7 @@ +%1$d მოწვეული +%1$d მოწვეული + დამატებით %1$d ჯგუფი დამატებით %1$d ჯგუფი @@ -1992,6 +1995,7 @@ მოწყობილობის მოძებნა ვერ მოხერხდა. ქსელის ხარვეზი. არასწორი QR კოდი. + ვწუხვართ, უკვე ძალიან ბევრი მოწყობილობა გაქვს დაკავშირებული, ზოგიერთის წაშლა სცადე ვწუხვართ, ეს არ არის მოწყობილობის მიბმის მოქმედი QR კოდი. მივაბათ Signal-ს მოწყობილობა? @@ -2014,11 +2018,13 @@ პაროლ-ფრაზის დადასტურება არასწორი პაროლ-ფრაზა! Molly-ის გახსნა + Molly Android - დაბლოკილი ეკრანი რუკა + პინის დასმა მისამართის დადასტურება @@ -2522,6 +2528,7 @@ Signal-ის შეტყობინება + მეტი @@ -2553,6 +2560,7 @@ გადმოწერილი სტიკერები ვერ მოიძებნა სტიკერები შემომავალი შეტყობინებებიდან აქ გამოჩნდება უსათაურო + უცნობი @@ -2774,6 +2782,7 @@ მედია-ფაილი აღარაა ხელმისაწვდომი. მედია ფაილის ჩართვა ვერ მოხერხდა + წერილის მოძებნა ვერ მოხერხდა. ვერ მოიძებნა აპი, რომელსაც შეუძლია ამ მედია-ფაილის გაზიარება. Close @@ -2845,6 +2854,7 @@ შეტყობინებები ზარები + წარუმატებელი ცდები სარეზერვო კოპიები ბლოკირების სტატუსი @@ -2854,6 +2864,7 @@ უცნობი ხმოვანი ჩანიშვნები კონტაქტი Signal-ს შემოუერთდა + შეტყობინებების არხის პარამეტრების გასახსნელად აქტივობა მიუწვდომელია. ფონური კავშირი @@ -3638,10 +3649,12 @@ წერილების მთელი ისტორია სამუდამოდ წაიშლება ყველა მოწყობილობიდან. ეს მოქმედება ვეღარ გაუქმდება. ყველას წაშლა ახლავე + სამუდამოდ 1 წლით 6 თვით 30 დღით + არცერთი %1$s შეტყობინება @@ -3666,6 +3679,7 @@ ჩვენება მელოდია შეტყობინების ფონტის ზომა + პრიორიტეტი შეტყობინებების ხარვეზის გამოსწორება @@ -3894,6 +3908,7 @@ ტრანზაქციის მიმღების მისამართის QR კოდის სკანირება + მოთხოვნა გადახდა ხელმისაწვდომი ბალანსი: %1$s @@ -4025,6 +4040,7 @@ მაქსიმუმ %1$d ჩატის აპინვა შეგიძლია + კონტაქტის ფოტო სურათი დაარქივებული @@ -4033,6 +4049,10 @@ ახალი ჩატი კამერის გახსნა ჩატები ჯერ ვერ მოიძებნა.\nდაიწყე მეგობართან შეტყობინების გაგზავნით. + + ჩატები ვერ მოიძებნა + + საქაღალდის პარამეტრები @@ -4265,6 +4285,7 @@ ჩატის სარეზერვო კოპიები მონაცემების გადატანა გადაიტანე მონაცემები Android-ის ახალ მოწყობილობაში + შეიყვანე სარეზერვო კოპიების პაროლ-ფრაზა აღდგენა Signal-ის ახალი ვერსიიდან ასლების გადმოტანა შეუძლებელია @@ -4472,6 +4493,7 @@ Wi-Fi პარამეტრების გახსნა ვერ მოხერხდა. გთხოვთ, ხელით ჩართო Wi-Fi. + ადგილმდებარეობის ნებართვის გაცემა ადგილმდებარეობის სერვისების ჩართა Wi-Fi-ს ჩართვა @@ -4725,6 +4747,7 @@ გაზიარება + გაგზავნა , %1$s @@ -5028,6 +5051,119 @@ კლავიატურა Enter-ით გაგზავნა + + ჩატის საქაღალდეები + + ჩატის საქაღალდის დამატება + + + + გაანაწილე შენი ჩატები საქაღალდეებში და ჩატების სიაში სწრაფად გადადი ერთიდან მეორეზე. + + საქაღალდეები + + საქაღალდის შექმნა + + ყველა ჩატი + + შემოთავაზებული საქაღალდეები + + წაუკითხავი + + წაუკითხავი შეტყობინებები ყველა ჩატიდან + + ერთი ერთზე ჩატები + + შეტყობინებები მხოლოდ პირდაპირი ჩატებიდან + + ჯგუფები + + შეტყობინებები მხოლოდ ჯგუფური ჩატებიდან + + დამატება + + საქაღალდე %1$s დამატებულია. + + საქაღალდის რედაქტირება + + საქაღალდის წაშლა + + ახალი საქაღალდის დამატება + + გამოურთე ხმა ყველას + + საქაღალდეების გადალაგება + + ყველას წაკითხულად მონიშვნა + + + ჩატის %1$d ტიპი + ჩატის %1$d ტიპი + + + + %1$d ჩათი + %1$d ჩათი + + + + გამოტოვებულია %1$d ჩატი + გამოტოვებულია %1$d ჩატი + + + + + საქაღალდის შექმნა + + საქაღალდის სახელი (სავალდებულო) + + შემავალი ჩატები + + დაამატე ჩატები + + აირჩიე ჩატები, რომელთა გამოჩენაც ამ საქაღალდეში გსურს. + + გამონაკლისები + + გამოტოვე ჩატები + + აირჩიე ჩატები, რომელთა გამოჩენაც ამ საქაღალდეში არ გსურს. + + მხოლოდ წაუკითხავი ჩატების ჩვენება + + როცა ეს ჩართულია, საქაღალდეში მხოლოდ წაუკითხავი შეტყობინებების მქონე ჩატები გამოჩნდება. + + შეიყვანე ხმა გამორთული ჩატები + + შექმენი + + გსურს, საქაღალდე შექმნა? + + გსურს, ჩატის საქაღალდე \"%1$s\" შექმნა? + + საქაღალდის შექმნა + + საქაღალდის რედაქტირება + + შენახვა + + გსურს, ცვლილებების შენახვა? + + გსურს, შენ მიერ ამ ჩატის საქაღალდეში განხორციელებული ცვლილებების შენახვა? + + ცვლილებების შენახვა + + გაუქმება + + საქაღალდის წაშლა + + გსურს ჩატის ეს საქაღალდე წაშალო? + + + + ჩატის ტიპები + + შესრულებულია შეტყობინებები @@ -5112,6 +5248,7 @@ მედია-ფაილების ხარისხი + გაგზავნილი მედია-ფაილების ხარისხი მაღალი ხარისხის მედია-ფაილის გაგზავნა უფრო მეტ მობილურ ინტერნეტს გამოიყენებს. @@ -7303,6 +7440,17 @@ %1$s %2$s-დან + + + გადმოწერის გაუქმება + + მიმდინარეობს ჩამოტვირთვა: %2$s-დან %1$s (%3$s%%) + + სათადარიგო ასლის გადმოსაწერად საკმარისი ადგილი არ გაქვს. გასაგრძელებლად გაათავისუფლე %1$s. + + გადმოწერის გამოტოვება + + "შენი ბოლო სათადარიგო ასლის შექმნა ვერ მოხერხდა. დარწმუნდი, რომ შენი მობილური Wi-Fi-სთან დაკავშირებულია და თავიდან საცდელად სათადარიგო ასლის ახლა შექმნას დააჭირე." @@ -7415,6 +7563,8 @@ ჩამოტვირთვა დასრულებულია სარეზერვო კოპიები ღამით შეიქმნება. + + გამოწერა არ არის გააქტიურებული სათადარიგო ასლების არჩეული გამოწერა @@ -7423,8 +7573,12 @@ %1$s/თვეში შენი სათადარიგო ასლების გამოწერა უფასოა - + განახლდება %1$s-ში + + ვადის გასვლის თარიღია %1$s + + ვადის გასვლის თარიღია %1$s შექმენი შენი მიმოწერის ისტორიის სათადარიგო ასლები, რათა ახალი მობილურის შეძენისას ან Molly-ის თავიდან გადმოწერისას მონაცემები არ დაკარგო. @@ -7469,6 +7623,10 @@ შენით შექმენი სარეზერვო კოპია გთხოვთ, შენი მოწყობილობის პინ-კოდი, პაროლი ან პატერნი შეიყვანო. + + სათადარიგო ასლების თავიდან ჩართვა + + სათადარიგო ასლები გამოირთო და შენი მონაცემები Signal-ის უსაფრთხო შენახვის სერვისიდან წაიშალა. diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 3d86aa9ecf..9dc36355ae 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -365,6 +365,8 @@ Чаттар Хаттар + + Чат түрлері %1$s нөміріне хат жазу @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Барлығы дайын. Сақтық көшірме жасауды бастай берсеңіз болады. Резервтік көшірменің өлшеміне байланысты оған ұзақ уақыт керек болуы мүмкін. Резервтік көшірме жасалып жатып, телефоныңызды әдеттегідей пайдалана аласыз. @@ -1966,6 +1968,7 @@ +%1$d шақырылды +%1$d шақырылды + %1$d қосымша топ Қосымша %1$d топ @@ -1992,6 +1995,7 @@ Бірде-бір құрылғы табылмады. Желі қатесі. QR коды дұрыс емес. + Кешіріңіз, тым көп құрылғы байланыстырылған, бірнешеуін өшіріңіз Кешіріңіз, бұл құрылғы сілтемесінің QR коды дұрыс емес. Signal құрылғысын байланыстыру керек пе? @@ -2014,11 +2018,13 @@ Құпия сөйлемді жіберу Құпия сөйлем дұрыс емес! Molly қолданбасының құлпын ағыту + Molly Android - Құлыптау экраны Карта + Ине қадау Мекенжайды қабылдау @@ -2522,6 +2528,7 @@ Signal хаты + Толығырақ @@ -2553,6 +2560,7 @@ Орнатылған жапсырма жоқ Келетін хабарламалардың жапсырмалары осы жерде пайда болады Атауы жоқ + Белгісіз @@ -2774,6 +2782,7 @@ Мультимедиа қолжетімді емес. Мультимедианы ойнату мүмкін емес. + Хатты іздеу кезінде қате шықты. Бұл мультимедиа файлын бөлісе алатын қолданба табылмады. Close @@ -2845,6 +2854,7 @@ Хабарламалар Қоңыраулар + Ақаулар Резервтік көшірмелер Құлып күйі @@ -2854,6 +2864,7 @@ Белгісіз Дауыстық ескертпелер Контакт Signal-ға қосылды + Хабарландыру арнасының параметрлерін ашу үшін бірде-бір әрекет жоқ. Фондық режимде қосылу @@ -3638,10 +3649,12 @@ Хаттар тарихы барлық құрылғыдан түгелдей біржола өшіп қалады. Өшіріп тастасаңыз, оны қайтарып ала алмайсыз. Барлығын қазір жою + Біржола 1 жыл 6 ай 30 күн + Ешқайсы %1$s хат @@ -3666,6 +3679,7 @@ Көрсету Рингтон Хатта қолданылған қаріп өлшемі + Басымдық Ақауларды түзету хабарландырулары @@ -3894,6 +3908,7 @@ Төлем алушы мекенжайының QR кодын сканерлеңіз + Өтініш Төлеу Қолжетімді баланс: %1$s @@ -4025,6 +4040,7 @@ Бар-жоғы %1$d чатты бекіте аласыз + Контакт фотосуреті Мұрағатталды @@ -4033,6 +4049,10 @@ Жаңа чат Камераны ашу Әлі бірде-бір чат жоқ.\nДосыңызға хат жазып бастаңыз. + + Көрсетілетін чат жоқ + + Қалта параметрлері @@ -4265,6 +4285,7 @@ Чаттың резервтік көшірмелері Аккаунтты тасымалдау Аккаунтты жаңа Android құрылғысына тасымалдау + Сақтық көшірме құпия сөйлемін енгізу Қалпына келтіру Сақтық көшірмелер жаңа нұсқалардан импортталмайды @@ -4472,6 +4493,7 @@ Wi-Fi параметрлерін ашу мүмкін емес. Wi-Fi-ды қолмен қосыңыз. + Локация рұқсатын беру Локация қызметтерін қосу Wi-Fi қосу @@ -4725,6 +4747,7 @@ Бөлісу + Жіберу , %1$s @@ -5028,6 +5051,119 @@ Пернетақта Enter пернесімен жіберу + + Чат қалталары + + Чат қалтасын қосу + + + + Чаттарыңызды қалталар бойынша реттеп, тізімдегі чаттардың бірінен екіншісіне жылдам ауысыңыз. + + Қалталар + + Қалта жасау + + Барлық чат + + Ұсынылған қалталар + + Оқылмаған хабарлар + + Барлық чат бойынша оқылмаған хабарлар + + 1:1 чаттар + + Тікелей чаттардан келген хабарлар ғана + + Топтар + + Топтық чаттардан келген хабарлар ғана + + Қосу + + %1$s қалта қосылды. + + Қалтаны өзгерту + + Қалтаны жою + + Жаңа қалта қосу + + Барлығының дыбысын өшіру + + Қалталардың ретін өзгерту + + Барлығын оқылды деп белгілеу + + + %1$d чат түрі + %1$d чат түрі + + + + %1$d чат + %1$d чат + + + + %1$d чат шығарылды + %1$d чат шығарылды + + + + + Қалта жасау + + Қалта атауы (міндетті) + + Қосылған чаттар + + Чаттарды қосу + + Осы қалтада көрсетілуі тиіс чаттарды таңдаңыз. + + Ерекше жағдайлар + + Чаттарды шығару + + Осы қалтада көрсетілмеуі тиіс чаттарды таңдаңыз. + + Оқылмаған чаттарды ғана көрсету + + Бұл параметр қосылған кезде, қалтада оқылмаған хабарлары бар чаттар ғана көрсетіледі. + + Дыбысы өшірілген чаттарды қосу + + Жасау + + Қалта жасау керек пе? + + \"%1$s\" чат қалтасын жасағыңыз келе ме? + + Қалта жасау + + Қалтаны өзгерту + + Сақтау + + Өзгерістерді сақтау керек пе? + + Осы чат қалтасына енгізілген өзгерістерді сақтағыңыз келе ме? + + Өзгерістерді сақтау + + Тастау + + Қалтаны жою + + Осы чаттар қалтасын жою керек пе? + + + + Чат түрлері + + Дайын Хабарламалар @@ -5112,6 +5248,7 @@ Мультимедиа сапасы + Жіберілген мультимедиа сапасы Жоғары сапалы мультимедианы жібергенде, трафик көбірек қолданылады. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Сақтық көшірме жасау бойынша жазылым мерзімі аяқталды - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Сақтық көшірме жоспарының мерзімі аяқталды, себебі оны қазіргі төлеу әдісімен ұзарту мүмкін болмады. %1$d күннен кейін сақтық көшірмеңізден мультимедиа жойылады. + Сақтық көшірме жоспарының мерзімі аяқталды, себебі оны қазіргі төлеу әдісімен ұзарту мүмкін болмады. %1$d күннен кейін сақтық көшірмеңізден мультимедиа жойылады. Барлық мультимедианың резервтік көшірмесін қайта жасай бастау үшін кез келген уақытта резервтік көшірмелер үшін төлей бастауыңызға болады. @@ -7254,9 +7391,9 @@ «Өткізіп жіберу» опциясын таңдасаңыз, резервтік көшірмедегі мультимедиа %1$d күннен кейін жойылады. - Your backups subscription failed to renew + Сақтық көшірме жазылымының мерзімі ұзартылмады - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Төлеу әдісіңіз жаңартылғанына көз жеткізіңіз. \"Жазылымды басқару\" опциясын түртіп, \"Төлеу әдістері\" бөлімінде \"Жаңарту\" түймесін түртіңіз. Резервтік көшірмелеуді аяқтау мүмкін болмады @@ -7268,7 +7405,7 @@ Жазылымды басқару - Subscribe for %1$s/month + Айына %1$s тұратын жоспарға жазылу Мультмедианы қазір жүктеп алыңыз @@ -7303,6 +7440,17 @@ %1$s / %2$s + + + Жүктеп алудан бас тарту + + Жүктеп алынып жатыр: %1$s/%2$s (%3$s%%) + + Сақтық көшірмеңізді жүктеп алуға жеткілікті бос орын жоқ. Жүктеп алу үшін %1$s орын босатыңыз. + + Жүктеп алуды өткізіп жіберу + + "Соңғы сақтық көшірме жасалмады. Телефоныңыз Wi-Fi желісіне қосылып тұрғанын тексеріп, \"Сақтық көшірмені қазір жасау\" түймесін түртіңіз де, қайталап көріңіз." @@ -7356,18 +7504,18 @@ Жадты оңтайландыру үшін Signal резервтік көшірмелерінің ақылы деңгейі керек. Бұл функцияны пайдаланғыңыз келсе, резервтік көшірме жоспарын ауыстырыңыз. - Subscribe for %1$s/month + Айына %1$s тұратын жоспарға жазылу - This media is no longer available + Бұл мультимедиа енді жоқ - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Қазіргі Signal сақтық көшірме жоспарымен соңғы %1$d күндік мультимедианы сақтай аласыз. Барлық мультимедианың сақтық көшірмесін жасауды бастау үшін жоспарды қазір жаңартыңыз. + Қазіргі Signal сақтық көшірме жоспарымен соңғы %1$d күндік мультимедианы сақтай аласыз. Барлық мультимедианың сақтық көшірмесін жасауды бастау үшін жоспарды қазір жаңартыңыз. - Subscribe for %1$s/month + Айына %1$s тұратын жоспарға жазылу Жою процедурасы барлық құрылғыңызда синхрондалады. @@ -7410,11 +7558,13 @@ Резервтік көшірме түрі өзгерді де, жазылымнан бас тартылды - Жазылымнан бас тартылды + Жазылым тоқтатылды. Жүктеп алынды Резервтік көшірме түнде жасалады. + + Жазылым белсенді емес Сақтық көшірме жоспары @@ -7423,8 +7573,12 @@ айына %1$s Сақтық көшірме жоспарыңыз тегін - + %1$s жаңарады + + Мерзімі %1$s күні аяқталады + + Мерзімі %1$s күні аяқталды Хабарлар тарихының сақтық көшірмесін жасаңыз. Сонда жаңа телефон алсаңыз да, Molly-ды қайта орнатсаңыз да, деректеріңізді ешқашан жоғалтпайсыз. @@ -7469,6 +7623,10 @@ Резервтік көшірмесін қолмен жасау Құрылғыңыздың PIN кодын, құпиясөзін немесе өрнегін енгізіңіз. + + Сақтық көшірмелерді қайта қосу + + Сақтық көшірмелер өшірілді және деректеріңіз Signal-дың қауіпсіз сақтау қызметінен жойылды. diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 6f41d5db6b..6db9dace83 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -362,6 +362,8 @@ ការជជែក សារ + + ប្រភេទនៃការជជែក សារ %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + រួចរាល់អស់ហើយ។ ចាប់ផ្តើមការបម្រុងទុករបស់អ្នកឥឡូវនេះ។ វាអាចចំណាយពេលយូរ អាស្រ័យលើទំហំនៃការបម្រុងទុករបស់អ្នក។ អ្នកអាចប្រើទូរសព្ទរបស់អ្នកបានធម្មតា ពេលកំពុងធ្វើការបម្រុងទុក។ @@ -1905,6 +1907,7 @@ +%1$d នាក់ត្រូវបានបបួល + %1$d ក្រុមបន្ថែម @@ -1930,6 +1933,7 @@ ឧបករណ៍រកមិនឃើញ។ បណ្តាញមានបញ្ហា។ កូដQRមិនត្រឹមត្រូវ។ + សុំទោស អ្នកបានភ្ជាប់ចំនួនឧបករណ៍ច្រើនពេក សូមលុបចោលខ្លះ សុំទោស តំណកូដQR ភ្ជាប់ទៅកាន់ឧបករណ៍ មិនត្រឹមត្រូវ។ ភ្ជាប់ឧបករណ៍ Signal ១? @@ -1951,11 +1955,13 @@ បញ្ជូនឃ្លាសម្ងាត់ ឃ្លាសម្ងាត់មិនត្រឹមត្រូវ! ដោះសោរMolly + Molly Android - អេក្រង់ចាក់សោ ផែនទី + ដាក់ចំណុច ទទួលយកអសយដ្ឋាន @@ -2437,6 +2443,7 @@ សារ Signal  + បន្ថែម @@ -2468,6 +2475,7 @@ ពុំមានស្ទីកគ័រដំឡើងទេ ស្ទីកគ័រពីសារដែលចូលមកនឹងបង្ហាញទីនេះ គ្មានចំណងជើង + មិនស្គាល់ @@ -2688,6 +2696,7 @@ ឯកសារមេឌៀលែងមានទៀតហើយ។ មិនអាចចាក់មេឌៀបានទេ។ + មានបញ្ហាក្នុងការស្វែងរកសារ។ មិនអាចស្វែងរកកម្មវិធីដែលអាចចែករំលែកឯកសារមេឌៀនេះ។ បិទ @@ -2757,6 +2766,7 @@ សារ ការហៅ + បរាជ័យ បម្រុងទុក ស្ថានភាពចាក់សោរ @@ -2766,6 +2776,7 @@ មិនស្គាល់ កំណត់ត្រាសំឡេង ចូលរួមទំនាក់ទំនងតាម Signal + មិនមានសកម្មភាព ដើម្បីបើកការកំណត់បណ្តាញជូនដំណឹង។ ការតភ្ជាប់ពីក្រោយ @@ -3537,10 +3548,12 @@ ប្រវត្តិសារទាំងអស់នឹងត្រូវបានលុបពីឧបករណ៍ទាំងអស់ជារៀងរហូត។ សកម្មភាពនេះមិនអាចត្រឡប់វិញបានទេ។ លុបទាំងអស់ឥឡូវនេះ + ជារៀងរហូត 1 ឆ្នាំ 6 ខែ 30 ថ្ងៃ + គ្មាន %1$s សារ @@ -3564,6 +3577,7 @@ បង្ហាញ សំឡេងរោទិ៍ ទំហំអក្សរសារ + អទិភាព ដោះស្រាយបញ្ហាការជូនដំណឹង @@ -3792,6 +3806,7 @@ ស្គែនអាសយដ្ឋាន QR Code របស់អ្នកទទួលប្រាក់ + ស្នើសុំ ទូទាត់ សមតុល្យនៅមាន៖ %1$s @@ -3922,6 +3937,7 @@ អ្នកអាចខ្ទាស់ការជជែករហូតដល់ %1$d + រូបថតទំនាក់ទំនង បានដាក់ទុកបណ្ណសារ @@ -3930,6 +3946,10 @@ ការជជែកថ្មី បើកកាមេរ៉ា មិនមានការជជែកទេ។\nចាប់ផ្តើមដោយការផ្ញើសារទៅមិត្តភក្តិ។ + + មិនមានការជជែកដែលត្រូវបង្ហាញទេ + + ការកំណត់នៃថតឯកសារ @@ -4154,6 +4174,7 @@ ការបម្រុងទុកការជជែក បញ្ជូនគណនី បញ្ជូនគណនី ទៅកាន់ឧបករណ៍ Android ថ្មីមួយ + បញ្ចូលឃ្លាសម្ងាត់បម្រុងទុក ស្តារឡើងវិញ មិនអាចនាំចូលឯកសារបម្រុងទុកពីកំណែ Signal ថ្មីៗទេ @@ -4361,6 +4382,7 @@ មិនអាចបើកការកំណត់ Wi-Fi ។ សូមបើក Wi-Fi ដោយខ្លួនឯង។ + បើកការអនុញ្ញាតទីតាំង បើកសេវាកម្មទីតាំង បើក Wi-Fi @@ -4607,6 +4629,7 @@ ចែករំលែក + ផ្ញើ , %1$s @@ -4909,6 +4932,116 @@ ក្ដារចុច ផ្ញើដោយចុច Enter + + ថតឯកសារជជែក + + បញ្ចូលថតឯកសារជជែក + + + + រៀបចំការជជែករបស់អ្នកទៅក្នុងថតឯកសារ ហើយមើលពីមួយទៅមួយបានលឿននៅលើបញ្ជីជជែករបស់អ្នក។ + + ថតឯកសារ + + បង្កើតថតឯកសារ + + ការជជែកទាំងអស់ + + ថតឯកសារដែលបានណែនាំ + + មិនទាន់បានអាន + + សារដែលមិនទាន់បានអានពីការជជែកទាំងអស់ + + ការជជែកមួយទល់មួយ + + សម្រាប់តែសារពីការជជែកផ្ទាល់ប៉ុណ្ណោះ + + ក្រុម + + សម្រាប់តែសារពីការជជែកជាក្រុមប៉ុណ្ណោះ + + បញ្ចូល + + ថតឯកសារ %1$s ត្រូវបានបញ្ចូល។ + + កែថតឯកសារ + + លុបថតឯកសារ + + បញ្ចូលថតឯកសារថ្មី + + បិទសំឡេងទាំងអស់ + + តម្រៀបថតឯកសារឡើងវិញ + + សម្គាល់ថាបានអានទាំងអស់ + + + ការជជែក %1$d ប្រភេទ + + + + ការជជែក %1$d + + + + ការជជែក %1$d មិនត្រូវបានរាប់បញ្ចូល + + + + + បង្កើតថតឯកសារ + + ឈ្មោះថតឯកសារ (ទាមទារ) + + ការជជែកដែលបានរាប់បញ្ចូល + + បញ្ចូលការជជែក + + ជ្រើសរើសការជជែកដែលអ្នកចង់បង្ហាញនៅក្នុងថតឯកសារនេះ។ + + ការមិនរាប់បញ្ចូល + + មិនរាប់បញ្ចូលការជជែក + + ជ្រើសរើសការជជែកដែលអ្នកមិនចង់បង្ហាញនៅក្នុងថតឯកសារនេះ។ + + បង្ហាញតែការជជែកដែលមិនទាន់អាន + + នៅពេលបើក មានតែការជជែកដែលមានសារមិនទាន់បានអានប៉ុណ្ណោះនឹងត្រូវបង្ហាញនៅក្នុងថតឯកសារនេះ។ + + រាប់បញ្ចូលទាំងការជជែកដែលបានបិទសំឡេង + + បង្កើត + + បង្កើតថតឯកសារឬ? + + តើអ្នកចង់បង្កើតថតឯកសារជជែក \"%1$s\" ឬទេ? + + បង្កើតថតឯកសារ + + កែថតឯកសារ + + រក្សាទុក + + រក្សាទុកការផ្លាស់ប្តូរឬ? + + តើអ្នកចង់រក្សាទុកការផ្លាស់ប្តូរដែលអ្នកបានធ្វើលើថតឯកសារជជែកនេះឬទេ? + + រក្សាទុកការផ្លាស់ប្តូរ + + បោះបង់ + + លុបថតឯកសារ + + លុបថតឯកសារជជែកនេះឬ? + + + + ប្រភេទនៃការជជែក + + រួចរាល់ សារ @@ -4992,6 +5125,7 @@ គុណភាពមេឌៀ + មេឌៀគុណភាពល្អត្រូវបានផ្ញើចេញ ការផ្ញើឯកសារមេឌៀដែលមានគុណភាពខ្ពស់នឹងអស់ទិន្នន័យអុីនធឺណិតច្រើន @@ -7076,10 +7210,10 @@ - Your backups subscription expired + ការជាវការបម្រុងទុករបស់អ្នកបានផុតកំណត់ហើយ - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + គម្រោងបម្រុងទុករបស់អ្នកបានផុតកំណត់ ដោយសារវាមិនអាចបន្តជាមួយវិធីបង់ប្រាក់បច្ចុប្បន្នរបស់អ្នកបាន។ បន្ទាប់ពីរយៈពេល %1$d ថ្ងៃ មេឌៀនៅក្នុងការបម្រុងទុករបស់អ្នកនឹងត្រូវបានលុបចោល។ អ្នកអាចចាប់ផ្តើមបង់ប្រាក់សម្រាប់ការបម្រុងទុកម្តងទៀតនៅពេលណាក៏បាន ដើម្បីបន្តការបម្រុងទុកមេឌៀរបស់អ្នកទាំងអស់។ @@ -7096,9 +7230,9 @@ ប្រសិនបើអ្នកជ្រើសរើស \"រំលង\" នោះមេឌៀនៅក្នុងការបម្រុងទុករបស់អ្នកនឹងត្រូវបានលុបក្នុងរយៈពេល %1$d ថ្ងៃ។ - Your backups subscription failed to renew + ការជាវការបម្រុងទុករបស់អ្នកមិនអាចបន្តបានទេ - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + ពិនិត្យមើលដើម្បីប្រាកដថាវិធីបង់ប្រាក់របស់អ្នកទាន់សម័យ។ ចុចគ្រប់គ្រងការជាវ ហើយនៅក្រោមវិធីបង់ប្រាក់ សូមចុចធ្វើបច្ចុប្បន្នភាព។ មិនអាចបញ្ចប់ការបម្រុងទុកបានទេ @@ -7110,7 +7244,7 @@ គ្រប់គ្រងការជាវ - Subscribe for %1$s/month + ជាវក្នុងតម្លៃ %1$s/ខែ ទាញយកមេឌៀឥឡូវនេះ @@ -7145,6 +7279,17 @@ %1$s នៃ %2$s + + + បោះបង់ការទាញយក + + កំពុងទាញយក៖ %1$s នៃ %2$s (%3$s%%) + + មិនមានទំហំផ្ទុកគ្រប់គ្រាន់ដើម្បីទាញយកការបម្រុងទុករបស់អ្នក។ ដើម្បីបន្ត សូមរក្សាទំហំផ្ទុករបស់អ្នកឱ្យទំនេរបាន %1$s។ + + រំលងការទាញយក + + "ការបម្រុងទុកចុងក្រោយរបស់អ្នកមិនអាចបញ្ចប់បានទេ។ ត្រូវប្រាកដថាទូរសព្ទរបស់អ្នកបានភ្ជាប់ Wi-Fi រួចចុចបម្រុងទុកឥឡូវនេះ ដើម្បីព្យាយាមម្តងទៀត។" @@ -7198,17 +7343,17 @@ ការបង្កើនប្រសិទ្ធភាពទំហំផ្ទុកអាចប្រើបានតែជាមួយការបម្រុងទុក Signal នៅក្នុងកម្រិតបង់ប្រាក់ប៉ុណ្ណោះ។ ដំឡើងកម្រិតនៃគម្រោងបម្រុងទុករបស់អ្នក ដើម្បីចាប់ផ្តើមប្រើមុខងារនេះ។ - Subscribe for %1$s/month + ជាវក្នុងតម្លៃ %1$s/ខែ - This media is no longer available + មេឌៀនេះលែងមានទៀតហើយ - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + គម្រោងបម្រុងទុក Signal បច្ចុប្បន្នរបស់អ្នករួមបញ្ចូលទាំងមេឌៀរបស់អ្នករយៈពេល %1$d ថ្ងៃចុងក្រោយ។ ដើម្បីចាប់ផ្តើមបម្រុងទុកមេឌៀទាំងអស់របស់អ្នក សូមដំឡើងកម្រិតឥឡូវនេះ។ - Subscribe for %1$s/month + ជាវក្នុងតម្លៃ %1$s/ខែ ឥឡូវនេះការលុបត្រូវបានធ្វើសមកាលកម្មនៅលើឧបករណ៍របស់អ្នកទាំងអស់ @@ -7256,6 +7401,8 @@ ការទាញយកបានបញ្ចប់ ការបម្រុងទុកនឹងត្រូវបានបង្កើតឡើងក្នុងពេលមួយយប់។ + + ការជាវអសកម្ម គម្រោងបម្រុងទុក @@ -7264,8 +7411,12 @@ %1$s/ខែ គម្រោងបម្រុងទុករបស់អ្នកគឺឥតគិតថ្លៃ - + បន្ត %1$s + + ផុតកំណត់នៅ %1$s + + បានផុតកំណត់នៅ %1$s បម្រុងទុកប្រវត្តិសាររបស់អ្នក ដើម្បីកុំឱ្យបាត់បង់ទិន្នន័យនៅពេលអ្នកមានទូរសព្ទថ្មី ឬដំឡើង Molly ឡើងវិញ។ @@ -7310,6 +7461,10 @@ បម្រុងទុកដោយដៃ សូមបញ្ចូលលេខកូដសម្ងាត់ ពាក្យសម្ងាត់ ឬលំនាំឧបករណ៍របស់អ្នក។ + + បើកឡើងវិញនូវការបម្រុងទុក + + ការបម្រុងទុកត្រូវបានបិទ ហើយទិន្នន័យរបស់អ្នកត្រូវបានលុបចេញពីសេវាកម្មផ្ទុកដ៏មានសុវត្ថិភាពរបស់ Signal។ diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 4b2eaef09c..7078e87532 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -365,6 +365,8 @@ ಚಾಟ್‌‌ ಗಳು ಮೆಸೇಜ್‌ಗಳು + + ಚಾಟ್ ವಿಧಾನಗಳು ಸಂದೇಶ %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + ನೀವು ಸಿದ್ಧರಾಗಿದ್ದೀರಿ. ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಆರಂಭಿಸಿ. ನಿಮ್ಮ ಬ್ಯಾಕಪ್‌ನ ಗಾತ್ರವನ್ನು ಆಧರಿಸಿ, ಇದು ಬಹಳ ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು. ಬ್ಯಾಕಪ್ ನಡೆಯುವಾಗ ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಬಳಸುವಂತೆಯೇ ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಬಳಸಬಹುದು. @@ -1966,6 +1968,7 @@ +%1$d ಆಹ್ವಾನಿಸಿದ್ದಾರೆ +%1$d ಆಹ್ವಾನಿಸಿದ್ದಾರೆ + %1$d ಹೆಚ್ಚುವರಿ ಗ್ರೂಪ್ %1$d ಹೆಚ್ಚುವರಿ ಗ್ರೂಪ್‌ಗಳು @@ -1992,6 +1995,7 @@ ಯಾವುದೇ ಸಾಧನವನ್ನು ಕಂಡುಹಿಡಿಯಲಾಗಿಲ್ಲ. ನೆಟ್ವರ್ಕ್ ದೋಷ. ಮಾನ್ಯವಲ್ಲದ ಕ್ಯುಆರ್‌ ಕೋಡ್. + ಕ್ಷಮಿಸಿ, ನೀವು ಈಗಾಗಲೇ ಬಹಳ ಹೆಚ್ಚು ಸಾಧನಗಳನ್ನು ಲಿಂಕ್ ಮಾಡಿದ್ದೀರಿ, ಕೆಲವನ್ನು ತೆಗೆದುಹಾಕಲು ಪ್ರಯತ್ನಿಸಿ ಕ್ಷಮಿಸಿ, ಇದು ಮಾನ್ಯವಾಗಿರುವ ಸಾಧನ ಲಿಂಕ್ ಮಾಡುವ ಕ್ಯುಆರ್‌ ಕೋಡ್ ಅಲ್ಲ. ಒಂದು Signal ಸಾಧನ ಲಿಂಕ್ ಮಾಡುವುದೇ? @@ -2014,11 +2018,13 @@ ಪಾಸ್‌ಫ್ರೇಸ್‌ ಸಲ್ಲಿಸಿ ಪಾಸ್‌ಫ್ರೇಸ್‌ ಮಾನ್ಯವಾದದ್ದಲ್ಲ! Molly ಅನ್ಲಾಕ್ ಮಾಡಿ + Molly ಆಂಡ್ರಾಯ್ಡ್‌ - ಲಾಕ್ ಸ್ಕ್ರೀನ್ ನಕ್ಷೆ + ಡ್ರಾಪ್ ಪಿನ್ ವಿಳಾಸವನ್ನು ಒಪ್ಪಿ @@ -2522,6 +2528,7 @@ Signal ಸಂದೇಶ + ಇನ್ನಷ್ಟು @@ -2553,6 +2560,7 @@ ಯಾವುದೇ ಸ್ಟಿಕ್ಕರ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ ಒಳಬರುವ ಸಂದೇಶಗಳಿಂದ ಸ್ಟಿಕ್ಕರ್‌ಗಳು ಇಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ ಶೀರ್ಷಿಕ ರಹಿತ + ತಿಳಿದಿಲ್ಲ @@ -2774,6 +2782,7 @@ ಮೀಡಿಯಾ ಇನ್ನು ಲಭ್ಯವಿಲ್ಲ. ಮೀಡಿಯಾ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. + ಸಂದೇಶವನ್ನು ಹುಡುಕುವಲ್ಲಿ ದೋಷ. ಈ ಮೀಡಿಯಾ ಹಂಚಿಕೊಳ್ಳಲು ಒಂದು ಆಪ್ ಕಂಡುಕೊಳ್ಳಲಾಗುತ್ತಿಲ್ಲ. ಮುಚ್ಚಿ @@ -2845,6 +2854,7 @@ ಸಂದೇಶಗಳು ಕರೆಗಳು + ವೈಫಲ್ಯಗಳು ಬ್ಯಾಕಪ್‌ಗಳು ಲಾಕ್ ಸ್ಥಿತಿ @@ -2854,6 +2864,7 @@ ತಿಳಿದಿಲ್ಲ ವಾಯ್ಸ್ ನೋಟ್‌ಗಳು ಸಂಪರ್ಕ Signal ಗೆ ಸೇರಿದ್ದಾರೆ + ನೊಟಿಫಿಕೇಶನ್ ಚಾನೆಲ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಲು ಯಾವುದೇ ಚಟುವಟಿಕೆ ಲಭ್ಯವಿಲ್ಲ. ಹಿನ್ನೆಲೆ ಸಂಪರ್ಕ @@ -3638,10 +3649,12 @@ ಎಲ್ಲಾ ಸಾಧನಗಳಿಂದ ಎಲ್ಲಾ ಮೆಸೇಜ್ ಇತಿಹಾಸವನ್ನು ಶಾಶ್ವತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. ಈ ಕ್ರಮವನ್ನು ರದ್ದುಪಡಿಸಲಾಗುವುದಿಲ್ಲ. ಎಲ್ಲವನ್ನೂ ಈಗಲೇ ಅಳಿಸಿ + ಎಂದೆಂದಿಗೂ 1 ವರ್ಷ 6 ತಿಂಗಳು 30 ದಿನಗಳು + ಯಾವುದೂ ಇಲ್ಲ %1$s ಮೆಸೇಜ್ @@ -3666,6 +3679,7 @@ ತೋರಿಸು ರಿಂಗ್ಟೋನ್ ಸಂದೇಶ ಫಾಂಟ್ ಗಾತ್ರ + ಆದ್ಯತೆ ಅಧಿಸೂಚನೆಗಳ ಸಮಸ್ಯೆ ಪರಿಹರಿಸಿ @@ -3894,6 +3908,7 @@ ಪಾವತಿಸುವವರ ವಿಳಾಸ ಕ್ಯುಆರ್‌ ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ + ಕೋರಿಕೆ ಪಾವತಿಸಿ ಲಭ್ಯ ಬ್ಯಾಲೆನ್ಸ್: %1$s @@ -4025,6 +4040,7 @@ ನೀವು %1$d ಚಾಟ್‌ಗಳನ್ನು ಮಾತ್ರ ಪಿನ್ ಮಾಡಬಹುದು + ಸಂಪರ್ಕದ ಫೋಟೊ ಇಮೇಜ್ ಆರ್ಕೈವ್ ಮಾಡಲಾಗಿದೆ @@ -4033,6 +4049,10 @@ ಹೊಸ ಚಾಟ್ ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ ಇನ್ನೂ ಯಾವುದೇ ಚಾಟ್‌ಗಳಿಲ್ಲ.\nಸ್ನೇಹಿತರಿಗೆ ಮೆಸೇಜ್ ಮಾಡುವ ಮೂಲಕ ಆರಂಭಿಸಿ. + + ತೋರಿಸಲು ಯಾವುದೇ ಚಾಟ್ ಗಳು ಇಲ್ಲ + + ಫೋಲ್ಡರ್ ಸೆಟ್ಟಿಂಗ್ ಗಳು @@ -4265,6 +4285,7 @@ ಚಾಟ್ ಬ್ಯಾಕಪ್‌ಗಳು ಖಾತೆ ವರ್ಗಾಯಿಸಿ ಹೊಸ ಆಂಡ್ರಾಯ್ಡ್ ಸಾಧನಕ್ಕೆ ಖಾತೆ ವರ್ಗಾವಣೆ ಮಾಡಿ + ಬ್ಯಾಕಪ್ ಪಾಸ್‌ಫ್ರೇಸ್ ನಮೂದಿಸಿ ಪುನಃಸ್ಥಾಪಿಸಿ Signal ನ ಹೊಸ ಆವೃತ್ತಿಗಳಿಂದ ಬ್ಯಾಕಪ್ ಇಂಪೋರ್ಟ್ ಮಾಡಲು ಅಸಾಧ್ಯ @@ -4472,6 +4493,7 @@ ವೈಫೈ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಲು ಅಸಾಧ್ಯವಾಗಿದೆ. ದಯವಿಟ್ಟು ವೈಫೈ ಅನ್ನು ಮ್ಯಾನ್ಯುಅಲ್ ಆಗಿ ಆನ್ ಮಾಡಿ. + ಸ್ಥಳ ಅನುಮತಿಯನ್ನು ಮಂಜೂರು ಮಾಡಿ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿ ವೈಫೈ ಆನ್ ಮಾಡಿ @@ -4725,6 +4747,7 @@ ಹಂಚಿಕೊಳ್ಳಿ + ಕಳುಹಿಸು , %1$s @@ -5028,6 +5051,119 @@ ಕೀಬೋರ್ಡ್‌ ಎಂಟರ್ ಮೂಲಕ ಕಳುಹಿಸಿ + + ಚಾಟ್ ಫೋಲ್ಡರ್ ಗಳು + + ಚಾಟ್ ಫೋಲ್ಡರ್ ಸೇರಿಸಲಾಗಿದೆ + + + + ಫೋಲ್ಡರ್ ಗಳಲ್ಲಿ ಚಾಟ್ ಗಳನ್ನು ಅನುಕ್ರಮವಾಗಿ ಹೊಂದಿಸಿ ಮತ್ತು ಅವುಗಳನ್ನು ನಿಮ್ಮ ಚಾಟ್ ಗಳ ಪಟ್ಟಿಗೆ ತ್ವರಿತವಾಗಿ ಬದಲಾಯಿಸಿ. + + ಫೋಲ್ಡರ್ ಗಳು + + ಫೋಲ್ಡರ್ ರಚನೆ ಮಾಡಿ + + ಎಲ್ಲ ಚಾಟ್ ಗಳು + + ಸೂಚಿಸಿದ ಫೋಲ್ಡರ್ ಗಳು + + ಓದದಿರುವ + + ಎಲ್ಲ ಚಾಟ್‍ಗಳಲ್ಲಿನ ಓದದಿರುವ ಮೆಸೇಜ್ ಗಳು + + 1:1 ಚಾಟ್ ಗಳು + + ನೇರ ಚಾಟ್ ಗಳ ಮೆಸೇಜ್‍ಗಳು ಮಾತ್ರ + + ಗುಂಪುಗಳು + + ಗುಂಪು ಚಾಟ್ ಗಳ ಮೆಸೇಜ್‍ ಮಾತ್ರ + + ಸೇರಿಸಿ + + %1$s ಫೋಲ್ಡರ್ ಸೇರಿಸಲಾಗಿದೆ. + + ಫೋಲ್ಡರ್ ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ + + ಫೋಲ್ಡರ್ ಅಳಿಸಿ + + ಹೊಸ ಫೋಲ್ಡರ್ ಸೇರಿಸಿ + + ಎಲ್ಲವನ್ನೂ ಮ್ಯೂಟ್ ಮಾಡಿ + + ರೆಕಾರ್ಡರ್ ಫೋಲ್ಡರ್ ಗಳು + + ಎಲ್ಲವನ್ನು ಓದಿದೆ ಎಂದು ಗುರುತು ಮಾಡಿ + + + %1$d ಚಾಟ್ ವಿಧಾನ + %1$d ಚಾಟ್ ವಿಧಾನಗಳು + + + + %1$d ಚಾಟ್‌ಗಳು + %1$d ಚಾಟ್‌ಗಳು + + + + %1$d ಚಾಟ್ ಹೊರತುಪಡಿಸಲಾಗಿದೆ + %1$dಚಾಟ್ ಗಳನ್ನು ಹೊರತುಪಡಿಸಲಾಗಿದೆ + + + + + ಫೋಲ್ಡರ್ ರಚನೆ ಮಾಡಿ + + ಫೋಲ್ಡರ್ ಹೆಸರು (ಅಗತ್ಯವಿದೆ) + + ಒಳಗೊಂಡಿರುವ ಚಾಟ್ ಗಳು + + ಚಾಟ್ ಗಳನ್ನು ಸೇರಿಸಿ + + ಈ ಫೋಲ್ಡರ್ ನಲ್ಲಿ ನೀವು ನೋಡಲು ಬಯಸುವ ಚಾಟ್ ಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ. + + ವಿನಾಯಿತಿಗಳು + + ಚಾಟ್ ಗಳನ್ನು ಹೊರತುಪಡಿಸಿ + + ಈ ಫೋಲ್ಡರ್ ನಲ್ಲಿ ನೀವು ಬಯಸದೇ ಇರುವ ಚಾಟ್ ಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ + + ಓದದಿರುವ ಚಾಟ್ ಗಳನ್ನು ಮಾತ್ರವೇ ತೋರಿಸಿ + + ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, ಫೋಲ್ಡರ್ ನಲ್ಲಿರುವ ಓದದಿರುವ ಚಾಟ್ ಗಳನ್ನು ಮಾತ್ರವೇ ತೋರಿಸಲಾಗುತ್ತದೆ + + ಮ್ಯೂಟ್ ಚಾಟ್ ಗಳನ್ನೂ ಒಳಗೊಂಡಿದೆ + + ರಚಿಸಿ + + ಫೋಲ್ಡರ್ ರಚಿಸಬೇಕೇ? + + ಚಾಟ್ ಫೋಲ್ಡರ್ \"%1$s\" ರಚಿಸಬೇಕೇ? + + ಫೋಲ್ಡರ್ ರಚಿಸಿ + + ಫೋಲ್ಡರ್ ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ + + ಉಳಿಸಿ + + ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಬೇಕೇ? + + ಈ ಚಾಟ್ ಫೋಲ್ಡರ್ ನಲ್ಲಿ ಮಾಡಿದ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲು ಬಯಸುವಿರಾ? + + ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿ + + ತ್ಯಜಿಸಿ + + ಫೋಲ್ಡರ್ ಅಳಿಸಿ + + ಈ ಚಾಟ್ ಫೋಲ್ಡರ್ ಅಳಿಸಿ ಹಾಕಬೇಕೆ? + + + + ಚಾಟ್ ವಿಧಾನಗಳು + + ಮುಗಿದಿದೆ ಸಂದೇಶಗಳು @@ -5112,6 +5248,7 @@ ಮಾಧ್ಯಮ ಗುಣಮಟ್ಟ + ಮಾಧ್ಯಮ ಗುಣಮಟ್ಟವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ ಉನ್ನತ ಗುಣಮಟ್ಟದ ಮಾಧ್ಯಮವನ್ನು ಕಳುಹಿಸುವಿಕೆಯು ಹೆಚ್ಚು ಡೇಟಾವನ್ನು ಬಳಸಲಿದೆ. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + ನಿಮ್ಮ ಬ್ಯಾಕಪ್‍ಗಳ ಚಂದಾದಾರಿಕೆಯ ಅವಧಿ ಮುಗಿದಿದೆ - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ ಅವಧಿ ಮುಗಿದಿದೆ. ಏಕೆಂದರೆ ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾವತಿ ವಿಧಾನದ ಮೂಲಕ ಇದನ್ನು ನವೀಕರಿಸಲು ಸಾಧ್ಯವಿರಲಿಲ್ಲ. %1$d ದಿನದ ನಂತರ ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ನಲ್ಲಿರುವ ಮೀಡಿಯಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ + ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ ಅವಧಿ ಮುಗಿದಿದೆ. ಏಕೆಂದರೆ ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾವತಿ ವಿಧಾನದ ಮೂಲಕ ಇದನ್ನು ನವೀಕರಿಸಲು ಸಾಧ್ಯವಿರಲಿಲ್ಲ. %1$d ದಿನಗಳ ನಂತರ ಬ್ಯಾಕಪ್ ನಲ್ಲಿರುವ ಮೀಡಿಯಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಎಲ್ಲಾ ಮೀಡಿಯಾವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು ನೀವು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳಿಗೆ ಪುನಃ ಪಾವತಿಸಲು ಪ್ರಾರಂಭಿಸಬಹುದು. @@ -7254,9 +7391,9 @@ ನೀವು \"ಸ್ಕಿಪ್\" ಅನ್ನು ಆರಿಸಿದರೆ, ನಿಮ್ಮ ಬ್ಯಾಕಪ್‌ನಲ್ಲಿರುವ ಮೀಡಿಯಾವನ್ನು %1$d ದಿನಗಳಲ್ಲಿ ಅಳಿಸಲಾಗುತ್ತದೆ. - Your backups subscription failed to renew + ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಚಂದಾದಾರಿಕೆ ನವೀಕರಣವಾಗಲು ವಿಫಲವಾಗಿದೆ - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + ನಿಮ್ಮ ಪಾವತಿ ವಿಧಾನ ಅಪ್ ಟು ಡೇಟ್ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲನೆ ಮಾಡಿಕೊಳ್ಳಿ. ಚಂದಾದಾರಿಕೆ ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಪಾವತಿ ವಿಧಾನದ ಕೆಳಗೆ ಅಪ್‍ಡೇಟ್ ಮಾಡಿ ಟ್ಯಾಪ್ ಮಾಡಿ. ಬ್ಯಾಕಪ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ @@ -7268,7 +7405,7 @@ ಚಂದಾ ನಿರ್ವಹಿಸಿ - Subscribe for %1$s/month + ತಿಂಗಳಿಗೆ %1$sಕ್ಕೆ ಚಂದಾದಾರರಾಗಿ ಈಗ ಮೀಡಿಯಾವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ @@ -7303,6 +7440,17 @@ %2$s ನಲ್ಲಿ %1$s + + + ಡೌನ್ ಲೋಡ್ ರದ್ದು ಮಾಡಿ + + ಡೌನ್‍ಲೋಡ್ ಆಗುತ್ತಿದೆ: %2$s, ಒಟ್ಟು %1$s(%3$s%%) + + ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಡೌನ್ ಲೋಡ್ ಡೌನ್ ಲೋಡ್ ಮಾಡಲು ಸಾಕಷ್ಟು ಸ್ಪೇಸ್ ಇಲ್ಲ. ಮುಂದುವರಿಯಲು %1$s ಸ್ಪೇಸ್ ಮುಕ್ತಗೊಳಿಸಿ. + + ಡೌನ್ ಲೋಡ್ ಸ್ಕಿಪ್ ಮಾಡಿ + + "ನಿಮ್ಮ ಕೊನೆಯ ಬ್ಯಾಕಪ್ ಪೂರ್ತಿಯಾಗಿಲ್ಲ. ನಿಮ್ಮ ಫೋನ್ ವೈ- ಫೈ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಬಗ್ಗೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲು ಬ್ಯಾಕಪ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ." @@ -7356,18 +7504,18 @@ Signal ಬ್ಯಾಕಪ್‌ಗಳ ಪಾವತಿಸಿದ ಶ್ರೇಣಿಯೊಂದಿಗೆ ಮಾತ್ರ ಸಂಗ್ರಹಣೆ ಆಪ್ಟಿಮೈಸೇಶನ್ ಅನ್ನು ಬಳಸಬಹುದು. ಈ ಫೀಚರ್ ಬಳಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ ಅನ್ನು ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ. - Subscribe for %1$s/month + ತಿಂಗಳಿಗೆ %1$sಕ್ಕೆ ಚಂದಾದಾರರಾಗಿ - This media is no longer available + ಈ ಮೀಡಿಯಾ ಇನ್ನು ಮುಂದೆ ಲಭ್ಯ ಇರುವುದಿಲ್ಲ - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + ನಿಮ್ಮ ಪ್ರಸ್ತುತ Signal ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ ನಿಮ್ಮ ಇತ್ತೀಚಿನ %1$d ದಿನದ ಮೀಡಿಯಾವನ್ನು ಮಾತ್ರ ಒಳಗೊಂಡಿದೆ. ನಿಮ್ಮ ಎಲ್ಲ ಮೀಡಿಯಾವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿಕೊಳ್ಳಲು ಈಗಲೇ ಅಪ್ ಗ್ರೇಡ್ ಮಾಡಿಕೊಳ್ಳಿ. + ನಿಮ್ಮ ಪ್ರಸ್ತುತ Signal ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ ನಿಮ್ಮ ಇತ್ತೀಚಿನ %1$d ದಿನಗಳ ಮೀಡಿಯಾವನ್ನು ಮಾತ್ರ ಒಳಗೊಂಡಿದೆ. ನಿಮ್ಮ ಎಲ್ಲ ಮೀಡಿಯಾವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿಕೊಳ್ಳಲು ಈಗಲೇ ಅಪ್ ಗ್ರೇಡ್ ಮಾಡಿಕೊಳ್ಳಿ. - Subscribe for %1$s/month + ತಿಂಗಳಿಗೆ %1$sಕ್ಕೆ ಚಂದಾದಾರರಾಗಿ ಅಳಿಸುವಿಕೆಯನ್ನು ಇದೀಗ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ @@ -7410,11 +7558,13 @@ ಬ್ಯಾಕಪ್ ಪ್ರಕಾರವನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ ಮತ್ತು ಚಂದಾದಾರಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ - ಚಂದಾದಾರಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ + ಸಬ್‍ಸ್ಕ್ರಿಪ್ಷನ್ ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ ಡೌನ್‌ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ ರಾತ್ರಿಯಲ್ಲಿ ಬ್ಯಾಕಪ್ ಅನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ. + + ಸಬ್‍ಸ್ಕ್ರಿಪ್ಷನ್ ನಿಷ್ಕ್ರಿಯವಾಗಿದೆ ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ @@ -7423,8 +7573,12 @@ %1$s/ತಿಂಗಳು ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಪ್ಲಾನ್ ಉಚಿತ - + ನವೀಕರಿಸುತ್ತದೆ %1$s + + %1$s ರಂದು ಅವಧಿ ಮುಗಿಯುತ್ತದೆ + + %1$s ರಂದು ಅವಧಿ ಮುಕ್ತಾಯವಾಗಿದೆ ನಿಮ್ಮ ಮೆಸೇಜ್ ಇತಿಹಾಸವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿ, ಇದರಿಂದ ನೀವು ಹೊಸ ಫೋನ್ ಪಡೆದಾಗ ಅಥವಾ Molly ರೀಇನ್‍ಸ್ಟಾಲ್ ಮಾಡಿದಾಗ ಡೇಟಾವನ್ನು ಕಳೆದುಕೊಳ್ಳುವುದಿಲ್ಲ. @@ -7469,6 +7623,10 @@ ಹಸ್ತಚಾಲಿತವಾಗಿ ಬ್ಯಾಕಪ್ ಮಾಡಿ ನಿಮ್ಮ ಸಾಧನದ PIN, ಪಾಸ್‌ವರ್ಡ್ ಅಥವಾ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನಮೂದಿಸಿ. + + ಬ್ಯಾಕಪ್ ಗಳನ್ನು ಮತ್ತೆ ಸಕ್ರಿಯಗೊಳಿಸಿ + + ಬ್ಯಾಕಪ್ ಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು Signal ನ ಸುರಕ್ಷಾ ಸ್ಟೋರೇಜ್ ಸೇವೆಗಾಗಿ ಸುರಕ್ಷತೆಗಾಗಿ ನಿಮ್ಮ ಡೇಟಾಗಳನ್ನು ಅಳಿಸಲಾಗಿದೆ. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 668e8862a2..7112e3846a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -362,6 +362,8 @@ 대화 메시지 + + 대화 유형 %1$s에 메시지 보내기 @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + 준비됐습니다. 지금 백업을 시작하세요. 백업 용량에 따라 시간이 더 오래 걸릴 수 있습니다. 백업하는 동안 평상시처럼 휴대폰을 사용하셔도 됩니다. @@ -1905,6 +1907,7 @@ +%1$d명 초대함 + %1$d개의 추가 그룹 @@ -1930,6 +1933,7 @@ 기기를 찾을 수 없습니다. 네트워크 오류가 발생했습니다. 잘못된 QR 코드입니다. + 죄송합니다. 이미 너무 많은 기기가 연결되어 있습니다. 일부를 제거하세요. 죄송합니다. 올바른 기기 연결 QR 코드가 아닙니다. Signal 기기를 연결하시겠습니까? @@ -1951,11 +1955,13 @@ 암호 제출 잘못된 암호입니다! Molly 잠금 해제 + Molly Android - 잠금 화면 지도 + 고정 주소 허용 @@ -2437,6 +2443,7 @@ Signal 메시지 + 더 보기 @@ -2468,6 +2475,7 @@ 설치된 스티커 없음 받은 메시지의 스티커가 여기에 표시됩니다. 제목 없음 + 알 수 없음 @@ -2688,6 +2696,7 @@ 미디어를 더 이상 이용할 수 없습니다. 미디어를 재생할 수 없습니다. + 메시지 검색 중 오류가 발생했습니다. 미디어를 공유할 수 있는 앱을 찾을 수 없습니다. 닫기 @@ -2757,6 +2766,7 @@ 메시지 전화 + 실패 백업 잠금 상태 @@ -2766,6 +2776,7 @@ 알 수 없음 음성 노트 연락처가 Signal에 등록함 + 알림 채널 설정을 열 수 있는 활동이 없습니다. 백그라운드 연결 @@ -3537,10 +3548,12 @@ 모든 기기에서 모든 메시지 기록을 영구적으로 제거합니다. 이 작업은 취소할 수 없습니다. 지금 모두 삭제 + 영원히 1년 6개월 30일 + 없음 메시지 %1$s개 @@ -3564,6 +3577,7 @@ 표시 알림 벨소리 메시지 글꼴 사이즈 + 우선순위 알림 문제 해결 @@ -3792,6 +3806,7 @@ 수취인의 주소 QR 코드를 스캔하세요. + 요청 지불 사용 가능한 잔액: %1$s @@ -3922,6 +3937,7 @@ 최대 %1$d개 대화만 고정할 수 있습니다. + 연락처 사진 보관됨 @@ -3930,6 +3946,10 @@ 새 대화 카메라 열기 아직 대화가 없습니다.\n친구에게 메시지를 보내 시작해 보세요. + + 표시할 대화가 없습니다. + + 폴더 설정 @@ -4154,6 +4174,7 @@ 대화 백업 계정 이전 새 Android 장치로 계정 이전 + 백업 암호 입력 복원 Signal 최신 버전에서 백업을 가져올 수 없습니다. @@ -4361,6 +4382,7 @@ Wi-Fi 설정을 열 수 없습니다. Wi-Fi를 수동으로 켜세요. + 위치 권한 부여 위치 서비스 켜기 Wi-Fi 켜기 @@ -4607,6 +4629,7 @@ 공유 + 보내기 , %1$s @@ -4909,6 +4932,116 @@ 키보드 Enter 키로 보내기 + + 대화 폴더 + + 대화 폴더 추가 + + + + 대화를 폴더로 정리하여 대화 목록에서 대화 간에 빠르게 전환하세요. + + 폴더 + + 폴더 만들기 + + 모든 대화 + + 추천 폴더 + + 읽지 않음 + + 모든 대화의 읽지 않은 메시지 + + 1:1 대화 + + 직접 대화의 메시지만 + + 그룹 + + 그룹 대화의 메시지만 + + 추가 + + %1$s 폴더를 추가했습니다. + + 폴더 수정 + + 폴더 삭제 + + 새 폴더 추가 + + 모두 음소거 + + 폴더 순서 재정렬 + + 모두 읽음으로 표시 + + + 대화 유형 %1$d개 + + + + 대화 %1$d개 + + + + 대화 %1$d개를 제외함 + + + + + 폴더 만들기 + + 폴더 이름(필수) + + 포함된 대화 + + 대화 추가 + + 이 폴더에 표시하려는 대화를 선택하세요. + + 예외 + + 대화 제외 + + 이 폴더에 표시하지 않으려는 대화를 선택하세요. + + 읽지 않은 대화만 표시 + + 사용하도록 설정할 경우 읽지 않은 메시지가 있는 대화만 이 폴더에 표시됩니다. + + 알림을 끈 대화 포함 + + 만들기 + + 폴더를 만드시겠습니까? + + \'%1$s\' 대화 폴더를 만드시겠습니까? + + 폴더 만들기 + + 폴더 수정 + + 저장 + + 변경 내용을 저장하시겠습니까? + + 이 대화 폴더에 적용한 변경 내용을 저장하시겠습니까? + + 변경 내용 저장 + + 파기 + + 폴더 삭제 + + 이 대화 폴더를 삭제하시겠습니까? + + + + 대화 유형 + + 확인 메시지 @@ -4992,6 +5125,7 @@ 미디어 품질 + 미디어 전송 품질 고품질 미디어는 더 많은 모바일 데이터를 사용할 수 있습니다. @@ -7076,10 +7210,10 @@ - Your backups subscription expired + 백업 구독 만료 - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + 현재 결제 방법으로 갱신할 수 없어 백업 플랜이 만료되었습니다. %1$d일 후 백업의 미디어가 삭제됩니다. 언제든 백업 비용을 다시 결제하기 시작하여 모든 미디어를 계속 백업할 수 있습니다. @@ -7096,9 +7230,9 @@ \'건너 뛰기\'를 선택하면 %1$d일 후 백업의 미디어가 삭제됩니다. - Your backups subscription failed to renew + 백업 구독 갱신 실패 - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + 결제 방법이 최신 상태인지 확인하세요. 구독 관리를 탭한 다음 결제 방법에서 업데이트를 탭하세요. 백업을 완료할 수 없음 @@ -7110,7 +7244,7 @@ 구독 관리 - Subscribe for %1$s/month + 월 %1$s로 구독 지금 미디어 다운로드 @@ -7145,6 +7279,17 @@ %2$s 중 %1$s + + + 다운로드 취소 + + 다운로드하는 중: %1$s/%2$s(%3$s%%) + + 백업을 다운로드할 공간이 부족합니다. 계속하려면 %1$s의 공간을 확보하세요. + + 다운로드 건너뛰기 + + "마지막 백업을 완료하지 못했습니다. 휴대폰이 Wi-Fi에 연결되어 있는지 확인하고 지금 백업을 탭하여 다시 시도하세요." @@ -7198,17 +7343,17 @@ 저장 공간 최적화는 유료 Signal 백업으로만 사용할 수 있습니다. 이 기능을 사용하기 시작하려면 백업 플랜을 업그레이드하세요. - Subscribe for %1$s/month + 월 %1$s로 구독 - This media is no longer available + 이 미디어를 더 이상 사용할 수 없음 - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + 현재 Signal 백업 플랜은 최근 %1$d일 미디어를 포함합니다. 모든 미디어를 백업하려면 지금 업그레이드하세요. - Subscribe for %1$s/month + 월 %1$s로 구독 이제 모든 기기에서 삭제를 동기화합니다 @@ -7251,11 +7396,13 @@ 백업 종류를 변경하고 구독을 취소했습니다. - 구독 취소 완료 + 구독을 취소했습니다. 다운로드 완료 밤사이 백업을 생성합니다. + + 구독 비활성 백업 플랜 @@ -7264,8 +7411,12 @@ %1$s/월 백업 플랜이 무료입니다. - + %1$s 갱신 + + %1$s에 만료됨 + + %1$s에 만료됨 새 휴대폰을 사용하거나 Molly을 다시 설치할 때 데이터를 잃지 않도록 메시지 기록을 백업하세요. @@ -7310,6 +7461,10 @@ 수동 백업 기기 PIN, 암호 또는 패턴을 입력하세요. + + 백업 재활성화 + + 백업을 사용하지 않도록 설정했으며, Signal의 안전한 저장소 서비스에서 데이터를 삭제했습니다. diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index a1c4ce632a..7187bcd591 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -362,6 +362,8 @@ Маектер Билдирүүлөр + + Маектин түрлөрү Билдирүү %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + Бүттү. Камдык көчүрмөлөрүңүздү сактай баштаңыз. Камдык көчүрмөңүздүн көлөмүнө жараша бир топ убакытты алышы мүмкүн. Камдык көчүрмөлөр сакталып жатканда телефонуңузду кадимкидей колдоно бересиз. @@ -1905,6 +1907,7 @@ дагы %1$d чакырылды + дагы %1$d топ @@ -1930,6 +1933,7 @@ Түзмөк табылган жок. Тармакта ката кетти. QR коду туура эмес. + Өтө көп түзмөк байланып турат. Айрымдарын өчүрүп салыңыз Түзмөктү байланыштыруучу QR код туура эмес. Signal түзмөгүн байланыштырасызбы? @@ -1951,11 +1955,13 @@ Сыр сөз айкашын тапшыруу Сыр сөз айкашы туура эмес! Molly\'ды бөгөттөн чыгаруу + Molly Android - Кулпу экраны Карта + Белги коюу Даректи кабыл алуу @@ -2437,6 +2443,7 @@ Signal билдирүүсү + Дагы @@ -2468,6 +2475,7 @@ Бир да стикер орнотула элек Келген билдирүүлөрдөгү стикерлер ушул жерде көрүнөт Аталышы жок + Белгисиз @@ -2688,6 +2696,7 @@ Мындай медиафайл жок. Медиа ойнотулбай жатат. + Билдирүү табылган жок. Ушул медиафайлды бөлүшө турган колдонмо табылган жок. Жабуу @@ -2757,6 +2766,7 @@ Билдирүүлөр Чалуулар + Каталар Камдык көчүрмөлөр Кулпулоо абалы @@ -2766,6 +2776,7 @@ Белгисиз Аудио жазуулар Signal\'га байланыш кошулду + Билдирмелердин категорияларын тууралоо бөлүмүн ачуучу аракет жок. Фондук байланыш @@ -3537,10 +3548,12 @@ Бардык түзмөктөрдөгү бардык билдирүүлөр биротоло өчүп калат. Кайра калыбына келбейт. Бардыгын өчүрүү + Биротоло 1 жылга 6 айга 30 күнгө + Эч бир %1$s билдирүү @@ -3564,6 +3577,7 @@ Көрсөтүү Шыңгыр Билдирүүнүн шрифтинин өлчөмү + Биринчилик Мүчүлүштүктөрдү оңдоо билдирмелери @@ -3792,6 +3806,7 @@ Алуучунун дарек QR кодун скандаңыз + Өтүнүч Төлөө Жеткиликтүү баланс: %1$s @@ -3922,6 +3937,7 @@ Сиз болгону %1$d маекти кадап кое аласыз + Байланыш сүрөтү Архивделген @@ -3930,6 +3946,10 @@ Жаңы маек Камераны ачуу Азырынча маектер жок.\nДосуңузга жазуудан баштаңыз. + + Эч нерсе жок + + Папканын параметрлери @@ -4154,6 +4174,7 @@ Маектердин камдык көчүрмөсү Аккаунтту которуу Аккаунтту жаңы Android түзмөгүнө өткөрүү + Кошумча сыр сөз айкашы киргизиңиз Калыбына келтирүү Signal\'дын жаңы версияларынан көчүрмөлөрдү ала албайсыз @@ -4361,6 +4382,7 @@ Wi-Fi тууралоолорун ачуу мүмкүн эмес. Сураныч, Wi-Fi\'ды кол менен күйгүзүңүз. + Жүргөн жерди аныктоо уруксатын берүү Жүргөн жерди аныктоо кызматтарын күйгүзүү Wi-Fi күйгүзүү @@ -4607,6 +4629,7 @@ Бөлүшүү + Жөнөтүү , %1$s @@ -4909,6 +4932,116 @@ Баскычтоп Enter\'ди басып жөнөтүү + + Маектер папкалары + + Маек папкасын кошуу + + + + Маектериңизди папкаларга салып, керектүүлөрүн оңой тапкыдай кылыңыз. + + Папкалар + + Папка түзүү + + Бардык маектер + + Сунушталган папкалар + + Окула электер + + Бардык маектердеги окула элек билдирүүлөр + + Жекеме-жеке маектешүү + + Жекеме-жеке маектердеги билдирүүлөр гана + + Топтор + + Топтук маектердеги билдирүү гана + + Кошуу + + %1$s папкасы кошулду. + + Папканы оңдоо + + Папканы өчүрүү + + Жаңы папка кошуу + + Баарынын үнүн басуу + + Папкалардын иретин өзгөртүү + + Баарын окулду деп белгилөө + + + %1$d маектин түрлөрү + + + + %1$d маек + + + + %1$d маек чыгарылды + + + + + Папка түзүү + + Папканын аталышы (талап кылынат) + + Кошулган маектер + + Маектерди кошуу + + Бул папкада көрүнө турган маектерди тандайсыз. + + Өзгөчө учурлар + + Маектерди чыгаруу + + Бул папкада көрүнбөсүн деген маектерди тандайсыз. + + Окула элек маектер гана көрүнсүн + + Иштетсеңиз, бул папкада билдирүүлөрү окула элек маектер гана көрүнөт. + + Үнү басылган маектерди да + + Түзүү + + Папка түзөсүзбү? + + \"%1$s\" деген маектер папкасын түзөсүзбү? + + Ооба + + Папканы оңдоо + + Сактоо + + Өзгөрүүлөрдү сактайсызбы? + + Ушул маектер папкасына киргизилген өзгөрүүлөрдү сактайсызбы? + + Ооба + + Жокко чыгаруу + + Папканы өчүрүү + + Бул маектер папкасын өчүрөсүзбү? + + + + Маектин түрлөрү + + Бүттү Билдирүүлөр @@ -4992,6 +5125,7 @@ Медиа сапаты + Жөнөтүлгөн медиа сапаты Жогорку сапаттагы медианы жөнөтүү көбүрөөк берилмелерди колдонот. @@ -7076,10 +7210,10 @@ - Your backups subscription expired + Жазылуунун мөөнөтү өтүп кетти - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Учурдагы төлөм ыкмаңыздан акы алынбагандыктан, камдык көчүрмөңүздүн тарифтик планынын мөөнөтү бүтүп калды. %1$d күндөн кийин медиа файлдарыңыздын камдык көчүрмөлөрү өчүрүлөт. Медиа файлдар сактала бериши үчүн алардын акысын төлөшүңүз керек. @@ -7096,9 +7230,9 @@ \"Өткөрүп жиберүү\" дегенди тандасаңыз, медиа файлдарыңызды көчүрмөлөрү %1$d күндөн кийин өчүп калат. - Your backups subscription failed to renew + Жазылууңуз узартылган жок - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Төлөм ыкмаңыз эскирип калган жокпу? Жазылууну тескөө дегенди ачып, Төлөм ыкмалары деген бөлүмдөн Жаңыртуу дегенди басыңыз. Камдык көчүрмөлөр сакталган жок @@ -7110,7 +7244,7 @@ Жазылууну башкаруу - Subscribe for %1$s/month + Айына %1$s төлөп жазылыңыз Медиа файлдарды жүктөп алуу @@ -7145,6 +7279,17 @@ %2$s ичинен %1$s + + + Токтотуу + + Канчасы жүктөлүп алынды: %2$s ичинен %1$s (%3$s%%) + + Камдык көчүрмөңүздү жүктөөгө орун жетишпейт. Улантуу үчүн %1$s орун бошотуңуз. + + Өткөрүп жиберүү + + "Акыркы камдык көчүрмөңүз аягына чейин чыккан жок. Телефонуңуздун Wi-Fi\'га туташып турганын текшерип, \"Камдык көчүрмөнү сактоо\" дегенди басып кайталап көрүңүз." @@ -7198,17 +7343,17 @@ Сактоо мейкиндигин кеңейтүү үчүн Signal\'дын камдык көчүрмөлөрдү сактоо кызматынын акы алынуучу деңгээлине көтөрүлүү керек. Бул функцияны пайдаланып баштоо үчүн тарифтик планыңызды өзгөртүңүз. - Subscribe for %1$s/month + Айына %1$s төлөп жазылыңыз - This media is no longer available + Бул медиа файлдар жок - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Signal\'дагы учурдагы камдык көчүрмөлөр планында акыркы %1$d күндөгү медиа файлдар бар. Алардын баарынын сактоо үчүн аны жаңыртыңыз. - Subscribe for %1$s/month + Айына %1$s төлөп жазылыңыз Бардык түзмөктөрүңүздө өчүрүлөт @@ -7256,6 +7401,8 @@ Жүктөлүп бүттү Камдык көчүрмөсү түндө түзүлөт. + + Жазылуу токтотулду Камдык көчүрүү планы @@ -7264,8 +7411,12 @@ Айына %1$s Камдык көчүрүү планыңыз акысыз - + %1$s жаңырат + + Качан бүтөт: %1$s + + Качан бүттү: %1$s Жаңы телефон алганыңызда же Molly\'ды кайра орнотконуңузда эч качан дайындарыңызды жоготуп албашыңыз үчүн билдирүүлөр таржымалыңыздын камдык көчүрмөсүн сактаңыз. @@ -7310,6 +7461,10 @@ Камдык көчүрмөлөрдү кол менен сактоо Түзмөгүңүздүн pin кодун, сырсөзүн же графикалык ачкычын киргизиңиз. + + Кайра иштетүү + + Камдык көчүрмөлөрдү сактоо функциясы өчүрүлгөндүктөн, Signal\'дын сактагычында сакталган нерселериңиз өчүп калды. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index f640e43f32..f74066446c 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -371,6 +371,8 @@ Pokalbiai Žinutės + + Pokalbių tipai Žinutė %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Viskas paruošta. Pradėkite atsarginę kopiją dabar. Priklausomai nuo atsarginės kopijos dydžio, tai gali ilgai užtrukti. Kol kuriama atsarginė kopija, telefoną naudoti galite kaip įprasta. @@ -2088,6 +2090,7 @@ +%1$d pakviestų +%1$d pakviestas + %1$d papildoma grupė %1$d papildomos grupės @@ -2116,6 +2119,7 @@ Įrenginys nerastas. Tinklo klaida. Neteisingas QR kodas. + Atleiskite, jūs jau turite per daug susietų įrenginių, pabandykite kai kuriuos pašalinti Atleiskite, tai nėra teisingas įrenginio nuorodos QR kodas. Susieti Signal įrenginį? @@ -2140,11 +2144,13 @@ Pateikti slaptafrazę Neteisinga slaptafrazė! Atrakinti Molly + Molly „Android“ - Ekrano užraktas Žemėlapis + Įsmeigti smeigtuką Priimti adresą @@ -2692,6 +2698,7 @@ Signal žinutė + Daugiau @@ -2723,6 +2730,7 @@ Nėra jokių įdiegtų lipdukų Čia bus rodomi lipdukai iš gaunamų žinučių Be pavadinimo + Nežinoma @@ -2946,6 +2954,7 @@ Medija daugiau nebeprieinama. Nepavyksta paleisti įrašo. + Klaida ieškant žinutės. Nepavyksta rasti programėlės, galinčios bendrinti šią mediją. Užverti @@ -3021,6 +3030,7 @@ Žinutės Skambučiai + Nesėkmės Atsarginės kopijos Užrakinimo būsena @@ -3030,6 +3040,7 @@ Nežinoma Balso pastabos Adresatas prisijungė prie Signal + Nėra prieinamos veiklos, kad būtų atverti pranešimų kanalo nustatymai. Foninis ryšys @@ -3840,10 +3851,12 @@ Iš visų įrenginių visam laikui bus pašalinta visa žinučių istorija. Šio veiksmo bus neįmanoma atšaukti. Ištrinti viską dabar + Amžinai 1 metus 6 mėnesius 30 dienų + Nėra %1$s žinutė @@ -3870,6 +3883,7 @@ Rodyti Skambučio melodija Žinučių šrifto dydis + Pirmenybė Šalinti pranešimų nesklandumus @@ -4098,6 +4112,7 @@ Skenuoti lėšų gavėjo adreso QR kodą + Prašyti Mokėti Prieinamas likutis: %1$s @@ -4231,6 +4246,7 @@ Galite prisegti daugiausiai %1$d pokalbių + Adresato nuotraukos paveikslas Archyvuota @@ -4239,6 +4255,10 @@ Naujas pokalbis Atverti kamerą Kol kas pokalbių nėra.\nPradėkite, bendraudami su draugais. + + Nėra pokalbių, kuriuos galima parodyti + + Aplanko nustatymai @@ -4487,6 +4507,7 @@ Pokalbių atsarginės kopijos Perkelti paskyrą Perkelti paskyrą į naująjį „Android“ įrenginį + Įveskite atsarginės kopijos slaptafrazę Atkurti Negalima importuoti atsarg. kopijų iš naujesnių versijų @@ -4694,6 +4715,7 @@ Nepavyko atverti belaidžio (Wi-Fi) nustatymų. Įjunkite belaidį (Wi-Fi) ryšį rankiniu būdu. + Suteikti įrenginio vietos leidimą Įjungti vietos paslaugas Įjungti belaidį (Wi-Fi) @@ -4961,6 +4983,7 @@ Bendrinti + Siųsti , %1$s @@ -5266,6 +5289,125 @@ Klaviatūra Siųsti spustelėjus „Įvesti“ + + Pokalbių aplankai + + Pridėti pokalbio aplanką + + + + Suskirstykite pokalbius į aplankus ir greitai naršykite juos pokalbių sąraše. + + Aplankai + + Sukurti aplanką + + Visi pokalbiai + + Siūlomi aplankai + + Neskaitytos + + Neskaitytos žinutės iš visų pokalbių + + 1:1 pokalbiai + + Tik žinutės iš tiesioginių pokalbių + + Grupės + + Tik žinutės iš grupės pokalbių + + Pridėti + + Pridėtas pokalbis: %1$s. + + Redaguoti aplanką + + Ištrinti aplanką + + Pridėti naują aplanką + + Nutildyti visus + + Pertvarkyti aplankus + + Žymėti visus skaitytais + + + %1$d pokalbio tipas + %1$d pokalbio tipai + %1$d pokalbio tipo + %1$d pokalbio tipų + + + + %1$d pokalbis + %1$d pokalbiai + %1$d pokalbio + %1$d pokalbių + + + + %1$d pokalbis neįtrauktas + %1$d pokalbiai neįtraukti + %1$d pokalbio neįtraukta + %1$d pokalbių neįtraukta + + + + + Sukurti aplanką + + Aplanko pavadinimas (privalomas) + + Įtraukti pokalbiai + + Pridėti pokalbių + + Pasirinkite pokalbius, kuriuos norite rodyti šiame aplanke. + + Išimtys + + Slėpti pokalbius + + Pasirinkite pokalbius, kurių nenorite rodyti šiame aplanke. + + Rodyti tik neskaitytus pokalbius + + Įjungus, šiame aplanke bus rodomi tik pokalbiai su neskaitytomis žinutėmis. + + Įtraukti nutildytus pokalbius + + Sukurti + + Sukurti aplanką? + + Ar norite sukurti pokalbio aplanką „%1$s“? + + Sukurti aplanką + + Redaguoti aplanką + + Įrašyti + + Išsaugoti pakeitimus? + + Ar norite išsaugoti šiam pokalbio aplankui atliktus pakeitimus? + + Išsaugoti pakeitimus + + Atmesti + + Ištrinti aplanką + + Ištrinti šį pokalbio aplanką? + + + + Pokalbių tipai + + Atlikta Žinutės @@ -5352,6 +5494,7 @@ Medijos kokybė + Siunčiamos medijos kokybė Aukštos kokybės medijos siuntimas naudos daugiau tinklo duomenų. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Baigėsi atsarginių kopijų prenumeratos galiojimas - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Baigėsi atsarginės kopijos plano galiojimo laikas, nes jo nepavyko atnaujinti naudojant dabartinį mokėjimo būdą. Po %1$d d. įrašai iš atsarginių kopijų bus ištrinti. + Baigėsi atsarginės kopijos plano galiojimo laikas, nes jo nepavyko atnaujinti naudojant dabartinį mokėjimo būdą. Po %1$d d. įrašai iš atsarginių kopijų bus ištrinti. + Baigėsi atsarginės kopijos plano galiojimo laikas, nes jo nepavyko atnaujinti naudojant dabartinį mokėjimo būdą. Po %1$d d. įrašai iš atsarginių kopijų bus ištrinti. + Baigėsi atsarginės kopijos plano galiojimo laikas, nes jo nepavyko atnaujinti naudojant dabartinį mokėjimo būdą. Po %1$d d. įrašai iš atsarginių kopijų bus ištrinti. Bet kada galite vėl pradėti mokėti už atsargines kopijas ir toliau kopijuoti visus savo įrašus. @@ -7570,9 +7713,9 @@ Jei pasirinksite „Praleisti“, įrašai iš atsarginių kopijų bus ištrinti po %1$d d. - Your backups subscription failed to renew + Nepavyko atnaujinti atsarginių kopijų prenumeratos - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Įsitikinkite, kad jūsų mokėjimo būdas atnaujintas. Bakstelėkite „Tvarkyti prenumeratą“ ir skiltyje „Mokėjimo būdai“ bakstelėkite „Atnaujinti“. Nepavyko sukurti atsarginės kopijos @@ -7584,7 +7727,7 @@ Tvarkyti prenumeratą - Subscribe for %1$s/month + Prenumeruokite už %1$s/mėn. Atsisiųsti įrašus dabar @@ -7619,6 +7762,17 @@ %1$s iš %2$s + + + Atšaukti atsisiuntimą + + Atsisiunčiama %1$s iš %2$s (%3$s %%) + + Nepakanka vietos, kad būtų galima atsisiųsti atsarginę kopiją. Norėdami tęsti atlaisvinkite %1$s vietos. + + Praleisti atsisiuntimą + + "Paskutinės atsarginės kopijos sukurti nepavyko. Norėdami pabandyti dar kartą įsitikinkite, kad telefonas prijungtas prie „Wi-Fi“, ir bakstelėkite „Kurti atsarginę kopiją dabar“." @@ -7672,20 +7826,20 @@ Saugyklos optimizavimą galima naudoti tik įsigijus mokamą „Signal“ atsarginių kopijų planą. Norėdami pradėti naudotis šia funkcija, atnaujinkite atsarginių kopijų planą. - Subscribe for %1$s/month + Prenumeruokite už %1$s/mėn. - This media is no longer available + Šis įrašas nebeprieinamas - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Į jūsų dabartinį „Signal“ atsarginės kopijos planą įtraukti pastarosios %1$d d. įrašai. Norėdami pradėti kurti atsargines visų įrašų kopijas, atnaujinkite dabar. + Į jūsų dabartinį „Signal“ atsarginės kopijos planą įtraukti pastarųjų %1$d d. įrašai. Norėdami pradėti kurti atsargines visų įrašų kopijas, atnaujinkite dabar. + Į jūsų dabartinį „Signal“ atsarginės kopijos planą įtraukti pastarųjų %1$d d. įrašai. Norėdami pradėti kurti atsargines visų įrašų kopijas, atnaujinkite dabar. + Į jūsų dabartinį „Signal“ atsarginės kopijos planą įtraukti pastarųjų %1$d d. įrašai. Norėdami pradėti kurti atsargines visų įrašų kopijas, atnaujinkite dabar. - Subscribe for %1$s/month + Prenumeruokite už %1$s/mėn. Ištrynimas dabar sinchronizuojamas visuose jūsų įrenginiuose @@ -7733,6 +7887,8 @@ Atsisiuntimas baigtas Atsarginė kopija bus sukurta per naktį. + + Prenumerata neaktyvi Atsarginės kopijos planas @@ -7741,8 +7897,12 @@ %1$s/mėnesį Jūsų atsarginės kopijos planas yra nemokamas - + Atnaujinama %1$s + + Baigia galioti %1$s + + Baigė galioti %1$s Sukurkite savo žinučių istorijos atsarginę kopiją, kad niekada neprarastumėte duomenų įsigiję naują telefoną arba iš naujo įdiegę „Molly“. @@ -7787,6 +7947,10 @@ Atsarginę kopiją sukurti rankiniu būdu Įveskite įrenginio PIN kodą, slaptažodį arba šabloną. + + Iš naujo įjungti atsargines kopijas + + Atsarginės kopijos buvo išjungtos ir jūsų duomenys ištrinti iš saugios „Signal“ saugyklos paslaugos. diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 45ebf66732..a57c87af24 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -368,6 +368,8 @@ Sarunas Ziņas + + Sarunu veidi Ziņa %1$s @@ -833,7 +835,7 @@ - You\'re all set. Start your backup now. + Viss gatavs. Tagad sāciet rezerves kopijas izveidi. Atkarībā no jūsu rezerves kopijas izmēra, process var aizņemt ilgu laiku. Kamēr notiek rezerves kopijas izveide, varat izmantot savu tālruni kā parasti. @@ -2027,6 +2029,7 @@ +%1$d ielūgts +%1$d ielūgti + %1$d cita grupa %1$d cita grupa @@ -2054,6 +2057,7 @@ Neviena ierīce netika atrasta. Tīkla kļūda. Nederīgs kvadrātkods. + Piedodiet, piesaistīts pārāk daudz ierīču, mēģiniet kādu no tām atsaistīt Piedodiet, šis nav derīgs ierīces sasaistes kvadrātkods. Piesaistīt Signal ierīci? @@ -2077,11 +2081,13 @@ Iesniegt paroles frāzi Nederīga paroles frāze! Atbloķēt Molly + Molly Android - bloķēt ekrānu Karte + Nomest atzīmi Pieņemt adresi @@ -2607,6 +2613,7 @@ Signal ziņa + Vēl @@ -2638,6 +2645,7 @@ Nav instalētu uzlīmju Šeit parādīsies uzlīmes no ienākošajām ziņām Nenosaukts + Nezināms @@ -2860,6 +2868,7 @@ Mediju fails vairs nav pieejams Nevar atskaņot multivides failu. + Meklējot ziņu, radās kļūda. Nevar atrast lietotni, kas varētu kopīgot šo multivides saturu. Aizvērt @@ -2933,6 +2942,7 @@ Ziņas Zvani + Kļūmes Rezerves kopijas Bloķēšanas (noslēgšanas) statuss @@ -2942,6 +2952,7 @@ Nezināms Balss piezīmes Kontakts pievienojās Signal + Paziņojumu kanāla iestatījumu atvēršanai nav pieejama neviena darbība. Fona savienojums @@ -3739,10 +3750,12 @@ No visām ierīcēm tiks neatgriezeniski dzēsta visa ziņu vēsture. Šo darbību nevar atsaukt. Izdzēst visas tagad + Uz visiem laikiem 1 gadu 6 mēnešiem 30 dienām + Nav %1$s ziņas @@ -3768,6 +3781,7 @@ Rādīt Zvana signāls Ziņu fonta lielums + Prioritāte Paziņojumu problēmu novēršana @@ -3996,6 +4010,7 @@ Skenēt maksājuma saņēmēja adreses kvadrātkodu + Pieprasīt Maksāt Pieejamais atlikums: %1$s @@ -4128,6 +4143,7 @@ Iespējams piespraust tikai līdz %1$d sarunām + Kontaktpersonas foto Arhivēts @@ -4136,6 +4152,10 @@ Jauna saruna Atvērt kameru Vēl nav sarunu.\nSāciet, nosūtot ziņu draugam. + + Nav sarunu, ko parādīt + + Mapes iestatījumi @@ -4376,6 +4396,7 @@ Sarunu rezerves kopijas Pārnest kontu Pārnest kontu uz citu Android ierīci + Rezerves kopijas paroles frāzi Atjaunot Nevar importēt dublējumus no jaunākām Signal versijām @@ -4583,6 +4604,7 @@ Nevar atvērt Wi-Fi iestatījumus. Ieslēdziet Wi-Fi manuāli. + Piešķirt atrašanās vietas atļauju Ieslēgt atrašanās vietas pakalpojumus Ieslēgt Wi-Fi @@ -4843,6 +4865,7 @@ Kopīgot + Sūtīt , %1$s @@ -5147,6 +5170,122 @@ Tastatūra Sūtīt, nospiežot \"Enter\" + + Sarunu mapes + + Pievienot sarunu mapi + + + + Sakārtojiet sarunas mapēs un ātri pārslēdzieties starp tām savā sarunu sarakstā. + + Mapes + + Izveidot mapi + + Visas sarunas + + Ieteiktās mapes + + Nelasītās + + Nelasītās ziņas no visām sarunām + + Privātās sarunas + + Tikai ziņas no privātajām sarunām + + Grupas + + Tikai ziņas no grupu sarunām + + Pievienot + + Mape %1$s pievienota. + + Rediģēt mapi + + Dzēst mapi + + Pievienot jaunu mapi + + Izslēgt paziņojumus visām + + Pārkārtot mapes + + Atzīmēt visus kā lasītus + + + %1$d sarunu veidi + %1$d sarunu veids + %1$d sarunu veidi + + + + %1$d sarunas + %1$d saruna + %1$d sarunas + + + + %1$d sarunas nav ietvertas + %1$d saruna nav ietverta + %1$d sarunas nav ietvertas + + + + + Izveidot mapi + + Mapes nosaukums (obligāts) + + Iekļautās sarunas + + Pievienot sarunas + + Izvēlieties sarunas, kuras vēlaties iekļaut šajā mapē. + + Izņēmumi + + Neietvert sarunas + + Izvēlieties sarunas, kuras nevēlaties iekļaut šajā mapē. + + Rādīt tikai nelasītās sarunas + + Aktivizējot pārslēgu, šajā mapē tiks rādītas tikai sarunas ar nelasītām ziņām. + + Iekļaut sarunas, kuru paziņojumi ir izslēgti + + Izveidot + + Vai izveidot mapi? + + Vai vēlaties izveidot sarunu mapi \"%1$s\"? + + Izveidot mapi + + Rediģēt mapi + + Saglabāt + + Vai saglabāt izmaiņas? + + Vai vēlaties saglabāt šajā sarunu mapē veiktās izmaiņas? + + Saglabāt izmaiņas + + Atmest + + Dzēst mapi + + Vai dzēst šo sarunu mapi? + + + + Sarunu veidi + + Gatavs Ziņas @@ -5232,6 +5371,7 @@ Multivides kvalitāte + Nosūtītās multivides kvalitāte Sūtot augstas kvalitātes multivides saturu, tiks izmantots vairāk datu. @@ -7388,12 +7528,12 @@ - Your backups subscription expired + Rezerves kopiju abonementa derīguma termiņš ir beidzies - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Rezerves kopiju plāna derīguma termiņš ir beidzies, jo to nevarēja atjaunot, izmantojot pašreizējo maksājuma veidu. Pēc %1$d dienām multivide jūsu rezerves kopijā tiks dzēsta. + Rezerves kopiju plāna derīguma termiņš ir beidzies, jo to nevarēja atjaunot, izmantojot pašreizējo maksājuma veidu. Pēc %1$d dienas multivide jūsu rezerves kopijā tiks dzēsta. + Rezerves kopiju plāna derīguma termiņš ir beidzies, jo to nevarēja atjaunot, izmantojot pašreizējo maksājuma veidu. Pēc %1$d dienām multivide jūsu rezerves kopijā tiks dzēsta. Lai turpinātu multivides rezerves kopiju izveidošanu, jebkurā brīdī varat atsākt maksājumu veikšanu. @@ -7412,9 +7552,9 @@ Izvēloties \"Izlaist\", multivides rezerves kopija tiks dzēsta pēc %1$d dienām. - Your backups subscription failed to renew + Rezerves kopiju abonementu neizdevās atjaunot - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Pārliecinieties, kā jūsu maksājuma veids ir derīgs. Pieskarieties pie \"Pārvaldīt abonementu\" un sadaļā \"Maksājumu veidi\" pieskarieties pie \"Atjaunināt\". Neizdevās izveidot rezerves kopiju @@ -7426,7 +7566,7 @@ Pārvaldīt abonementu - Subscribe for %1$s/month + Abonēt par %1$s mēnesī Lejupielādēt multividi tūlīt @@ -7461,6 +7601,17 @@ %1$s no %2$s + + + Atcelt lejupielādi + + Lejupielādē: %1$s no %2$s (%3$s%%) + + Nepietiek vietas, lai lejupielādētu rezerves kopiju. Lai turpinātu, atbrīvojiet %1$s vietas. + + Izlaist lejupielādi + + "Neizdevās pabeigt pēdējās rezerves kopijas izveidi. Lai mēģinātu vēlreiz, pārliecinieties, ka tālrunī ir izveidots savienojums ar Wi-Fi un pieskarieties pie \"Izveidot rezerves kopiju tūlīt\"." @@ -7514,19 +7665,19 @@ Krātuves optimizāciju var izmantot tikai Signal rezerves kopiju maksas plāna īpašnieki. Iegādājieties rezerves kopiju plānu, lai sāktu izmantot šo funkciju. - Subscribe for %1$s/month + Abonēt par %1$s mēnesī - This media is no longer available + Šī multivide vairs nav pieejama - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Pašreizējais Signal rezerves kopiju plāns ietver pēdējo %1$d dienu multividi. Lai izveidotu visas multivides rezerves kopiju, iegādājieties citu plānu. + Pašreizējais Signal rezerves kopiju plāns ietver pēdējo %1$d dienas multividi. Lai izveidotu visas multivides rezerves kopiju, iegādājieties citu plānu. + Pašreizējais Signal rezerves kopiju plāns ietver pēdējo %1$d dienu multividi. Lai izveidotu visas multivides rezerves kopiju, iegādājieties citu plānu. - Subscribe for %1$s/month + Abonēt par %1$s mēnesī Dzēšana tagad ir sinhronizēta visās jūsu ierīcēs @@ -7574,6 +7725,8 @@ Lejupielāde pabeigta Rezerves kopija tiks izveidota pa nakti. + + Abonements neaktīvs Rezerves kopiju plāns @@ -7582,8 +7735,12 @@ %1$s/mēnesī Jums ir bezmaksas rezerves kopiju plāns - + Atjaunojas %1$s + + Derīguma termiņš: %1$s + + Derīguma termiņš beigsies: %1$s Izveidojiet ziņu vēstures rezerves kopiju, lai nezaudētu datus, nomainot tālruni vai pārinstalējot Molly. @@ -7628,6 +7785,10 @@ Pašrocīgi izveidot rezerves kopiju Ievadiet ierīces PIN kodu, paroli vai atbloķēšanas kombināciju. + + Atkārtoti iespējot rezerves kopiju izveidi + + Rezerves kopiju izveide ir izslēgta, un jūsu dati ir dzēsti no Signal drošās krātuves pakalpojuma. diff --git a/app/src/main/res/values-lv/strings2.xml b/app/src/main/res/values-lv/strings2.xml index fbe3607f01..f631fcea36 100644 --- a/app/src/main/res/values-lv/strings2.xml +++ b/app/src/main/res/values-lv/strings2.xml @@ -20,7 +20,6 @@ Rādīt zvanus Molly ir aizslēgta Beta versijas ir paredzētas pārbaudīšanai, un tajās var būt kļūdas - Optimizēt savlaicīgiem paziņojumiem Parasta Pieprasīt paroles vārdkopu, lai atslēgtu Molly? Automātiska noslēgšana @@ -73,14 +72,12 @@ Tīkla iestatījumi Iknedēļas Molly ir nepieciešama kontaktpersonu atļauja, lai palīdzētu atrast savus draugus. Kontaktpersonas tiek augšupielādētas ar Signal privāto kontaktpersonu atklāšanu, kas nozīmē, ka tās ir pilnībā šifrētas un nekad nav redzamas pakalpojumam Signal. - Jāpiesit, lai ļautu Molly iegūt ziņojumus, kamēr ierīce ir gaidstāvē. Nav sasaistīto ierīču %1$s nav reģistrējies Signal Ierīce #%d Diemžēl šai iespējai ir nepieciešami pašpiegādes paziņojumi, kas tiek piegādāti ar FCM vai UnifiedPush, kas pašlaik nav pieejami. Jauna darbība, kamēr aizslēgta Saņemt paziņojumus par ziņojumiem vai neatbildētiem zvaniem, kad lietotne ir aizslēgta. - Pašpiegādes paziņojumi nav pieejami Notiek drošā tīrīšana Dati miera stāvoklī Tūlītēji diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 82c703f4c5..054571a86f 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -365,6 +365,8 @@ Разговори Пораки + + Видови разговори Порака %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Сè е подготвено. Започнете со правење резервна копија сега. Во зависност од големината на резервната копија, ова може да потрае. Можете најнормално да го користите телефонот додека се прави резервната копија. @@ -1966,6 +1968,7 @@ +%1$d поканет +%1$d поканети + %1$d дополнителна група %1$d дополнителни групи @@ -1992,6 +1995,7 @@ Уредот не е пронајден. Мрежна грешка. Погрешен QR код. + Извинете, имате премногу поврзани уреди, обидете се да отстраните некои од нив Извинете, ова не е валиден QR код за поврзување со уредот. Да поврзам уред со Signal? @@ -2014,11 +2018,13 @@ Испрати лозинка Погрешна лозинка! Отклучи го Molly + Molly Android - Заклучувен екран Мапа + Фрли покажувач Прифати адреса @@ -2522,6 +2528,7 @@ Signal порака + Повеќе @@ -2553,6 +2560,7 @@ Нема стикери инсталирано Стикерите од дојдовните пораки ќе се појават овде Без наслов + Непознато @@ -2774,6 +2782,7 @@ Медијата повеќе не е достапна. Не може да се пушти медиумската датотека. + Грешка при пронаоѓање на пораката. Не е пронајдена апликација која може да го сподели овој тип на медиумска датотека. Затвори @@ -2845,6 +2854,7 @@ Пораки Повици + Неуспеси Резервни копии Статус @@ -2854,6 +2864,7 @@ Непознато Гласовни белешки Кога контакт ќе се приклучи на Signal + Нема достапна активност за отворање на поставките на каналот за известувања. Врска во позадина @@ -3638,10 +3649,12 @@ Целата историја на пораки ќе биде трајно отстранета од сите уреди. Ова дејство е неповратно. Избриши сѐ веднаш + Засекогаш 1 година 6 месеци 30 дена + Нема %1$s порака @@ -3666,6 +3679,7 @@ Прикажи Звук за ѕвонење Големина на фонт за пораки + Приоритет Решете проблеми со известувањата @@ -3894,6 +3908,7 @@ Скенирајте го QR кодот на адресата на примачот + Барање Плати Расположливо салдо: %1$s @@ -4025,6 +4040,7 @@ Можете да закачите најмногу %1$d разговори + Слика на контакт Архивирано @@ -4033,6 +4049,10 @@ Нов разговор Отвори камера Немате разговори.\nЗапочнете со испраќање порака на пријател. + + Нема разговори за прикажување + + Поставувања за папката @@ -4265,6 +4285,7 @@ Резервни копии на разговори Префрли сметка Префрли сметка на друг Android уред + Внесете лозинка за резервна копија Врати Не може да се увезат резервни копии од понови верзии @@ -4472,6 +4493,7 @@ Не можам да ги отворам поставувањата за Wi-Fi. Ве молиме вклучете Wi-Fi рачно. + Додели дозвола за локација Вклучи локациски сервиси Вклучи Wi-Fi @@ -4725,6 +4747,7 @@ Сподели + Испрати , %1$s @@ -5028,6 +5051,119 @@ Тастатура Испраќај со копчето enter + + Папки со разговори + + Додајте папка со разговори + + + + Организирајте ги вашите разговори во папки и брзо преминувајте од еден на друг разговор во вашата листа со разговори. + + Папки + + Направете папка + + Сите разговори + + Предложени папки + + Непрочитани + + Непрочитани пораки од сите разговори + + Разговори еден на еден + + Само пораки од директни разговори + + Групи + + Само пораки од групни разговори + + Додај + + Додадена е папката %1$s. + + Изменете ја папката + + Избришете папка + + Додајте нова папка + + Исклучете ги известувањата на сите + + Сменете го распоредот на папки + + Обележи сѐ како прочитано + + + %1$d вид разговор + %1$d вида разговори + + + + %1$d разговор + %1$d разговори + + + + %1$d исклучен разговор + %1$d исклучени разговори + + + + + Направете папка + + Име на папка (задолжително) + + Вклучени разговори + + Додајте разговори + + Изберете разговори коишто сакате да се прикажат во оваа папка. + + Исклучоци + + Исклучете разговори + + Изберете разговори коишто не сакате да се прикажат во оваа папка. + + Прикажувај само непрочитани разговори + + Кога оваа опција е овозможена, во оваа папка ќе се прикажуваат само разговори со непрочитани пораки. + + Вклучи ги и разговорите со исклучени известувања + + Создај + + Да се направи папка? + + Дали сакате да направите папка со разговори насловена „%1$s“? + + Направете папка + + Изменете ја папката + + Зачувај + + Да се зачуваат промените? + + Дали сакате да ги зачувате промените на оваа папка со разговори? + + Зачувај ги промените + + Откажи + + Избришете папка + + Да се избрише оваа папка со разговори? + + + + Видови разговори + + Готово Пораки @@ -5112,6 +5248,7 @@ Квалитет на медиумски датотеки + Квалитет на испратена медиумска датотека Испраќањето на висококвалитетна медиумска датотека ќе користи повеќе податоци. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Вашата претплата на резервни копии истече - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Вашиот претплатен пакет на резервни копии истече зашто не можеше да се обнови со вашиот тековен начин на плаќање. По %1$d ден, медиумските датотеки од вашата резервна копија ќе бидат избришани. + Вашиот претплатен пакет на резервни копии истече зашто не можеше да се обнови со вашиот тековен начин на плаќање. По %1$d дена, медиумските датотеки од вашата резервна копија ќе бидат избришани. Можете во кое било време да почнете одново да плаќате за резервни копии за да продолжите да правите резервни копии од сите ваши медиумски датотеки. @@ -7254,9 +7391,9 @@ Ако изберете „Прескокни“, медиумските датотеки во вашата резервна копија ќе бидат избришани за %1$d дена. - Your backups subscription failed to renew + Вашата претплата на резервни копии не успеа да се обнови - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Проверете дали внесените податоци за начин на плаќање се ажурирани. Допрете на „Управување со претплатата“ и под „Начин на плаќање“ допрете на „Ажурирај“. Не можеше да се направи резервна копија @@ -7268,7 +7405,7 @@ Управување со претплатата - Subscribe for %1$s/month + Претплатете се за %1$s/месечно Преземете ги медиумските датотеки сега @@ -7303,6 +7440,17 @@ %1$s од %2$s + + + Откажете го преземањето + + Се преземаат: %1$s од %2$s (%3$s%%) + + Нема доволно простор за складирање на вашата резервна копија. За да продолжите, ослободете простор од %1$s. + + Прескокнете го преземањето + + "Не можеше да се заврши вашата последна резервна копија. Проверете дали вашиот телефон e поврзан на Wi-Fi, допрете на „Направи резервна копија сега“ и обидете се повторно." @@ -7356,18 +7504,18 @@ Оптимизацијата на складирање може да се користи само со платена претплата на Signal резервни копии. Надградете го претплатничкиот пакет на резервни копии за да почнете да ја користите оваа функција. - Subscribe for %1$s/month + Претплатете се за %1$s/месечно - This media is no longer available + Оваа медиумска датотека повеќе не е достапна - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Вашиот тековен претплатен пакет на резервни копии ги вклучува медиумските датотеки од последниот %1$d ден. За да имате резервна копија од сите ваши медиумските датотеки, надоградете го пакетот сега. + Вашиот тековен претплатен пакет на резервни копии ги вклучува медиумските датотеки од последните %1$d дена. За да имате резервна копија од сите ваши медиумските датотеки, надоградете го пакетот сега. - Subscribe for %1$s/month + Претплатете се за %1$s/месечно Бришењето сега е синхронизирано на сите ваши уреди @@ -7415,6 +7563,8 @@ Преземањето е завршено Резервната копија ќе се прави во текот на ноќта. + + Претплатата не е активна Претплатен пакет на резервни копии @@ -7423,8 +7573,12 @@ %1$s/месец Вашиот претплатен пакет на резервни копии е бесплатен - + Се обновува на %1$s + + Истекува на %1$s + + Истече на %1$s Направете резервна копија на вашата историја на пораки за да не губите податоци кога ќе земете нов телефон или ќе ја реинсталирате Molly апликацијата. @@ -7469,6 +7623,10 @@ Направете резервна копија рачно Ве молиме внесете го вашиот PIN, лозинка или шема за отклучување. + + Повторно овозможете правење резервни копии + + Резервните копии се оневозможени и вашите податоци беа избришани од услугата за безбедно складирање на Signal. diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 48e4268908..9fa19ba2fa 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -365,6 +365,8 @@ ചാറ്റുകൾ സന്ദേശങ്ങൾ + + ചാറ്റ് തരങ്ങൾ സന്ദേശ൦ %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + നിങ്ങൾ തയ്യാറായിക്കഴിഞ്ഞു. നിങ്ങളുടെ ബാക്കപ്പ് ഇപ്പോൾ ആരംഭിക്കുക. നിങ്ങളുടെ ബാക്കപ്പിൻ്റെ വലുപ്പത്തെ ആശ്രയിച്ച്, ഇതിന് വളരെയധികം സമയമെടുത്തേക്കാം. ബാക്കപ്പ് നടക്കുമ്പോൾ നിങ്ങൾക്ക് സാധാരണപോലെ നിങ്ങളുടെ ഫോൺ ഉപയോഗിക്കാം. @@ -1966,6 +1968,7 @@ +%1$d ആളെ ക്ഷണിച്ചു +%1$d പേരെ ക്ഷണിച്ചു + %1$d അധിക ഗ്രൂപ്പ് %1$d അധിക ഗ്രൂപ്പുകൾ @@ -1992,6 +1995,7 @@ ഉപകരണങ്ങളൊന്നും കണ്ടെത്തിയില്ല. നെറ്റ്‌വർക്ക് പിശക്. QR കോഡ് അസാധുവാണ്. + ക്ഷമിക്കണം, നിങ്ങൾക്ക് ഇതിനകം തന്നെ നിരവധി ഉപകരണങ്ങൾ ബന്ധിപ്പിച്ചിട്ടുണ്ട്, ചിലത് നീക്കംചെയ്യാൻ ശ്രമിക്കുക ക്ഷമിക്കണം, ഇത് സാധുവായ ഉപകരണ ലിങ്ക് QR കോഡല്ല. ഒരു Signal ഉപകരണം ബന്ധിപ്പിക്കണോ? @@ -2014,11 +2018,13 @@ രഹസ്യവാചകം സമർപ്പിക്കുക രഹസ്യവാചകം അസാധുവാണ്! Molly തുറക്കൂ + Molly Android - ലോക്ക് സ്‌ക്രീൻ ഭൂപടം + ഡ്രോപ്പ് പിൻ വിലാസം സ്വീകരിക്കുക @@ -2522,6 +2528,7 @@ Signal സന്ദേശം + കൂടുതൽ @@ -2553,6 +2560,7 @@ സ്റ്റിക്കറുകളൊന്നും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല വരുന്ന സന്ദേശങ്ങളിൽ നിന്നുള്ള സ്റ്റിക്കറുകൽ ഇവിടെ ദൃശ്യമാകും ശീർ‌ഷകമില്ലാത്തത് + അജ്ഞാതം @@ -2774,6 +2782,7 @@ മീഡിയ ഇനി ലഭ്യമല്ല. മീഡിയ പ്ലേ ചെയ്യാൻ കഴിയുന്നില്ല. + സന്ദേശം കണ്ടെത്തുന്നതിൽ പിശക്. ഈ മീഡിയ പങ്കിടാൻ കഴിയുന്ന ഒരു അപ്ലിക്കേഷൻ കണ്ടെത്താനായില്ല. അടയ്ക്കുക @@ -2845,6 +2854,7 @@ സന്ദേശങ്ങള്‍ കോളുകൾ + പരാജയങ്ങൾ ബാക്കപ്പുകൾ ലോക്ക് നില @@ -2854,6 +2864,7 @@ അജ്ഞാതം ശബ്ദ കുറിപ്പുകൾ കോൺ‌ടാക്റ്റ് Signal-ൽ ചേർന്നു + അറിയിപ്പ് ചാനൽ ക്രമീകരണങ്ങൾ തുറക്കാൻ ഒരു പ്രവർത്തനവും ലഭ്യമല്ല. പശ്ചാത്തല കണക്ഷൻ @@ -3638,10 +3649,12 @@ എല്ലാ സന്ദേശ ചരിത്രവും എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും ശാശ്വതമായി നീക്കം ചെയ്യപ്പെടും. ഈ പ്രവൃത്തി പഴയപടിയാക്കാനാകില്ല. എല്ലാം ഇപ്പോൾ ഇല്ലാതാക്കുക + എന്നേക്കും 1 വർഷം 6 മാസം 30 ദിവസം + ഒന്നുമില്ല %1$s സന്ദേശം @@ -3666,6 +3679,7 @@ കാണിക്കുക റിംഗ്‌ടോൺ സന്ദേശ ഫോണ്ട് വലുപ്പം + മുൻഗണന അറിയിപ്പുകൾ ട്രബിൾഷൂട്ട് ചെയ്യുക @@ -3894,6 +3908,7 @@ പണമടയ്ക്കുന്നയാളുടെ വിലാസം ക്യുആർ കോഡ് സ്കാൻ ചെയ്യുക + അഭ്യർത്ഥിക്കുക പണമടയ്ക്കുക ലഭ്യമായ ബാലൻസ്: %1$s @@ -4025,6 +4040,7 @@ നിങ്ങൾക്ക് %1$d ചാറ്റുകൾ വരെ മാത്രമേ പിൻ ചെയ്യാൻ കഴിയൂ + കോൺ‌ടാക്റ്റിന്റെ ഫോട്ടോ തിരഞ്ഞെടുത്തത് അനാർക്കൈവ് ചെയ്യുക @@ -4033,6 +4049,10 @@ പുതിയ ചാറ്റ് ക്യാമറ തുറക്കുക ഇതുവരെ ചാറ്റുകളൊന്നുമില്ല.\nഒരു സുഹൃത്തിന് സന്ദേശമയച്ചുകൊണ്ട് ആരംഭിക്കുക. + + പ്രദർശിപ്പിക്കാൻ ചാറ്റുകളൊന്നുമില്ല + + ഫോൾഡർ ക്രമീകരണങ്ങൾ @@ -4265,6 +4285,7 @@ ചാറ്റ് ബാക്കപ്പുകൾ അക്കൗണ്ട് മാറ്റിസ്ഥാപിക്കുക അക്കൌണ്ട് ഒരു പുതിയ ആൻഡ്രോയിഡ് ഉപകരണത്തിലേക്ക് മാറ്റിസ്ഥാപിക്കുക + ബാക്കപ്പിന്റെ രഹസ്യവാചകം നൽകുക വീണ്ടെടുക്കൂ പുതിയ Signal പതിപ്പിൽ നിന്ന് ബാക്കപ്പ് ഇമ്പോർട്ട് ഇല്ല @@ -4472,6 +4493,7 @@ വൈഫൈ ക്രമീകരണങ്ങൾ തുറക്കാൻ സാധ്യമല്ല. ദയവായി വൈ-ഫൈ മാനുവലായി ഓണാക്കുക. + സ്ഥലം അനുമതി നൽകുക ലൊക്കേഷൻ സേവനങ്ങൾ ഓണാക്കുക വൈ-ഫൈ ഓണാക്കുക @@ -4725,6 +4747,7 @@ പങ്കിടുക + അയയ്‌ക്കുക , %1$s @@ -5028,6 +5051,119 @@ കീബോർഡ് എൻ്റർ ചെയ്ത് അയയ്ക്കുക + + ചാറ്റ് ഫോൾഡറുകൾ + + ഒരു ചാറ്റ് ഫോൾഡർ ചേർക്കുക + + + + നിങ്ങളുടെ ചാറ്റുകൾ ഫോൾഡറുകളായി ഓർഗനൈസുചെയ്യുകയും നിങ്ങളുടെ ചാറ്റ് ലിസ്റ്റിൽ അവയ്ക്കിടയിൽ വേഗത്തിൽ മാറുകയും ചെയ്യുക. + + ഫോൾഡറുകൾ + + ഒരു ഫോൾഡർ സൃഷ്ടിക്കുക + + എല്ലാ ചാറ്റുകളും + + നിർദ്ദേശിക്കപ്പെട്ട ഫോൾഡറുകൾ + + വായിക്കാത്തവ + + എല്ലാ ചാറ്റുകളിൽ നിന്നുമുള്ള വായിക്കാത്ത സന്ദേശങ്ങൾ + + 1:1 ചാറ്റുകൾ + + നേരിട്ടുള്ള ചാറ്റുകളിൽ നിന്നുള്ള സന്ദേശങ്ങൾ മാത്രം + + ഗ്രൂപ്പുകൾ + + ഗ്രൂപ്പ് ചാറ്റുകളിൽ നിന്നുള്ള സന്ദേശം മാത്രം + + ചേർക്കുക + + %1$s ഫോൾഡർ ചേർത്തു. + + ഫോൾഡർ എഡിറ്റ് ചെയ്യുക + + ഫോൾഡർ ഇല്ലാതാക്കുക + + പുതിയ ഫോൾഡർ ചേർക്കുക + + എല്ലാം മ്യൂട്ട് ചെയ്യുക + + ഫോൾഡറുകൾ പുനഃക്രമീകരിക്കുക + + എല്ലാം വായിച്ചതായി കാണിക്കൂ + + + %1$d ചാറ്റ് തരം + %1$d ചാറ്റ് തരങ്ങൾ + + + + %1$d ചാറ്റ് + %1$d ചാറ്റുകൾ + + + + %1$d ചാറ്റ് ഒഴിവാക്കി + %1$d ചാറ്റുകൾ ഒഴിവാക്കി + + + + + ഒരു ഫോൾഡർ സൃഷ്ടിക്കുക + + ഫോൾഡറിൻ്റെ പേര് (ആവശ്യമാണ്) + + ചാറ്റുകൾ ഉൾപ്പെടുത്തിയിട്ടുണ്ട് + + ചാറ്റുകൾ ചേർക്കുക + + ഈ ഫോൾഡറിൽ ദൃശ്യമാകാൻ ആഗ്രഹിക്കുന്ന ചാറ്റുകൾ തിരഞ്ഞെടുക്കുക. + + ഉള്‍പ്പെടാത്തവ + + ചാറ്റുകൾ ഒഴിവാക്കുക + + ഈ ഫോൾഡറിൽ ദൃശ്യമാകാൻ നിങ്ങൾ ആഗ്രഹിക്കാത്ത ചാറ്റുകൾ തിരഞ്ഞെടുക്കുക. + + വായിക്കാത്ത ചാറ്റുകൾ മാത്രം കാണിക്കുക + + പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ, വായിക്കാത്ത സന്ദേശങ്ങളുള്ള ചാറ്റുകൾ മാത്രമേ ഈ ഫോൾഡറിൽ കാണിക്കൂ. + + മ്യൂട്ട് ചെയ്ത ചാറ്റുകൾ ഉൾപ്പെടുത്തുക + + സൃഷ്ടിക്കൂ + + ഫോൾഡർ സൃഷ്ടിക്കണോ? + + നിങ്ങൾക്ക് \"%1$s\" എന്ന ചാറ്റ് ഫോൾഡർ സൃഷ്ടിക്കണോ? + + ഫോൾഡർ സൃഷ്ടിക്കുക + + ഫോൾഡർ എഡിറ്റ് ചെയ്യുക + + സംരക്ഷിക്കൂ + + മാറ്റങ്ങൾ സംരക്ഷിക്കണോ? + + ഈ ചാറ്റ് ഫോൾഡറിൽ നിങ്ങൾ വരുത്തിയ മാറ്റങ്ങൾ സംരക്ഷിക്കണോ? + + മാറ്റങ്ങൾ സംരക്ഷിക്കുക + + കളയുക + + ഫോൾഡർ ഇല്ലാതാക്കുക + + ഈ ചാറ്റ് ഫോൾഡർ ഇല്ലാതാക്കണോ? + + + + ചാറ്റ് തരങ്ങൾ + + പൂർത്തിയായി സന്ദേശങ്ങൾ @@ -5112,6 +5248,7 @@ മീഡിയ നിലവാരം + അയയ്ക്കുന്ന മീഡിയയുടെ നിലവാരം ഉയർന്ന നിലവാരമുള്ള മീഡിയ അയയ്ക്കുന്നത് കൂടുതൽ ഡാറ്റ ഉപയോഗിക്കും. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + നിങ്ങളുടെ ബാക്കപ്പ് സബ്‌സ്‌ക്രിപ്‌ഷൻ കാലഹരണപ്പെട്ടു - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + നിങ്ങളുടെ നിലവിലെ പേയ്‌മെൻ്റ് രീതി ഉപയോഗിച്ച് പുതുക്കാൻ കഴിയാത്തതിനാൽ നിങ്ങളുടെ ബാക്കപ്പ് പ്ലാൻ കാലഹരണപ്പെട്ടു. %1$d ദിവസത്തിന് ശേഷം, നിങ്ങളുടെ ബാക്കപ്പിലെ മീഡിയ ഇല്ലാതാക്കപ്പെടും. + നിങ്ങളുടെ നിലവിലെ പേയ്‌മെൻ്റ് രീതി ഉപയോഗിച്ച് പുതുക്കാൻ കഴിയാത്തതിനാൽ നിങ്ങളുടെ ബാക്കപ്പ് പ്ലാൻ കാലഹരണപ്പെട്ടു. %1$d ദിവസത്തിന് ശേഷം, നിങ്ങളുടെ ബാക്കപ്പിലെ മീഡിയ ഇല്ലാതാക്കപ്പെടും. നിങ്ങളുടെ എല്ലാ മീഡിയയും ബാക്കപ്പ് ചെയ്യുന്നത് തുടരാൻ നിങ്ങൾക്ക് എപ്പോൾ വേണമെങ്കിലും ബാക്കപ്പുകൾക്കായി വീണ്ടും പണമടച്ച് തുടങ്ങാം. @@ -7254,9 +7391,9 @@ നിങ്ങൾ \"ഒഴിവാക്കുക\" തിരഞ്ഞെടുത്താൽ, നിങ്ങളുടെ ബാക്കപ്പിലെ മീഡിയ %1$d ദിവസത്തിനുള്ളിൽ ഇല്ലാതാക്കപ്പെടും. - Your backups subscription failed to renew + നിങ്ങളുടെ ബാക്കപ്പ് സബ്‌സ്‌ക്രിപ്‌ഷൻ പുതുക്കാനായില്ല - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + നിങ്ങളുടെ പേയ്‌മെൻ്റ് രീതി അപ് ടു ഡേറ്റ് ആണെന്ന് ഉറപ്പാക്കാൻ പരിശോധിക്കുക. സബ്‌സ്‌ക്രിപ്‌ഷൻ മാനേജ് ചെയ്യുക ടാപ്പുചെയ്‌ത് പേയ്‌മെൻ്റ് രീതികൾക്ക് കീഴിൽ അപ്‌ഡേറ്റ് ടാപ്പ് ചെയ്യുക. ബാക്കപ്പ് പൂർത്തിയാക്കാൻ കഴിഞ്ഞില്ല @@ -7266,9 +7403,9 @@ ഒഴിവാക്കുക - സബ്‍സ്ക്രിപ്ഷൻ നിയന്ത്രിക്കുക + സബ്‍സ്ക്രിപ്ഷൻ മാനേജ് ചെയ്യുക - Subscribe for %1$s/month + പ്രതിമാസം %1$s/-ന് സബ്‌സ്‌ക്രൈബ് ചെയ്യുക മീഡിയ ഇപ്പോൾ ഡൗൺലോഡ് ചെയ്യുക @@ -7303,6 +7440,17 @@ %2$s ൽ %1$s + + + ഡൗൺലോഡ് റദ്ദാക്കുക + + ഡൗൺലോഡ് ചെയ്യുന്നു: %1$s / %2$s (%3$s%%) + + നിങ്ങളുടെ ബാക്കപ്പ് ഡൗൺലോഡ് ചെയ്യാൻ മതിയായ ഇടമില്ല. തുടരാൻ %1$s ഇടം ശൂന്യമാക്കുക. + + ഡൗൺലോഡ് ഒഴിവാക്കുക + + "നിങ്ങളുടെ അവസാന ബാക്കപ്പ് പൂർത്തിയാക്കാനായില്ല. നിങ്ങളുടെ ഫോൺ Wi-Fi-ലേക്ക് കണക്‌റ്റ് ചെയ്‌തിട്ടുണ്ടെന്ന് ഉറപ്പുവരുത്തുക, വീണ്ടും ശ്രമിക്കാൻ ഇപ്പോൾ ബാക്കപ്പ് ടാപ്പ് ചെയ്യുക." @@ -7356,18 +7504,18 @@ പണമടച്ചുള്ള Signal ബാക്കപ്പുകളിൽ മാത്രമേ സ്റ്റോറേജ് ഒപ്റ്റിമൈസേഷൻ ഉപയോഗിക്കാൻ കഴിയൂ. ഈ സവിശേഷത ഉപയോഗിച്ച് തുടങ്ങാൻ നിങ്ങളുടെ ബാക്കപ്പ് പ്ലാൻ അപ്‌ഗ്രേഡ് ചെയ്യുക. - Subscribe for %1$s/month + പ്രതിമാസം %1$s/-ന് സബ്‌സ്‌ക്രൈബ് ചെയ്യുക - This media is no longer available + ഈ മീഡിയ ഇനി ലഭ്യമല്ല - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + നിങ്ങളുടെ നിലവിലെ Signal ബാക്കപ്പ് പ്ലാനിൽ നിങ്ങളുടെ ഏറ്റവും പുതിയ %1$d ദിവസത്തെ മീഡിയ ഉൾപ്പെടുന്നു. നിങ്ങളുടെ എല്ലാ മീഡിയയും ബാക്കപ്പ് ചെയ്യാൻ തുടങ്ങാൻ, ഇപ്പോൾ അപ്‌ഗ്രേഡ് ചെയ്യുക. + നിങ്ങളുടെ നിലവിലെ Signal ബാക്കപ്പ് പ്ലാനിൽ നിങ്ങളുടെ ഏറ്റവും പുതിയ %1$d ദിവസത്തെ മീഡിയ ഉൾപ്പെടുന്നു. നിങ്ങളുടെ എല്ലാ മീഡിയയും ബാക്കപ്പ് ചെയ്യാൻ തുടങ്ങാൻ, ഇപ്പോൾ അപ്‌ഗ്രേഡ് ചെയ്യുക. - Subscribe for %1$s/month + പ്രതിമാസം %1$s/-ന് സബ്‌സ്‌ക്രൈബ് ചെയ്യുക ഇല്ലാതാക്കുന്നത് ഇപ്പോൾ നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും സമന്വയിപ്പിച്ചിരിക്കുന്നു @@ -7410,11 +7558,13 @@ ബാക്കപ്പ് തരം മാറ്റി, സബ്സ്ക്രിപ്ഷൻ റദ്ദാക്കി - സബ്‌സ്‌ക്രിപ്‌ഷൻ റദ്ദാക്കി + സബ്സ്ക്രിപ്ഷൻ റദ്ദാക്കി ഡൗൺലോഡ് പൂർത്തിയായി ഒറ്റരാത്രികൊണ്ട് ബാക്കപ്പ് സൃഷ്ടിക്കപ്പെടും. + + സബ്സ്ക്രിപ്ഷൻ നിഷ്‌ക്രിയമാണ് ബാക്കപ്പ് പ്ലാൻ @@ -7423,8 +7573,12 @@ %1$s/ മാസം നിങ്ങളുടെ ബാക്കപ്പ് പ്ലാൻ സൗജന്യമാണ് - + %1$s പുതുക്കുന്നു + + %1$s-ന് കാലഹരണപ്പെടുന്നു + + %1$s-ന് കാലഹരണപ്പെട്ടു നിങ്ങളുടെ സന്ദേശ ചരിത്രം ബാക്കപ്പ് ചെയ്യുക, അതുവഴി നിങ്ങൾക്ക് ഒരു പുതിയ ഫോൺ ലഭിക്കുമ്പോഴോ Molly വീണ്ടും ഇൻസ്റ്റാൾ ചെയ്യുമ്പോഴോ ഒരിക്കലും ഡാറ്റ നഷ്‌ടപ്പെടില്ല. @@ -7469,6 +7623,10 @@ സ്വമേധയാ ബാക്കപ്പ് ചെയ്യുക നിങ്ങളുടെ ഉപകരണ PIN, പാസ്‌വേഡ് അല്ലെങ്കിൽ പാറ്റേൺ നൽകുക. + + ബാക്കപ്പുകൾ വീണ്ടും പ്രവർത്തനക്ഷമമാക്കുക + + Signal-ൻ്റെ സുരക്ഷിത സംഭരണ സേവനത്തിൽ നിന്ന് ബാക്കപ്പുകൾ ഓഫാക്കി നിങ്ങളുടെ ഡാറ്റ ഇല്ലാതാക്കി. diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 2b479f1a61..a6bf6eb62a 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -365,6 +365,8 @@ चॅट्स संदेश + + चॅटचे प्रकार संदेश %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + आपण तयार आहात. आपला बॅकअप आत्ता सुरू करा. आपल्या बॅकअपच्या आकारावर अवलंबून, याला बराच वेळ लागू शकतो. बॅकअप घेत असताना आपण आपला फोन नेहमीप्रमाणे वापरू शकता. @@ -1966,6 +1968,7 @@ +%1$d आमंत्रित +%1$d आमंत्रित + %1$d अतिरिक्त गट %1$d अतिरिक्त गट @@ -1992,6 +1995,7 @@ कुठलेही डिव्हाईस सापडले नाही. नेटवर्क त्रुटी. अवैध QR कोड. + क्षमस्व, आपल्याकडे आधीपासून खूप सारे डिव्हाईस लिंक केलेले आहेत, काही काढून प्रयत्न करा क्षमस्व, हा एक वैध डिव्हाईस लिंक QR कोड नाही. एक Signal डिव्हाईस लिंक करायचा? @@ -2014,11 +2018,13 @@ पासफ्रेझ प्रविष्ट करा अवैध पासफ्रेझ! Molly अनलॉक करा + Molly Android - लॉक स्क्रीन नकाशा + पिन ड्रॉप करा पत्ता स्वीकारा @@ -2522,6 +2528,7 @@ Signal संदेश + अधिक @@ -2553,6 +2560,7 @@ कुठलेही स्थापन केलेले स्टिकर नाहीत येणाऱ्या संदेशांवरील स्टिकर येथे दिसतील. अशीर्षकांकित + अज्ञात @@ -2774,6 +2782,7 @@ मिडिया आता उपलब्ध नाही. मिडीया प्ले करण्यास असमर्थ. + संदेश शोधण्यात त्रुटी. हे मिडिया शेअर करण्यासाठी सक्षम असे अॅप सापडू शकले नाही. बंद करा @@ -2845,6 +2854,7 @@ संदेश कॉल + अपयश बॅकअप लॉक स्थिती @@ -2854,6 +2864,7 @@ अज्ञात व्हॉईस टिपा संपर्क Signal मध्ये सामील झाला + सूचना चॅनल सेटिंग उघडण्यासाठी कुठलीही अॅक्टिव्हिटी उपलब्ध नाही. बॅकग्राऊंड कनेकशन @@ -3638,10 +3649,12 @@ सर्व संदेश इतिहास सर्व डिव्हाइसेसवरून कायमस्वरूपी हटवले जाईल. ही क्रिया पूर्ववत केली जाऊ शकत नाही. सर्व आता हटवा + नेहमीसाठी 1 वर्ष 6 महिने 30 दिवस + कुठलेही नाही %1$s संदेश @@ -3666,6 +3679,7 @@ दाखवा रिंगटोन संदेश फाँट आकार + प्राधान्यता अधिसूचना समस्यानिवारण करा @@ -3894,6 +3908,7 @@ देणाऱ्याचा पत्ता QR कोड स्कॅन करा + विनंती पे करा उपलब्ध बॅलंस: %1$s @@ -4025,6 +4040,7 @@ आपण फक्त %1$d पर्यंत चॅट्स पिन करू शकता + संपर्क फोटो चित्र आर्काईव्ह केले @@ -4033,6 +4049,10 @@ नवीन चॅट कॅमेरा उघडा आतापर्यंत कुठेलही चॅट्स नाहीत.\nमित्राला संदेश पाठवून सुरू करा. + + दाखवण्यासाठी कोणतीही चॅट्स नाहीत + + फोल्डर सेटिंग्ज @@ -4265,6 +4285,7 @@ चॅट बॅकअप्स खाते स्थानांतरित करा नवीन Android डिव्हाइसवर खाते स्थानांतरित करा + बॅकअप पासफ्रेझ प्रविष्ट करा पुनर्स्थापना करा Signal च्या नवीन आवृत्त्यांवरून बॅकअप आयात करू शकत नाही @@ -4472,6 +4493,7 @@ Wi-Fi सेटिंग उघडण्यात अक्षम. कृपया Wi-Fi व्यक्तीचलितपणे चालू करा. + स्थान परवानगी मान्य करा स्थान सेवा चालू करा Wi-Fi चालू करा @@ -4725,6 +4747,7 @@ सामायिक करा + पाठवा , %1$s @@ -5028,6 +5051,119 @@ कीबोर्ड इंटर सह पाठवा + + चॅट फोल्डर्स + + एक चॅट फोल्डर समाविष्ट करा + + + + आपले चॅट्स फोल्डरमध्ये व्यवस्थित लावा आणि त्यांच्यादरम्यान आपल्या चॅट यादी वर पटकन स्विच करा. + + फोल्डर्स + + एक फोल्डर तयार करा + + सर्व चॅट्स + + सुचवलेले फोल्डर + + न वाचलेले संदेश + + सर्व चॅट्स मधून न वाचलेले संदेश + + 1:1 चॅट्स + + फक्त थेट चॅट्स मधील संदेश + + समूह + + फक्त सामूहिक चॅट्स मधील संदेश + + जोडा + + %1$s फोल्डर जोडला. + + फोल्डर संपादित करा + + फोल्डर हटवा + + नवीन फोल्डर समाविष्ट करा + + सर्व निःशब्द करा + + फोल्डर्सचा क्रम बदला + + सर्व वाचले म्हणून चिन्हांकित करा + + + %1$d चॅटचा प्रकार + %1$d चॅटचे प्रकार + + + + %1$d चॅट्स + %1$d चॅट्स + + + + %1$d चॅट वगळले + %1$d चॅट्स वगळली + + + + + एक फोल्डर तयार करा + + फोल्डरचे नाव (आवश्यक) + + समाविष्ट केलेली चॅट्स + + चॅट्स समाविष्ट करा + + आपणाला या फोल्डरमध्ये दिसायला हवी असणारी चॅट्स निवडा. + + अपवाद + + चॅट्स वगळा + + या फोल्डर मध्ये दिसू नये असे आपणाला वाटते अशी चॅट्स निवडा. + + फक्त न वाचलेली चॅट्स दाखवा + + सक्षम केल्यावर, या फोल्डरमध्ये फक्त न वाचलेले संदेश असणारी चॅट्स दिसतील. + + मूक केलेल्या चॅटचा समावेश करा + + तयार करा + + फोल्डर तयार करायचा? + + आपणाला चॅट फोल्डर \"%1$s\" तयार करायचा आहे का? + + फोल्डर तयार करा + + फोल्डर संपादित करा + + जतन करा + + बदल जतन करायचे का? + + आपणाला या चॅट फोल्डरमध्ये आपण केलेले बदल जतन करायचे आहेत का? + + बदल जतन करा + + टाकून द्या + + फोल्डर हटवा + + हा चॅट फोल्डर हटवायचा आहे? + + + + चॅटचे प्रकार + + झाले संदेश @@ -5112,6 +5248,7 @@ मिडिया दर्जा + मिडिया पाठवण्याचा दर्जा मिडिया पाठवताना उच्च दर्जा हा पर्याय निवडल्यास अधिक डेटा वापरला जाईल. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + आपली बॅकअप सदस्यता कालबाह्य झाली आहे - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + आपला बॅकअप प्लॅन कालबाह्य झाला आहे कारण आपल्या वर्तमान पेमेंट पद्धतीने त्याचे नूतनीकरण झालेले नाही. %1$d दिवसानंतर, आपल्या बॅकअप मधील मिडीया हटवण्यात येईल. + आपला बॅकअप प्लॅन कालबाह्य झाला आहे कारण आपल्या वर्तमान पेमेंट पद्धतीने त्याचे नूतनीकरण झालेले नाही. %1$d दिवसांनंतर, आपल्या बॅकअप मधील मिडीया हटवण्यात येईल. आपला सर्व मिडीयाचा बॅकअप घेणे सुरू ठेवण्यासाठी आपण कोणत्याही वेळी बॅकअपसाठी पुहा पैसे देणे सुरू करू शकता. @@ -7254,9 +7391,9 @@ आपण जर आपल्या बॅकअपमध्ये मिडीया \"वगळा\" निवडल्यास मिडीया %1$d दिवसांत हटवले जाईल. - Your backups subscription failed to renew + आपल्या बॅकअप सदस्यत्वाचे नूतनीकरण अयशस्वी झाले - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + खात्री करण्यासाठी आपली पेमेंट पद्धत अद्ययावत असल्याचे तपासा. सदस्यत्व व्यवस्थापित करा वर टॅप करा आणि पेमेंट पद्धतींमध्ये अद्यतनित करा वर टॅप करा. बॅकअप पूर्ण करू शकत नाही @@ -7268,7 +7405,7 @@ सदस्यत्व व्यवस्थापित करा - Subscribe for %1$s/month + %1$s/महिना सदस्यता आत्ता मिडीया डाउनलोड करा @@ -7303,6 +7440,17 @@ %1$s पैकी %2$s + + + डाउनलोड रद्द करा + + डाउनलोड होत आहे: %2$s पैकी %1$s (%3$s%%) + + आपला बॅकअप डाउनलोड करण्यासाठी पुरेशी जागा उपलब्ध नाही. पुढे सुरू ठेवण्यासाठी %1$s जागा मोकळी करा. + + डाउनलोड वगळा + + "आपला शेवटचा बॅकअप पूर्ण होऊ शकला नाही. आपला फोन Wi-Fi शी कनेक्ट झाला असल्याची खात्री करा आणि पुन्हा प्रयत्न करण्यासाठी आत्ता बॅकअप घ्या वर टॅप करा." @@ -7356,18 +7504,18 @@ संग्रहण सानुूलन फक्त Signal बॅकअपच्या सशुल्क टायरसह वापरले जाऊ शकते. हे वैशिष्ट्य वापरणे सुरू करण्यासाठी आपला बॅकअप प्लॅन अपग्रेड करा. - Subscribe for %1$s/month + %1$s/महिना सदस्यता - This media is no longer available + हा मिडीया यापुढे उपलब्ध नाही - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + आपल्या वर्तमान Signal बॅकअप प्लॅनमध्ये आपल्या सर्वात अलीकडील %1$d दिवसाच्या मिडीयाचा समावेश आहे. आपल्या सर्व मिडीयाचा बॅकअप घेणे सुरू करण्यासाठी, आत्ता अपग्रेड करा. + आपल्या वर्तमान Signal बॅकअप प्लॅनमध्ये आपल्या सर्वात अलीकडील %1$d दिवसांच्या मिडीयाचा समावेश आहे. आपल्या सर्व मिडीयाचा बॅकअप घेणे सुरू करण्यासाठी, आत्ता अपग्रेड करा. - Subscribe for %1$s/month + %1$s/महिना सदस्यता हटवणे आता आपल्या सर्व डिव्हाइसेसवरून संकालित केले आहे @@ -7410,11 +7558,13 @@ बॅकअप प्रकार बदलला आणि सदस्यत्व रद्द केले - सब्स्क्रिप्शन रद्द केले + सदस्यत्व रद्द केले डाउनलोड पूर्ण झाले रात्रभर बॅकअप तयार केला जाईल. + + सदस्यत्व सक्रिय नाही बॅकअप प्लॅन @@ -7423,8 +7573,12 @@ %1$s/महिना आपला बॅकअप प्लॅन मोफत आहे - + %1$s नी नूतनीकरण केले + + %1$s ला कालबाह्य होईल + + %1$s ला कालबाह्य झाले आपल्या संदेश इतिहास चा बॅकअप घ्या ज्यामुळे आपण जेव्हा नवीन फोन घ्याल किंवा Molly पुन्हा इन्स्टॉल कराल तेव्हा आपण कधीही आपला डेटा गमावणार नाही. @@ -7469,6 +7623,10 @@ मॅन्युअली बॅक अप कृपया आपली डिव्हाइस पिन, पासवर्ड किंवा पॅटर्न प्रविष्ट करा. + + बॅकअप पुन्हा सक्षम करा + + बॅकअप बंद करण्यात आलेले आहेत आणि आपला डेटा Signal च्या सुरक्षित संग्रहण सेवेमधून हटवण्यात आला आहे. diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 37abf1fe1d..5e2b6dc7c1 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -362,6 +362,8 @@ Sembang Mesej + + Jenis sembang Mesej %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + Anda sudah bersedia. Mulakan sandaran anda sekarang. Bergantung pada saiz sandaran anda, ini mungkin mengambil masa yang lama. Anda boleh menggunakan telefon anda seperti biasa semasa sandaran dilakukan. @@ -1905,6 +1907,7 @@ +%1$d dijemput + %1$d kumpulan tambahan @@ -1930,6 +1933,7 @@ Tiada peranti dijumpai. Ralat rangkaian. Kod QR tidak sah. + Maaf, anda mempunyai terlalu banyak peranti dipautkan, cuba alih keluar beberapa Maaf, ini bukan kod QR pautan peranti yang sah. Memautkan satu peranti Signal? @@ -1951,11 +1955,13 @@ Hantar frasa laluan Frasa laluan tidak sah! Buka Molly + Molly Android - Kunci Skrin Peta + Letakkan pin Terima alamat @@ -2437,6 +2443,7 @@ Mesej Signal + Lagi @@ -2468,6 +2475,7 @@ Tiada pelekat dipasang Pelekat daripada mesej masuk akan muncul di sini Tiada tajuk + Tidak diketahui @@ -2688,6 +2696,7 @@ Media tidak lagi tersedia. Tidak dapat memainkan media. + Ralat mencari mesej. Tidak menemui aplikasi yang dapat kongsikan media ini. Tutup @@ -2757,6 +2766,7 @@ Mesej Panggilan + Kegagalan Sandaran Status kunci @@ -2766,6 +2776,7 @@ Tidak diketahui Nota Suara Kenalan menyertai Signal + Tidak ada aktiviti yang tersedia untuk membuka tetapan pemberitahuan. Sambungan latar belakang @@ -3537,10 +3548,12 @@ Semua sejarah mesej akan dialih keluar secara kekal daripada semua peranti. Tindakan ini tidak boleh dibatalkan. Padam semua sekarang + Selama-lamanya 1 tahun 6 bulan 30 hari + Tiada %1$s mesej @@ -3564,6 +3577,7 @@ Papar Nada dering Saiz huruf mesej + Keutamaan Pemberitahuan Menyelesaikan Masalah @@ -3792,6 +3806,7 @@ Imbas kod QR alamat penerima pembayaran + Permintaan Bayar Baki yang tersedia: %1$s @@ -3922,6 +3937,7 @@ Anda hanya boleh pin sebanyak %1$d sembang + Imej Foto Kenalan Diarkib @@ -3930,6 +3946,10 @@ Sembang baharu Buka Kamera Belum ada sembang.\nMulakan dengan menghantar mesej kepada rakan. + + Tiada sembang untuk dipaparkan + + Tetapan folder @@ -4154,6 +4174,7 @@ Sandaran sembang Pindahkan akaun Pindahkan akaun ke peranti Android baharu + Masukkan frasa laluan sandaran Memulihkan Sandaran tak dapat diimport daripada versi Signal baru @@ -4361,6 +4382,7 @@ Tidak dapat membuka Tetapan Wi-Fi. Sila hidupkan Wi-Fi secara manual. + Berikan kebenaran lokasi Hidupkan perkhidmatan lokasi Hidupkan Wi-Fi @@ -4607,6 +4629,7 @@ Kongsi + Hantar , %1$s @@ -4909,6 +4932,116 @@ Papan Kekunci Hantar dengan masukkan + + Folder sembang + + Tambahkan folder sembang + + + + Susun sembang anda ke dalam folder dan tukar antara sembang tersebut dengan cepat pada senarai sembang anda. + + Folder + + Cipta folder + + Semua sembang + + Folder yang dicadangkan + + Belum dibaca + + Mesej yang belum dibaca daripada semua sembang + + Sembang 1:1 + + Hanya mesej daripada sembang langsung + + Kumpulan + + Hanya mesej daripada sembang kumpulan + + Tambah + + %1$s folder ditambah. + + Edit folder + + Padam folder + + Tambah folder baharu + + Redam semua + + Susun semula folder + + Tandakan semua dibaca + + + %1$d jenis sembang + + + + %1$d sembang + + + + %1$d sembang dikecualikan + + + + + Cipta folder + + Nama folder (diperlukan) + + Sembang yang disertakan + + Tambah sembang + + Pilih sembang yang ingin dipaparkan dalam folder ini. + + Pengecualian + + Kecualikan sembang + + Pilih sembang yang anda tidak mahu muncul dalam folder ini. + + Hanya tunjukkan sembang yang belum dibaca + + Apabila didayakan, hanya sembang dengan mesej yang belum dibaca akan ditunjukkan dalam folder ini. + + Sertakan Sembang yang Diredam + + Cipta + + Cipta folder? + + Adakah anda mahu mencipta folder sembang \"%1$s\"? + + Cipta folder + + Edit folder + + Simpan + + Simpan perubahan? + + Adakah anda mahu menyimpan perubahan yang telah dibuat pada folder sembang ini? + + Simpan perubahan + + Buang + + Padam folder + + Padamkan folder sembang ini? + + + + Jenis sembang + + Selesai Mesej @@ -4992,6 +5125,7 @@ Kualiti media + Kualiti media yang dihantar Menghantar media berkualiti tinggi akan menggunakan lebih banyak data. @@ -7076,10 +7210,10 @@ - Your backups subscription expired + Langganan sandaran anda telah tamat tempoh - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Pelan sandaran anda telah tamat tempoh kerana ia tidak dapat diperbaharui dengan kaedah pembayaran semasa anda. Selepas %1$d hari, media dalam sandaran anda akan dipadam. Anda boleh mula membayar untuk sandaran semula pada bila-bila masa untuk terus membuat sandaran semua media anda. @@ -7096,9 +7230,9 @@ Jika anda pilih \"Langkau\", media dalam sandaran anda akan dipadamkan dalam masa %1$d hari. - Your backups subscription failed to renew + Langganan sandaran anda gagal diperbaharui - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Semak untuk pastikan kaedah pembayaran anda adalah terkini. Ketik Urus langganan dan di bawah Kaedah pembayaran, ketik Kemas Kini. Tidak dapat melengkapkan sandaran @@ -7110,7 +7244,7 @@ Urus langganan - Subscribe for %1$s/month + Langgan dengan %1$s/bulan Muat turun media sekarang @@ -7145,6 +7279,17 @@ %1$s daripada %2$s + + + Batalkan muat turun + + Memuat turun: %1$s daripada %2$s (%3$s%%) + + Tidak cukup ruang untuk memuat turun Sandaran anda. Untuk meneruskan, kosongkan %1$s ruang. + + Langkau muat turun + + "Sandaran terakhir anda tidak dapat diselesaikan. Pastikan telefon anda disambungkan ke Wi-Fi dan ketik Sandarkan sekarang untuk mencuba lagi." @@ -7198,17 +7343,17 @@ Pengoptimuman storan hanya boleh digunakan dengan Sandaran Signal berbayar. Naik taraf pelan sandaran anda untuk mula menggunakan ciri ini. - Subscribe for %1$s/month + Langgan dengan %1$s/bulan - This media is no longer available + Media ini tidak lagi tersedia - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Pelan sandaran Signal semasa anda termasuk %1$d hari media terkini anda. Untuk mula membuat sandaran semua media anda, naik taraf sekarang. - Subscribe for %1$s/month + Langgan dengan %1$s/bulan Pemadaman kini disegerakkan merentas semua peranti anda @@ -7256,6 +7401,8 @@ Muat turun selesai Sandaran akan dibuat semalaman. + + Langganan tidak aktif Pelan sandaran @@ -7264,8 +7411,12 @@ %1$s/bulan Pelan sandaran anda adalah percuma - + Memperbaharui %1$s + + Tamat tempoh pada %1$s + + Tamat tempoh pada %1$s Sandarkan sejarah mesej anda supaya anda tidak kehilangan data apabila menggunakan telefon baharu atau memasang semula Molly. @@ -7310,6 +7461,10 @@ Buat sandaran secara manual Sila masukkan pin, kata laluan atau corak peranti anda. + + Dayakan semula sandaran + + Sandaran telah dimatikan dan data anda telah dipadamkan daripada perkhidmatan storan selamat Signal. diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 9d6a65b4dc..977f9203c7 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -362,6 +362,8 @@ ချက်(တ်)များ မက်ဆေ့ချ်များ + + ချက်(တ်)အမျိုးအစားများ စာတို %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + အားလုံး ပြင်ဆင်ပြီးပါပြီ။ ယခု စတင် ဘက်ခ်အပ်လုပ်ပါ။ သင်၏ ဘက်ခ်အပ်အရွယ်အစားပေါ် မူတည်၍ အချိန်ကြာမြင့်နိုင်သည်။ ဘက်ခ်အပ်လုပ်နေစဉ်တွင် သင်သည် ပုံမှန်အတိုင်း သင့်ဖုန်းကို အသုံးပြုနိုင်သည်။ @@ -1905,6 +1907,7 @@ +%1$d ဦး ဖိတ်ထားပြီး + %1$d နောက်ထပ်အဖွဲ့များ @@ -1930,6 +1933,7 @@ ဘာစက်မှမတွေ့ပါ ကွန်ယက်မှားနေသည် QR code မှားနေသည်။ + သင့်ဖုန်းဖြင့် ချိတ်ဆက်ထားသော ဖုန်းများ များနေသည်။ အချို့ချိတ်ဆက်မှုများအား ဖယ်လိုက်ပါ။ ဝမ်းနည်းပါတယ်။ QR ကုဒ်မှားနေသည်။ Signal အသုံးပြုသော ဖုန်းအားချိတ်မည်။ @@ -1951,11 +1955,13 @@ စကားဝှက် တင်သွင်းပါ စကားဝှက် မှားနေသည် Molly ကို ပြန်ဖွင့်ပါ + Molly Android - သော့ခတ် စကင်ရင် မြေပုံ + ပင်ချမယ် လိပ်စာလက်ခံပါ @@ -2437,6 +2443,7 @@ Signal မက်ဆေ့ချ် + နောက်ထပ် @@ -2468,6 +2475,7 @@ စတစ်ကာများ မတပ်ဆင်ထားပါ အဝင်မက်ဆေ့ခ်ျများမှ စတစ်ကာများသည် ၎င်းနေရာတွင် ပေါ်ပါမည် ခေါင်းစဉ်မဲ့ + မသိ @@ -2688,6 +2696,7 @@ မီဒီယာမရှိတော့ပါ မီဒီယာ ဖွင့်၍ မရနိုင်ပါ။ + မက်ဆေ့ချ် ရှာဖွေမှု ချို့ယွင်းချက်။ ဤမီဒီယာကို ဝေမျှနိုင်သော အပ္ပလီကေးရှင်း မတွေ့ရှိပါ။ ပိတ်မယ် @@ -2757,6 +2766,7 @@ မက်ဆေ့ချ်များ ဖုန်းခေါ်ဆိုမှုများ + ပျက်ကွက်မှုများ အရန်သိမ်းဆည်းမှုများ သော့ခတ် အခြေအနေ @@ -2766,6 +2776,7 @@ မသိ အသံမှတ်စုများ အဆက်အသွယ်သည် Signal ပေါ်တက်ရောက်လာပါပြီ + အသိပေးချက်လိုင်း၏ အပြင်အဆင်များကို ဖွင့်ရန် လှုပ်ရှားမှုမရှိပါ။ နောက်ကွယ်၌ ချိတ်ဆက်မှု @@ -3537,10 +3548,12 @@ မက်ဆေ့ချ်မှတ်တမ်းအားလုံးကို စက်အားလုံးမှ အပြီးတိုင် ဖယ်ရှားလိုက်ပါမည်။ ဤလုပ်ဆောင်ချက်ကို ပြန်ရုပ်သိမ်း၍ မရနိုင်ပါ။ အားလုံးကို ယခု ဖျက်ရန် + အမြဲတမ်း 1 နှစ် 6 လ ရက်ပေါင်း ၃၀ + ဘယ်ဟာမျှမဟုတ်သော မက်ဆေ့ချ် %1$s စောင် @@ -3564,6 +3577,7 @@ ပြပါ ဖုန်းသံစဉ်များ စာလုံးအရွယ်အစား + ဦးစားပေး အသိပေးချက်များအား ပြဿနာဖြေရှင်းရန် @@ -3792,6 +3806,7 @@ ငွေပေးရမည့်သူ၏ QR ကုဒ်လိပ်စာ ကို စကင်ဖတ်မယ် + တောင်းခံ ပေးဆောင်ပါ ရရှိနိုင်သော လက်ကျန်ငွေ - %1$s @@ -3922,6 +3937,7 @@ ချက်(တ်) %1$d ခုထိသာ ပင်တွဲ၍ရပါသည် + အဆက်အသွယ်၏ ရုပ်ပုံ မှတ်တမ်းသိမ်းပြီး @@ -3930,6 +3946,10 @@ ချက်(တ်)အသစ် ကင်မရာဖွင့်ပါ ချက်(တ်)မရှိသေးပါ။\nသူငယ်ချင်းတစ်ယောက်ထံ မက်ဆေ့ချ်ပို့ခြင်းဖြင့် စတင်လိုက်ပါ။ + + ပြသရန် ချက်(တ်)မရှိပါ + + ဖိုင်တွဲ ဆက်တင် @@ -4154,6 +4174,7 @@ ချက်(တ်) အရန်သိမ်းဆည်းမှုများ အကောင့်လွှဲမယ် သင့် Android စက်အသစ်ပေါ်သို့ အကောင့်လွှဲပြောင်းမယ် + အရန်သိမ်းဆည်းမှုအတွက် စကားဝှက် ထည့်ပါ ပြန်ရယူမယ် Signal ဗားရှင်းအသစ်များမှ အရန်သိမ်းဆည်းမှုများထည့်၍မရပါ @@ -4361,6 +4382,7 @@ ဝိုင်ဖိုင်အပြင်အဆင်များ ဖွင့်ရန်မရပါ။ ကျေးဇူးပြု၍ ဝိုင်ဖိုင်အား ကိုယ်တိုင်ဖွင့်ပေးပါ။ + တည်နေရာဝန်ဆောင်မှုအသုံးပြုရန် ခွင့်ပေးပါ တည်နေရာဝန်ဆောင်မှုများ ဖွင့်မယ် ဝိုင်ဖိုင်ဖွင့်မယ် @@ -4607,6 +4629,7 @@ ဝေမျှမည် + ပေးပို့မည် ၊ %1$s @@ -4909,6 +4932,116 @@ ကီးဘုတ် Enter ဖြင့် ပို့ပါ + + ချက်(တ်)ဖိုင်တွဲများ + + ချက်(တ်)ဖိုင်တွဲတစ်ခုထည့်ရန် + + + + သင့်ချက်(တ်)များကို ဖိုင်တွဲများတွင် စုစည်းပြီး သင့်ချက်(တ်)စာရင်းတွင် အမြန်ပြောင်းပါ။ + + ဖိုင်တွဲများ + + ဖိုင်တွဲတစ်ခု ဖန်တီးရန် + + ချက်(တ်)အားလုံး + + အကြံပြုထားသောဖိုင်တွဲများ + + မဖတ်ရသေး + + ချက်(တ်)အားလုံးမှ မဖတ်ရသေးသော မက်ဆေ့ချ်များ + + 1:1 ချက်(တ်)များ + + တိုက်ရိုက်ချက်(တ်)မှ မက်ဆေ့ချ်များသာ + + အဖွဲ့များ + + အဖွဲ့လိုက်ချက်(တ်)မှ မက်ဆေ့ချ်များသာ + + ပေါင်းထည့်မည် + + %1$s ဖိုင်တွဲကို ထည့်ထားသည်။ + + ဖိုင်တွဲကို တည်းဖြတ်ရန် + + ဖိုင်တွဲကိုဖျက်မည် + + ဖိုင်တွဲအသစ်ထည့်မည် + + အားလုံးကို အသံပိတ်ရန် + + ဖိုင်တွဲများကို ပြန်စီမည် + + အားလုံးကို ဖတ်ပြီးသားအဖြစ် မှတ်ပါ + + + ချက်(တ်)အမျိုးအစား %1$d ခု + + + + ချက်(တ်) %1$d ခု + + + + ချက်(တ်) %1$d ခုကို ဖယ်ထုတ်ထားသည် + + + + + ဖိုင်တွဲတစ်ခု ဖန်တီးရန် + + ဖိုင်တွဲအမည် (လိုအပ်ပါသည်) + + ပါဝင်သော ချက်(တ်)များ + + ချက်(တ်)ထည့်သွင်းရန် + + ဤဖိုင်တွဲတွင် သင်ပေါ်စေလိုသော ချက်(တ်)များကို ရွေးပါ။ + + ခြွင်းချက်များ + + ချက်(တ်)ကို ဖယ်ထုတ်မည် + + ဤဖိုင်တွဲတွင် မပေါ်စေလိုသော ချက်(တ်)များကို ရွေးပါ။ + + မဖတ်ရသေးသည့် ချက်(တ်)များကိုသာပြရန် + + ဖွင့်ထားသောအခါ မဖတ်ရသေးသော မက်ဆေ့ချ်ရှိသည့် ချက်(တ်)များကိုသာ ဤဖိုင်တွဲတွင် ပြပါမည်။ + + အသံပိတ်ထားသော ချက်(တ်)များ ပါဝင်ရန် + + ဖန်တီးပါ + + ဖိုင်တွဲကို ဖန်တီးမလား။ + + ချက်(တ်)ဖိုင်တွဲ \"%1$s\" ကို ဖန်တီးလိုပါသလား။ + + ဖိုင်တွဲ ဖန်တီးမည် + + ဖိုင်တွဲကို တည်းဖြတ်ရန် + + သိမ်းရန် + + အပြောင်းအလဲကို သိမ်းမလား။ + + ဤချက်(တ်)ဖိုင်တွဲတွင် ပြုလုပ်ထားသော အပြောင်းအလဲများကို သိမ်းဆည်းလိုပါသလား။ + + အပြောင်းအလဲကို သိမ်းဆည်းမည် + + ပယ်ဖျက်မည် + + ဖိုင်တွဲကိုဖျက်မည် + + ဤချက်(တ်)ဖိုင်တွဲကို ဖျက်မလား။ + + + + ချက်(တ်)အမျိုးအစားများ + + ပြီးပါပြီ မက်ဆေ့ချ်များ @@ -4992,6 +5125,7 @@ ဓာတ်ပုံ အရည်အသွေး + မီဒီယာ အရည်အသွေး ပို့ပြီး အရည်အသွေးမြင့်သည့် မီဒီယာဖိုင်ကို ပို့လျှင် ဒေတာ ပိုသုံးပါလိမ့်မည်။ @@ -7076,10 +7210,10 @@ - Your backups subscription expired + သင့်ပုံမှန်လှူဒါန်းမှု သက်တမ်းကုန်သွားပါပြီ - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + သင်၏ လက်ရှိငွေပေးချေမှုနည်းလမ်းဖြင့် သက်တမ်းတိုးမရနိုင်သောကြောင့် သင်၏ ဘက်ခ်အပ်အစီအစဉ် သက်တမ်းကုန်သွားပါပြီ။ %1$d ရက်အကြာတွင် သင် ဘက်ခ်အပ်လုပ်ထားသော မီဒီယာကို ဖျက်လိုက်ပါမည်။ သင်၏မီဒီယာအားလုံးကို ဆက်လက်ဘက်ခ်အပ်လုပ်ရန် ဘက်ခ်အပ်လုပ်ခြင်းများအတွက် အချိန်မရွေး ထပ်မံငွေပေးချေနိုင်ပါသည်။ @@ -7096,9 +7230,9 @@ \"ကျော်မည်\" ကို ရွေးချယ်ပါက သင်ဘက်ခ်အပ်လုပ်ထားသော မီဒီယာကို %1$d ရက်အတွင်း ဖျက်ပစ်ပါမည်။ - Your backups subscription failed to renew + သင်၏ ဘက်ခ်အပ် ပုံမှန်လှူဒါန်းငွေ သက်တမ်းတိုးမှု မအောင်မြင်ပါ - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + သင်၏ ငွေပေးချေမှုနည်းလမ်းသည် အပ်ဒိတ်ဖြစ်ကြောင်း သေချာပါစေ။ ပုံမှန်လှူဒါန်းငွေကို စီမံရန် နှိပ်ပြီး ငွေပေးချေမှုနည်းလမ်းများအောက်တွင် အပ်ဒိတ်လုပ်မည် ကိုနှိပ်ပါ။ ဘက်ခ်အပ်လုပ်ခြင်းကို အပြီးသတ်၍မရပါ။ @@ -7110,7 +7244,7 @@ ပုံမှန်လှူဒါန်းငွေကို စီမံရန် - Subscribe for %1$s/month + ၁ လ %1$s ပုံမှန်လှူဒါန်းပါ မီဒီယာကို ယခုဒေါင်းလုဒ်လုပ်ပါ @@ -7145,6 +7279,17 @@ %1$s ၏ %2$s + + + ဒေါင်းလုဒ်လုပ်ခြင်း ပယ်ဖျက်မည် + + %2$s မှ %1$s (%3$s%%) ကို ဒေါင်းလုဒ်လုပ်နေသည် + + သင်၏ ဘက်ခ်အပ်ကို ဒေါင်းလုဒ်လုပ်ရန် နေရာမလုံလောက်ပါ။ ဆက်၍လုပ်ဆောင်ရန် နေရာလွတ် %1$s ထားပေးပါ။ + + ဒေါင်းလုဒ်ကို ကျော်လိုက်မည် + + "သင်၏နောက်ဆုံး ဘက်ခ်အပ်ကို မပြီးမြောက်နိုင်ပါ။ သင့်ဖုန်းကို Wi-Fi နှင့် ချိတ်ဆက်ထားကြောင်းသေချာစေပြီး ထပ်၍စမ်းကြည့်ရန် ယခုဘက်ခ်အပ်လုပ်မည်ကို နှိပ်ပါ။" @@ -7198,17 +7343,17 @@ သိုလှောင်မှု အကောင်းဆုံးချိန်ညှိခြင်းကို Signal Backups ၏ အခပေးအဆင့်ဖြင့်သာ အသုံးပြုနိုင်သည်။ ဤအင်္ဂါရပ်ကို စတင်အသုံးပြုရန် သင်၏ ဘက်ခ်အပ်အစီအစဉ်ကို အဆင့်မြှင့်တင်ပါ။ - Subscribe for %1$s/month + ၁ လ %1$s ပုံမှန်လှူဒါန်းရန် - This media is no longer available + ဤမီဒီယာမရှိတော့ပါ - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + သင်၏ လက်ရှိ Signal ဘက်ခ်အပ်အစီအစဉ်တွင် သင်၏ လတ်တလော မီဒီယာ %1$d ရက် ပါဝင်သည်။ သင့်မီဒီယာအားလုံးကို စတင်ဘက်ခ်အပ်လုပ်ရန် ယခု အဆင့်မြှင့်ပါ။ - Subscribe for %1$s/month + ၁ လ %1$s ပုံမှန်လှူဒါန်းရန် ယခုအခါ သင့်စက်များအားလုံးတွင် ချိန်ကိုက်ပြီး ဖျက်နေပါပြီ @@ -7256,6 +7401,8 @@ ဒေါင်းလုဒ် ပြီးပါပြီ ဘက်ခ်အပ်ကို ညတွင်းချင်း ဖန်တီးပါမည်။ + + ပုံမှန်လှူဒါန်းမှု အသက်မဝင်ပါ ဘက်ခ်အပ်အစီအစဉ် @@ -7264,8 +7411,12 @@ တစ်လလျှင် %1$s သင်၏ ဘက်ခ်အပ်အစီအစဉ်သည် အခမဲ့ဖြစ်သည် - + %1$s တွင် သက်တမ်းတိုးသည် + + %1$s တွင် သက်တမ်းကုန်မည် + + %1$s တွင် သက်တမ်းကုန်မည် ဖုန်းအသစ်ရသောအခါ သို့မဟုတ် Molly ကို ပြန်လည်ထည့်သွင်းသည့်အခါ ဒေတာမဆုံးရှုံးစေရန် မက်ဆေ့ချ်မှတ်တမ်းကို ဘက်ခ်အပ်လုပ်ပါ။ @@ -7310,6 +7461,10 @@ လူကိုယ်တိုင် ဘက်ခ်အပ် သင့်စက်၏ ပင်နံပါတ်၊ စကားဝှက် သို့မဟုတ် ပုံစံကို ထည့်ပါ။ + + ဘက်ခ်အပ် ပြန်လည်လုပ်ဆောင်မည် + + ဘက်ခ်အပ်ကို ပိတ်ထားသဖြင့် Signal ၏ လုံခြုံသော သိုလှောင်ရေးဝန်ဆောင်မှုမှ သင့်ဒေတာများကို ဖျက်လိုက်ပါပြီ။ diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index caae6aec17..22554b0cd4 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -365,6 +365,8 @@ Samtaler Meldinger + + Samtaletyper Melding %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Alt er klart. Du kan nå sikkerhetskopiere filene dine. Dette kan ta en stund, avhengig av størrelsen på sikkerhetskopien. Du kan bruke telefonen som normalt mens sikkerhetskopieringen pågår. @@ -1966,6 +1968,7 @@ +%1$d inviterte +%1$d inviterte + %1$d ytterlig gruppe %1$d ytterligere grupper @@ -1992,6 +1995,7 @@ Fant ingen enhet. Nettverksfeil. Ugyldig QR-kode. + Du har koblet sammen sammen for mange enheter allerede. Prøv å fjerne noen Dette er ikke en gyldig QR-kode for enhetstilkobling. Vil du koble til en Signal-enhet? @@ -2014,11 +2018,13 @@ Send inn passord Ugyldig passord! Lås opp Molly + Molly Android - Skjermlås Kart + Slipp nål Godta adresse @@ -2522,6 +2528,7 @@ Signal-melding + Mer @@ -2553,6 +2560,7 @@ Ingen klistremerker installert Klistremerker fra innkommende meldinger vises her Uten navn + Ukjent @@ -2774,6 +2782,7 @@ Media er ikke lenger tilgjengelig. Kan ikke spille av videoen. + Kunne ikke finne meldingen. Kan ikke finne app som er i stand til å dele dette mediet. Lukk @@ -2845,6 +2854,7 @@ Meldinger Samtaler + Feil Sikkerhetskopiering Lås status @@ -2854,6 +2864,7 @@ Ukjent Talenotater Når kontakt installerer Signal + No activity available to open notification channel settings. Bakgrunnstilkobling @@ -3638,10 +3649,12 @@ Alle meldingslogger slettes permanent fra alle enheter. Dette kan ikke angres. Slett alt nå + For alltid 1 år 6 Måneder 30 Dager + Ingen %1$s melding @@ -3666,6 +3679,7 @@ Vis Ringetone Skriftstørrelse i meldinger + Prioritet Kjør feilsøking av varsler @@ -3894,6 +3908,7 @@ Skann QR-koden for adressen til betaleren + Forespør Betal Tilgjengelig saldo: %1$s @@ -4025,6 +4040,7 @@ Du kan bare feste opp til %1$dsamtaler + Kontaktfoto Arkivert @@ -4033,6 +4049,10 @@ Ny samtale Åpne Kamera Ingen samtaler enda.\nKom i gang ved å sende en melding til en venn. + + Ingen samtaler å vise + + Mappeinnstillinger @@ -4265,6 +4285,7 @@ Sikkerhetskopi av samtaler Overfør konto Overfør konto til ny Android-enhet + Skriv inn passordfrase for sikkerhetskopi Gjenopprett Kan ikke importere backuper fra nyere Signal-versjoner @@ -4472,6 +4493,7 @@ Kunne ikke åpne Wi-Fi-innstillinger. Vennligst skru på Wi-Fi manuelt. + Gi posisjonstillatelsen Skru på lokasjonstjenester Skru på Wi-Fi @@ -4725,6 +4747,7 @@ Del + Send , %1$s @@ -5028,6 +5051,119 @@ Tastatur Send med Enter-knappen + + Samtalemapper + + Legg til en samtalemappe + + + + Sorter samtalene dine i mapper og hopp kjapt og enkelt mellom mappene i samtalelisten. + + Mapper + + Opprett en mappe + + Alle samtaler + + Foreslåtte mapper + + Uleste meldinger + + Uleste meldinger fra alle samtaler + + En-til-en-samtaler + + Kun meldinger fra en-til-en-samtaler + + Gruppesamtaler + + Kun meldinger fra gruppesamtaler + + Legg til + + %1$s mappe ble lagt til. + + Rediger mappe + + Slett mappe + + Legg til mappe + + Demp alle + + Endre mapperekkefølge + + Merk alle som lest + + + %1$d samtaletype + %1$d samtaletyper + + + + %1$d samtale + %1$d samtaler + + + + %1$d samtale ekskludert + %1$d samtaler ekskludert + + + + + Opprett en mappe + + Mappenavn (påkrevd) + + Inkluderte samtaler + + Legg til samtaler + + Velg hvilke samtaler du ønsker å legge til i mappen. + + Unntak + + Ekskluder samtaler + + Velg hvilke samtaler du ikke ønsker å legge til i mappen. + + Vis kun uleste samtaler + + Kun samtaler med uleste meldinger vises i denne mappen. + + Inkluder dempede samtaler + + Opprett + + Vil du opprette en mappe? + + Vil du opprette mappen «%1$s»? + + Opprett mappe + + Rediger mappe + + Lagre + + Vil du lagre endringene? + + Vil du lagre endringene du har gjort i denne samtalemappen? + + Lagre endringene + + Forkast + + Slett mappe + + Vil du slette denne mappen? + + + + Samtaletyper + + Ferdig Meldinger @@ -5112,6 +5248,7 @@ Mediekvalitet + Sendt mediekvalitet Å sende høykvalitetsmedier vil bruke mer data. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Abonnementet på sikkerhetskopiering har utløpt - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Abonnementet ditt på sikkerhetskopiering kunne ikke fornyes med den valgte betalingsmåten. Mediefilene som er sikkerhetskopiert i appen, slettes om %1$d dag. + Abonnementet ditt på sikkerhetskopiering kunne ikke fornyes med den valgte betalingsmåten. Mediefilene som er sikkerhetskopiert i appen, slettes om %1$d dager. Du kan reaktivere abonnementet når som helst ved å betale abonnementsprisen. @@ -7254,9 +7391,9 @@ Hvis du velger å hoppe over mediefilene i sikkerhetskopien, slettes de om %1$d dager. - Your backups subscription failed to renew + Abonnementet på sikkerhetskopiering kunne ikke fornyes - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Sjekk om betalingsmåten din er oppdatert. Trykk på «Administrer abonnement» og velg «Oppdater» under «Betalingsmåter». Sikkerhetskopiering kunne ikke fullføres @@ -7268,7 +7405,7 @@ Administrer abonnement - Subscribe for %1$s/month + Bli abonnent for %1$s/måned Last ned mediefilene nå @@ -7303,6 +7440,17 @@ %1$s av %2$s + + + Avbryt nedlasting + + Laster ned %1$s av %2$s (%3$s %%) + + Det er ikke nok plass til å lagre sikkerhetskopien. Du trenger minst %1$s mer lagringsplass for å gå videre. + + Hopp over + + "Den siste sikkerhetskopien kunne ikke gjennomføres. Sørg for at enheten er koblet til internett, og trykk på «Sikkerhetskopier nå» for å prøve igjen." @@ -7356,18 +7504,18 @@ Optimalisering av lagring kan kun brukes med betalingsabonnement på sikkerhetskopiering fra Signal. Du må oppgradere abonnementet ditt for å kunne bruke denne funksjonen. - Subscribe for %1$s/month + Bli abonnent for %1$s/måned - This media is no longer available + Mediefilen er ikke lenger tilgjengelig - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Abonnementet ditt inkluderer sikkerhetskopiering av mediefilene fra den siste (%1$d) dagen. Du må oppgradere abonnementet for å sikkerhetskopiere alle mediefilene dine. + Abonnementet ditt inkluderer sikkerhetskopiering av mediefilene fra de siste %1$d dagene. Du må oppgradere abonnementet for å sikkerhetskopiere alle mediefilene dine. - Subscribe for %1$s/month + Bli abonnent for %1$s/måned Sletting er nå synkronisert på alle enhetene dine @@ -7415,6 +7563,8 @@ Nedlasting fullført Sikkerhetskopiene opprettes på nattestid. + + Avsluttet abonnement Abonnement for sikkerhetskopiering @@ -7423,8 +7573,12 @@ %1$s per måned Abonnementet er gratis - + Fornyes %1$s + + Utløper %1$s + + Utløper %1$s Ta en sikkerhetskopi av meldingsloggen din, slik at du ikke mister dataene dine når du bytter telefon eller installerer Molly på nytt. @@ -7469,6 +7623,10 @@ Manuell sikkerhetskopiering Angi PIN-koden, passordet eller mønsteret for å låse opp enheten. + + Slå på sikkerhetskopiering + + Sikkerhetskopiering er slått av, og dataene ble slettet fra Signals sikre lagringstjeneste. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7533792590..2ee364cc0e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -250,7 +250,7 @@ Meer informatie - Voordat je deelneemt aan een oproep, kun je alleen de namen zien van telefooncontacten, mensen met wie je in een groep zit of mensen met wie je 1:1 hebt gechat. Je ziet alle namen en profielfoto\'s zodra je deelneemt aan de oproep. + Voordat je deelneemt aan een oproep, kun je alleen de namen zien van telefooncontacten, mensen met wie je in een groep zit of mensen met wie je een-op-een hebt gechat. Je ziet alle namen en profielfoto\'s zodra je deelneemt aan de oproep. Begrepen @@ -365,6 +365,8 @@ Chats Berichten + + Chattypes Bericht sturen naar %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Je bent er klaar voor. Start nu je back-up. Afhankelijk van de grootte van je back-up kan dit even duren. Tijdens het maken van de back-up kun je je telefoon gebruiken zoals je normaal doet. @@ -1413,7 +1415,7 @@ Groepslink Delen Link vernieuwen - Nieuwe deelnemers goedkeuren + Nieuwe leden goedkeuren Vereis voor iedere persoon die via de groepslink lid wil worden eerst goedkeuring van een beheerder. Weet je zeker dat je de groepslink wilt vernieuwen? Als je de link vernieuwt kunnen mensen niet langer lid worden via de huidige link. @@ -1966,6 +1968,7 @@ + %1$d uitgenodigd + %1$d uitgenodigd + %1$d andere groep %1$d andere groepen @@ -1992,6 +1995,7 @@ Geen apparaat gevonden. Netwerkfout. Ongeldige QR-code. + Sorry, je hebt het maximale aantal apparaten dat je aan je account kunt koppelen al bereikt. Verwijder een apparaat en probeer het opnieuw. Sorry, dit is geen geldige QR-code om een apparaat te koppelen. Een Signal-apparaat koppelen? @@ -2014,11 +2018,13 @@ Wachtwoord instellen Ongeldig wachtwoord! Molly ontgrendelen + Molly-Android - Vergrendelscherm Kaart + Aanwijzer Adres bevestigen @@ -2522,6 +2528,7 @@ Signal-chat openen + Meer opties @@ -2553,6 +2560,7 @@ Geen stickerpakketten geïnstalleerd Stickerpakketten uit binnengekomen berichten zullen hier verschijnen Zonder titel + Onbekend @@ -2774,6 +2782,7 @@ Media niet langer beschikbaar. Kan media niet afspelen. + Fout bij vinden van bericht. Geen app gevonden waarmee dit bestand met anderen gedeeld kan worden. Sluiten @@ -2845,6 +2854,7 @@ Berichten Oproepen + Mislukkingen Back-ups Vergrendelingstoestand @@ -2854,6 +2864,7 @@ Onbekend Spraakberichten Nieuw persoon bereikbaar via Signal + Geen ‘activiteit’ beschikbaar om instellingen voor meldingskanalen mee te openen. Achtergrondverbinding @@ -3638,10 +3649,12 @@ Alle chatgeschiedenis wordt permanent verwijderd van alle apparaten. Dit kan niet ongedaan worden gemaakt. Nu alles verwijderen + Voor altijd 1 jaar 6 maanden 30 dagen + Geen limiet %1$s bericht @@ -3666,6 +3679,7 @@ Laat zien Beltoon Tekstgrootte voor berichten + Dringendheid instellen Notificatieproblemen oplossen @@ -3894,6 +3908,7 @@ Scan de QR-code van de begunstigde naar wie je wilt overschrijven. + Verzoek Betalen Beschikbaar krediet: %1$s @@ -4025,6 +4040,7 @@ Je kunt niet meer dan %1$d chats vastzetten + Afbeelding van contact Gearchiveerd @@ -4033,6 +4049,10 @@ Nieuwe chat Camera openen Nog geen chats.\nBegin door een vriend of vriendin een bericht te sturen. + + Geen chats om te weergeven + + Map-instellingen @@ -4265,6 +4285,7 @@ Back-up van chats Account overzetten Alle gegevens overzetten naar een nieuw Android-apparaat + Voer het back-upwachtwoord in Herstellen Kan geen back-ups van nieuwere versies importeren @@ -4472,6 +4493,7 @@ Kan de wifi-instellingen niet openen. Zet handmatig je wifi aan. + Machtigen om locatie te lezen Locatiegegevens inschakelen Schakel je wifi in @@ -4725,6 +4747,7 @@ Delen + Verzend , %1$s @@ -5028,6 +5051,119 @@ Toetsenbord Verzenden met enter + + Chatmappen + + Een chatmap toevoegen + + + + Orden je chats in mappen en schakel snel tussen deze mappen in je chatlijst. + + Mappen + + Nieuwe map maken + + Alle chats + + Voorgestelde mappen + + Ongelezen + + Ongelezen berichten van alle chats + + 1-op-1-chats + + Alleen berichten van 1-op-1-chats + + Groepen + + Alleen berichten van groepschats + + Toevoegen + + Map %1$s toegevoegd. + + Map bewerken + + Map verwijderen + + Nieuwe map toevoegen + + Alles dempen + + Mappen ordenen + + Alles markeren als gelezen + + + %1$d chattype + %1$d chattypes + + + + %1$d chat + %1$d chats + + + + %1$d chat uitgesloten + %1$d chats uitgesloten + + + + + Nieuwe map maken + + Mapnaam (verplicht) + + Inbegrepen chats + + Chats toevoegen + + Kies chats die je in deze map wilt weergeven. + + Uitzonderingen + + Chats uitsluiten + + Selecteer chats die je niet in deze map wilt weergeven. + + Alleen ongelezen chats weergeven + + Als deze optie is ingeschakeld, worden alleen chats met ongelezen berichten in deze map weergegeven. + + Gedempte chats weergeven + + Aanmaken + + Map maken? + + Wil je de chatmap ‘%1$s’ aanmaken? + + Map aanmaken + + Map bewerken + + Opslaan + + Wijzigingen opslaan? + + Wil je de wijzigingen die je in deze chatmap hebt aangebracht opslaan? + + Wijzigingen opslaan + + Verwijderen + + Map verwijderen + + Deze chatmap verwijderen? + + + + Chattypes + + Klaar Berichten @@ -5112,6 +5248,7 @@ Mediakwaliteit + Media-verzendkwaliteit Als je media in hoge kwaliteit verzendt, verbruik je meer data. @@ -7014,7 +7151,7 @@ - Gegevens van oproep + Oproepdetails Oproepnaam bewerken @@ -7030,7 +7167,7 @@ Link verwijderen? - Deze link zal niet meer werken. + Deze link zal voor niemand meer werken. Link @@ -7232,18 +7369,18 @@ - Your backups subscription expired + Je back-upabonnement is verlopen - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Je back-upabonnement is verlopen, omdat het niet kon worden verlengd via je huidige betaalmethode. Na %1$d dag worden de media in je back-up verwijderd. + Je back-upabonnement is verlopen, omdat het niet kon worden verlengd via je huidige betaalmethode. Na %1$d dagen worden de media in je back-up verwijderd. Je kunt op elk gewenst moment opnieuw betalen zodat back-ups van al je media worden gemaakt. Je media worden vandaag verwijderd - Je mediaback-upabonnement in Signal is geannuleerd omdat we je betaling niet konden verwerken. Dit is de laatste mogelijkheid om de media in je back-up te downloaden voordat deze worden verwijderd. + Je mediaback-upabonnement in Signal is stopgezet omdat we je betaling niet konden verwerken. Dit is de laatste mogelijkheid om de media in je back-up te downloaden voordat deze worden verwijderd. Kan download niet voltooien @@ -7254,9 +7391,9 @@ Als je ‘Overslaan’ kiest, worden de media in je back-up over %1$d dagen verwijderd. - Your backups subscription failed to renew + Je back-upabonnement kon niet worden verlengd - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Controleer of je betalingsinformatie nog steeds klopt. Tik op Abonnement beheren en tik onder Betaalmethoden op Bijwerken. Back-up kon niet worden voltooid @@ -7266,9 +7403,9 @@ Overslaan - Maandelijkse donatie beheren + Abonnement beheren - Subscribe for %1$s/month + Abonneer voor %1$s/maand Nu media downloaden @@ -7303,6 +7440,17 @@ %1$s van %2$s + + + Download annuleren + + Voortgang download: %1$s van %2$s (%3$s) + + Niet genoeg opslagruimte om je back-up te downloaden. Maak %1$s ruimte vrij om door te gaan. + + Downloaden overslaan + + "De laatste back-up kon niet worden voltooid. Zorg ervoor dat je telefoon is verbonden met wifi. Tik op ‘Nu back-up maken’ en probeer het opnieuw." @@ -7356,18 +7504,18 @@ Opslagoptimalisatie kan alleen worden gebruikt met een betaald abonnement op Signal Back-ups. Upgrade je back-upabonnement om deze functie te gebruiken. - Subscribe for %1$s/month + Abonneer voor %1$s/maand - This media is no longer available + Deze media zijn niet meer beschikbaar - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Je huidige Signal back-upabonnement bevat de media van de afgelopen dag. Als je een back-up wilt maken van al je media, voer dan nu een upgrade uit. + Je huidige Signal back-upabonnement bevat de media van de afgelopen %1$d dagen. Als je een back-up wilt maken van al je media, voer dan nu een upgrade uit. - Subscribe for %1$s/month + Abonneer voor %1$s/maand Verwijderen wordt vanaf nu gesynchroniseerd op al je apparaten @@ -7408,13 +7556,15 @@ Back-up verwijderd en uitgeschakeld. - Back-uptype gewijzigd en abonnement geannuleerd + Back-uptype gewijzigd en abonnement opgezegd - Abonnement geannuleerd + Abonnement opgezegd Download voltooid De back-up wordt vannacht gemaakt. + + Abonnement niet actief Back-upabonnement @@ -7423,8 +7573,12 @@ %1$s/maand Je back-upabonnement is gratis - + Wordt %1$s vernieuwd + + Verloopt op %1$s + + Verlopen op %1$s Maak een back-up van je chatgeschiedenis zodat je nooit meer gegevens kwijtraakt als je een andere telefoon in gebruik neemt of Molly opnieuw installeert. @@ -7469,6 +7623,10 @@ Handmatig back-ups maken Voer de pincode, het wachtwoord of het patroon van je apparaat in. + + Back-ups opnieuw inschakelen + + Back-ups zijn uitgeschakeld en je gegevens zijn verwijderd uit de beveiligde opslagservice van Signal. diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 96b3f6881d..4f0f9ad5c7 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -365,6 +365,8 @@ ਚੈਟ ਸੁਨੇਹੇ + + ਚੈਟ ਦੀਆਂ ਕਿਸਮਾਂ ਸੁਨੇਹਾ %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + ਤੁਸੀਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਤਿਆਰ ਹੋ। ਹੁਣੇ ਆਪਣਾ ਬੈਕਅੱਪ ਸ਼ੁਰੂ ਕਰੋ। ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਦੇ ਆਕਾਰ \'ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹੋਏ, ਇਸ ਵਿੱਚ ਕਾਫੀ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ। ਬੈਕਅੱਪ ਦੀ ਪ੍ਰਕਿਰਿਆ ਚੱਲਣ ਦੌਰਾਨ ਤੁਸੀਂ ਆਮ ਵਾਂਗ ਆਪਣੇ ਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ। @@ -1966,6 +1968,7 @@ +%1$d ਨੂੰ ਸੱਦਿਆ ਗਿਆ +%1$d ਨੂੰ ਸੱਦਿਆ ਗਿਆ + %1$d ਵਾਧੂ ਗਰੁੱਪ %1$d ਵਾਧੂ ਗਰੁੱਪ @@ -1992,6 +1995,7 @@ ਕੋਈ ਡਿਵਾਈਸ ਨਹੀਂ ਮਿਲੀ। ਨੈੱਟਵਰਕ ਤਰੁੱਟੀ! ਅਵੈਧ ​​QR ਕੋਡ। + ਅਫ਼ਸੋਸ, ਤੁਹਾਡੇ ਕੋਲ ਬਹੁਤ ਸਾਰੀਆਂ ਡਿਵਾਈਸਾਂ ਪਹਿਲਾਂ ਹੀ ਜੁੜੀਆਂ ਹੋਈਆਂ ਹਨ, ਕੁਝ ਨੂੰ ਹਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ। ਅਫ਼ਸੋਸ, ਇਹ ਇੱਕ ਪ੍ਰਮਾਣਿਕ ​​ਡਿਵਾਈਸ ਲਿੰਕ QR ਕੋਡ ਨਹੀਂ ਹੈ। Signal ਡਿਵਾਈਸ ਨੂੰ ਲਿੰਕ ਕਰਨਾ ਹੈ? @@ -2014,11 +2018,13 @@ ਪਾਸਫ਼੍ਰੇਜ਼ ਦਰਜ ਕਰੋ ਅਵੈਧ ਪਾਸਫ਼੍ਰੇਜ਼! Molly ਨੂੰ ਅਨਲੌਕ ਕਰੋ + Molly Android - ਲਾਕ ਸਕਰੀਨ ਨਕਸ਼ਾ + ਪਿੰਨ ਲਾਹੋ ਪਤਾ ਮਨਜ਼ੂਰ ਕਰੋ @@ -2522,6 +2528,7 @@ Signal ਸੁਨੇਹਾ + ਹੋਰ @@ -2553,6 +2560,7 @@ ਕੋਈ ਸਟਿੱਕਰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੇ ਗਏ ਆ ਰਹੇ ਸੁਨੇਹਿਆਂ ਤੋਂ ਸਟਿੱਕਰ ਇੱਥੇ ਦਿਖਾਈ ਦੇਣਗੇ ਬਿਨਾਂ ਸਿਰਲੇਖ + ਅਣਜਾਣ @@ -2774,6 +2782,7 @@ ਮੀਡੀਆ ਹੁਣ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਮੀਡੀਆ ਚਲਾਉਣ ਵਿੱਚ ਅਸਮਰੱਥ ਰਹੇ। + ਸੁਨੇਹਾ ਲੱਭਣ ਵੇਲੇ ਕੋਈ ਵੇਲੇ ਕੋਈ ਗੜਬੜੀ ਪੇਸ਼ ਆਈ। ਇਸ ਮੀਡੀਆ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਦੇ ਯੋਗ ਕੋਈ ਐਪ ਨਹੀਂ ਹੈ। ਬੰਦ ਕਰੋ @@ -2845,6 +2854,7 @@ ਸੁਨੇਹੇ ਕਾਲਾਂ + ਅਸਫ਼ਲਤਾਵਾਂ ਬੈਕਅੱਪ ਸਥਿਤੀ ਨੂੰ ਲਾਕ ਕਰੋ @@ -2854,6 +2864,7 @@ ਅਣਜਾਣ ਅਵਾਜ਼ ਵਾਲੇ ਸੁਨੇਹੇ ਸੰਪਰਕ Signal ਦਾ ਹਿੱਸਾ ਬਣਿਆ + ਸੂਚਨਾ ਚੈਨਲ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਕੋਈ ਗਤੀਵਿਧੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਬੈਕਗਰਾਊਂਡ ਕਨੈਕਸ਼ਨ @@ -3638,10 +3649,12 @@ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹਿਆਂ ਨੂੰ ਸਾਰੇ ਡਿਵਾਈਸਾਂ ਵਿੱਚੋਂ ਸਥਾਈ ਤੌਰ \'ਤੇ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਤੁਸੀਂ ਅਣਕੀਤਾ ਨਹੀਂ ਕਰ ਸਕਦੇ। ਹੁਣੇ ਸਭ ਮਿਟਾਓ + ਹਮੇਸ਼ਾਂ 1 ਸਾਲ 6 ਮਹੀਨੇ 30 ਦਿਨ + ਕੋਈ ਨਹੀਂ %1$s ਸੁਨੇਹਾ @@ -3666,6 +3679,7 @@ ਦਿਖਾਉ ਰਿੰਗਟੋਨ ਸੁਨੇਹਾ ਫ਼ੌਂਟ ਦਾ ਆਕਾਰ + ਤਰਜੀਹ ਸੂਚਨਾਵਾਂ ਬਾਰੇ ਸਮੱਸਿਆ ਦਾ ਨਿਪਟਾਰਾ ਕਰੋ @@ -3894,6 +3908,7 @@ ਆਪਣੇ ਪ੍ਰਾਪਤਕਰਤਾ ਦਾ ਸਿਰਨਾਵਾਂ QR ਕੋਡ ਸਕੈਨ ਕਰੋ + ਬੇਨਤੀ ਭੁਗਤਾਨ ਕਰੋ ਮੌਜੂਦਾ ਬੈਲਨਸ: %1$s @@ -4025,6 +4040,7 @@ ਤੁਸੀਂ ਸਿਰਫ਼ %1$d ਚੈਟਾਂ ਹੀ ਟੰਗ ਸਕਦੇ ਹੋ + ਸੰਪਰਕ ਫੋਟੋ ਚਿੱਤਰ ਆਰਕਾਈਵ @@ -4033,6 +4049,10 @@ ਨਵੀਂ ਚੈਟ ਕੈਮਰਾ ਖੋਲ੍ਹੋ ਹਾਲੇ ਕੋਈ ਚੈਟ ਨਹੀਂ ਹੈ।\nਦੋਸਤ ਨੂੰ ਸੁਨੇਹਾ ਕਰਕੇ ਸ਼ੁਰੂਆਤ ਕਰੋ। + + ਦਿਖਾਉਣ ਲਈ ਕੋਈ ਚੈਟ ਨਹੀਂ + + ਫੋਲਡਰ ਸੈਟਿੰਗਾਂ @@ -4265,6 +4285,7 @@ ਚੈਟ ਬੈਕਅਪ ਖਾਤਾ ਟ੍ਰਾਂਸਫਰ ਕਰੋ ਖਾਤੇ ਨੂੰ ਨਵੇਂ Android ਡਿਵਾਈਸ ਉੱਤੇ ਟ੍ਰਾਂਸਫਰ ਕਰੋ + ਬੈਕਅਪ ਪਾਸਫ਼੍ਰੇਜ਼ ਦਰਜ ਕਰੋ ਰੀਸਟੋਰ ਕਰੋ Signal ਦੇ ਨਵੇਂ ਵਰਜ਼ਨ ਤੋਂ ਬੈਕਅੱਪ ਇੰਮਪੋਰਟ ਨਹੀਂ ਕਰ ਸਕਦੇ @@ -4472,6 +4493,7 @@ Wi-Fi ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੀਆਂ ਨਹੀਂ ਜਾ ਸਕਦੀਆਂ। ਕਿਰਪਾ ਕਰਕੇ Wi-Fi ਨੂੰ ਆਪ ਚਾਲੂ ਕਰੋ। + ਟਿਕਾਣੇ ਲਈ ਇਜਾਜ਼ਤ ਦਿਓ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਚਾਲੂ ਕਰੋ ਵਾਈ-ਫਾਈ ਚਾਲੂ ਕਰੋ @@ -4725,6 +4747,7 @@ ਸਾਂਝਾ ਕਰੋ + ਭੇਜੋ , %1$s @@ -5028,6 +5051,119 @@ ਕੀਬੋਰਡ ਐਂਟਰ ਦਬਾ ਕੇ ਭੇਜੋ + + ਚੈਟ ਫੋਲਡਰ + + ਇੱਕ ਚੈਟ ਫੋਲਡਰ ਸ਼ਾਮਲ ਕਰੋ + + + + ਆਪਣੀਆਂ ਚੈਟਾਂ ਨੂੰ ਫੋਲਡਰਾਂ ਵਿੱਚ ਵਿਵਸਥਿਤ ਕਰੋ ਅਤੇ ਆਪਣੀ ਚੈਟ ਸੂਚੀ ਵਿੱਚ ਉਹਨਾਂ ਵਿਚਕਾਰ ਤੇਜ਼ੀ ਨਾਲ ਸਵਿੱਚ ਕਰੋ। + + ਫੋਲਡਰ + + ਇੱਕ ਫੋਲਡਰ ਬਣਾਓ + + ਸਾਰੀਆਂ ਚੈਟਾਂ + + ਸੁਝਾਏ ਗਏ ਫੋਲਡਰ + + ਨਹੀਂ ਪੜ੍ਹੇ + + ਸਾਰੀਆਂ ਚੈਟਾਂ ਦੇ ਨਹੀਂ ਪੜ੍ਹੇ ਸੁਨੇਹੇ + + 1:1 ਚੈਟ + + ਸਿਰਫ਼ ਤੁਹਾਡੇ ਨਾਲ ਕੀਤੀਆਂ ਸਿੱਧੀਆਂ ਚੈਟਾਂ ਦੇ ਸੁਨੇਹੇ + + ਗਰੁੱਪ + + ਸਿਰਫ਼ ਗਰੁੱਪ ਚੈਟ ਦੇ ਸੁਨੇਹਾ + + ਸ਼ਾਮਲ ਕਰੋ + + %1$s ਫੋਲਡਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। + + ਫੋਲਡਰ ਸੋਧੋ + + ਫੋਲਡਰ ਮਿਟਾਓ + + ਨਵਾਂ ਫੋਲਡਰ ਸ਼ਾਮਲ ਕਰੋ + + ਸਭ ਨੂੰ ਮਿਊਟ ਕਰੋ + + ਫੋਲਡਰਾਂ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰੋ + + ਸਾਰਿਆਂ ਨੂੰ ਪੜ੍ਹਿਆ ਗਿਆ ਵਜੋਂ ਚਿੰਨ੍ਹਿਤ ਕਰੋ + + + %1$d ਚੈਟ ਦੀ ਕਿਸਮ + %1$d ਚੈਟਾਂ ਦੀਆਂ ਕਿਸਮਾਂ + + + + %1$d ਚੈਟ + %1$d ਚੈਟਾਂ + + + + %1$d ਚੈਟ ਨੂੰ ਬਾਹਰ ਰੱਖਿਆ ਗਿਆ + %1$d ਚੈਟਾਂ ਨੂੰ ਬਾਹਰ ਰੱਖਿਆ ਗਿਆ + + + + + ਇੱਕ ਫੋਲਡਰ ਬਣਾਓ + + ਫੋਲਡਰ ਦਾ ਨਾਮ (ਲੋੜੀਂਦਾ ਹੈ) + + ਸ਼ਾਮਲ ਚੈਟਾਂ + + ਚੈਟਾਂ ਸ਼ਾਮਲ ਕਰੋ + + ਉਹ ਚੈਟ ਚੁਣੋ ਜੋ ਤੁਸੀਂ ਇਸ ਫੋਲਡਰ ਵਿੱਚ ਦਿਖਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ। + + ਬਾਹਰ ਰੱਖੀਆਂ ਚੈਟਾਂ + + ਚੈਟਾਂ ਨੂੰ ਬਾਹਰ ਰੱਖੋ + + ਉਹ ਚੈਟ ਚੁਣੋ ਜੋ ਤੁਸੀਂ ਇਸ ਫੋਲਡਰ ਵਿੱਚ ਦਿਖਾਉਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਹੋ। + + ਸਿਰਫ਼ ਨਹੀਂ ਪੜ੍ਹੀਆਂ ਚੈਟਾਂ ਦਿਖਾਓ + + ਜਦੋਂ ਸਮਰੱਥ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਇਸ ਫੋਲਡਰ ਵਿੱਚ ਸਿਰਫ਼ ਨਹੀਂ ਪੜ੍ਹੇ ਸੁਨੇਹਿਆਂ ਵਾਲੀਆਂ ਚੈਟਾਂ ਹੀ ਦਿਖਾਈਆਂ ਜਾਣਗੀਆਂ। + + ਮਿਊਟ ਕੀਤੀਆਂ ਚੈਟਾਂ ਸ਼ਾਮਲ ਕਰੋ + + ਬਣਾਓ + + ਫੋਲਡਰ ਬਣਾਉਣਾ ਹੈ? + + ਕੀ ਤੁਸੀਂ ਚੈਟ ਫੋਲਡਰ \"%1$s\" ਬਣਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? + + ਫੋਲਡਰ ਬਣਾਓ + + ਫੋਲਡਰ ਸੋਧੋ + + ਸੇਵ ਕਰੋ + + ਕੀ ਤਬਦੀਲੀਆਂ ਨੂੰ ਸੇਵ ਕਰਨਾ ਹੈ? + + ਕੀ ਤੁਸੀਂ ਇਸ ਚੈਟ ਫੋਲਡਰ ਵਿੱਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਸੇਵ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + + ਤਬਦੀਲੀਆਂ ਨੂੰ ਸੇਵ ਕਰੋ + + ਖਾਰਜ ਕਰੋ + + ਫੋਲਡਰ ਮਿਟਾਓ + + ਕੀ ਇਸ ਚੈਟ ਫੋਲਡਰ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ? + + + + ਚੈਟ ਦੀਆਂ ਕਿਸਮਾਂ + + ਮੁਕੰਮਲ ਸੁਨੇਹੇ @@ -5112,6 +5248,7 @@ ਮੀਡੀਆ ਕੁਆਲਟੀ + ਭੇਜੀ ਮੀਡੀਆ ਕੁਆਲਟੀ ਵਧੀਆ ਕੁਆਲਟੀ ਮੀਡੀਆ ਭੇਜਣ ਲਈ ਵੱਧ ਡਾਟਾ ਵਰਤਿਆ ਜਾਵੇਗਾ। @@ -7232,11 +7369,11 @@ - Your backups subscription expired + ਤੁਹਾਡੀ ਬੈਕਅੱਪ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਪਲਾਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ ਕਿਉਂਕਿ ਇਸਨੂੰ ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਭੁਗਤਾਨ ਵਿਧੀ ਨਾਲ ਰੀਨਿਊ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। %1$d ਦਿਨ ਬਾਅਦ, ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਵਿੱਚੋਂ ਮੀਡੀਆ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। + ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਪਲਾਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ ਕਿਉਂਕਿ ਇਸਨੂੰ ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਭੁਗਤਾਨ ਵਿਧੀ ਨਾਲ ਰੀਨਿਊ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। %1$d ਦਿਨਾਂ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਵਿੱਚੋਂ ਮੀਡੀਆ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਸਮੇਂ ਦੁਬਾਰਾ ਬੈਕਅੱਪ ਲਈ ਭੁਗਤਾਨ ਕਰਕੇ ਆਪਣੇ ਸਾਰੇ ਮੀਡੀਆ ਦਾ ਬੈਕਅੱਪ ਲੈਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ। @@ -7254,9 +7391,9 @@ ਜੇਕਰ ਤੁਸੀਂ \"ਛੱਡੋ\" ਬਟਨ ਚੁਣਦੇ ਹੋ ਤਾਂ ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਵਿੱਚ ਮੌਜੂਦ ਮੀਡੀਆ %1$d ਦਿਨਾਂ ਬਾਅਦ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। - Your backups subscription failed to renew + ਤੁਹਾਡੀ ਬੈਕਅੱਪ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਰੀਨਿਊ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + ਜਾਂਚ ਕਰਕੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੀ ਭੁਗਤਾਨ ਵਿਧੀ ਅੱਪ-ਟੂ-ਡੇਟ ਹੈ। ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰੋ \'ਤੇ ਟੈਪ ਕਰੋ ਅਤੇ ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਦੇ ਹੇਠਾਂ ਅੱਪਡੇਟ ਕਰੋ \'ਤੇ ਟੈਪ ਕਰੋ। ਬੈਕਅੱਪ ਪੂਰਾ ਨਹੀਂ ਕਰ ਸਕੇ @@ -7266,9 +7403,9 @@ ਛੱਡੋ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਪ੍ਰਬੰਧਿਤ ਕਰੋ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰੋ - Subscribe for %1$s/month + %1$s/ਮਹੀਨੇ ਵਿੱਚ ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਮੀਡੀਆ ਹੁਣੇ ਡਾਊਨਲੋਡ ਕਰੋ @@ -7303,6 +7440,17 @@ %2$s ਵਿੱਚੋਂ %1$s + + + ਡਾਊਨਲੋਡ ਰੱਦ ਕਰੋ + + ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ: %2$s ਵਿੱਚੋਂ %1$s (%3$s%%) + + ਤੁਹਾਡੇ ਬੈਕਅੱਪ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਥਾਂ ਨਹੀਂ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ %1$s ਥਾਂ ਖਾਲੀ ਕਰੋ। + + ਡਾਊਨਲੋਡ ਛੱਡੋ + + "ਤੁਹਾਡਾ ਪਿਛਲਾ ਬੈਕਅੱਪ ਪੂਰਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡਾ ਫ਼ੋਨ Wi-F ਨਾਲ ਕਨੈਕਟ ਹੈ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਹੁਣੇ ਬੈਕਅੱਪ ਲਓ \'ਤੇ ਟੈਪ ਕਰੋ।" @@ -7356,18 +7504,18 @@ ਸਟੋਰੇਜ ਅਨੁਕੂਲਤਾ ਦੀ ਵਰਤੋਂ ਸਿਰਫ਼ Signal ਬੈਕਅੱਪ ਦੇ ਭੁਗਤਾਨਸ਼ੁਦਾ ਟੀਅਰ ਨਾਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। ਇਸ ਫੀਚਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਆਪਣਾ ਬੈਕਅੱਪ ਪਲਾਨ ਅੱਪਗ੍ਰੇਡ ਕਰੋ। - Subscribe for %1$s/month + %1$s/ਮਹੀਨੇ ਵਿੱਚ ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ - This media is no longer available + ਇਹ ਮੀਡੀਆ ਹੁਣ ਉਪਲਬਧ ਨਹੀਂ ਹੈ - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + ਤੁਹਾਡੇ ਮੌਜੂਦਾ Signal ਬੈਕਅੱਪ ਪਲਾਨ ਵਿੱਚ ਤੁਹਾਡੇ ਸਭ ਤੋਂ ਹਾਲੀਆ %1$d ਦਿਨ ਦਾ ਮੀਡੀਆ ਸ਼ਾਮਲ ਹੈ। ਆਪਣੇ ਸਾਰੇ ਮੀਡੀਆ ਦਾ ਬੈਕਅੱਪ ਲੈਣਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਹੁਣੇ ਅੱਪਗ੍ਰੇਡ ਕਰੋ। + ਤੁਹਾਡੇ ਮੌਜੂਦਾ Signal ਬੈਕਅੱਪ ਪਲਾਨ ਵਿੱਚ ਤੁਹਾਡੇ ਸਭ ਤੋਂ ਹਾਲੀਆ %1$d ਦਿਨਾਂ ਦਾ ਮੀਡੀਆ ਸ਼ਾਮਲ ਹੈ। ਆਪਣੇ ਸਾਰੇ ਮੀਡੀਆ ਦਾ ਬੈਕਅੱਪ ਲੈਣਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਹੁਣੇ ਅੱਪਗ੍ਰੇਡ ਕਰੋ। - Subscribe for %1$s/month + %1$s/ਮਹੀਨੇ ਵਿੱਚ ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਮਿਟਾਉਣਾ ਦੀ ਪ੍ਰਕਿਰਿਆ ਹੁਣ ਤੁਹਾਡੇ ਸਾਰੇ ਡਿਵਾਈਸਾਂ \'ਤੇ ਸਿੰਕ ਹੋ ਜਾਵੇਗੀ @@ -7415,6 +7563,8 @@ ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ ਬੈਕਅੱਪ ਰਾਤੋ-ਰਾਤ ਬਣਾਇਆ ਜਾਵੇਗਾ। + + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅਕਿਰਿਆਸ਼ੀਲ ਹੈ ਬੈਕਅੱਪ ਪਲਾਨ @@ -7423,8 +7573,12 @@ %1$s/ਮਹੀਨਾ ਤੁਹਾਡਾ ਬੈਕਅੱਪ ਪਲਾਨ ਮੁਫ਼ਤ ਹੈ - + ਰੀਨਿਊ ਹੋਣ ਦੀ ਮਿਤੀ: %1$s + + ਮਿਆਦ %1$s ਨੂੰ ਸਮਾਪਤ ਹੋਵੇਗੀ + + ਮਿਆਦ %1$s ਨੂੰ ਸਮਾਪਤ ਹੋਈ ਆਪਣੇ ਪੁਰਾਣੇ ਸੁਨੇਹਿਆਂ ਦਾ ਬੈਕਅੱਪ ਲਓ ਤਾਂ ਜੋ ਨਵਾਂ ਫ਼ੋਨ ਲੈਣ \'ਤੇ ਜਾਂ Molly ਨੂੰ ਦੁਬਾਰਾ ਇੰਸਟਾਲ ਕਰਨ \'ਤੇ ਵੀ ਤੁਹਾਡਾ ਡਾਟਾ ਸੁਰੱਖਿਅਤ ਰਹੇ। @@ -7469,6 +7623,10 @@ ਖੁਦ ਬੈਕਅੱਪ ਲਓ ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਡਿਵਾਈਸ PIN, ਪਾਸਵਰਡ ਜਾਂ ਪੈਟਰਨ ਦਾਖਲ ਕਰੋ। + + ਬੈਕਅੱਪ ਮੁੜ-ਸਮਰੱਥ ਕਰੋ + + ਬੈਕਅੱਪ ਬੰਦ ਕਰ ਦਿੱਤੇ ਗਏ ਹਨ ਅਤੇ ਤੁਹਾਡਾ ਡਾਟਾ Signal ਦੀ ਸੁਰੱਖਿਅਤ ਸਟੋਰੇਜ ਸੇਵਾ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 812bf3b5ab..59d4713b27 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -371,6 +371,8 @@ Czaty Wiadomości + + Rodzaje czatu Wiadomość %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Wszystko gotowe. Możesz rozpocząć tworzenie kopii zapasowej. W przypadku dużej ilości danych proces tworzenia kopii zapasowej może zająć sporo czasu. Podczas tworzenia kopii zapasowej możesz normalnie korzystać z telefonu. @@ -2088,6 +2090,7 @@ +%1$d zaproszonych +%1$d zaproszonych + %1$d dodatkowa grupa %1$d dodatkowe grupy @@ -2116,6 +2119,7 @@ Nie znaleziono żadnych urządzeń. Błąd sieci. Niepoprawny kod QR. + Masz zbyt dużo powiązanych urządzeń, spróbuj usunąć któreś z nich zanim spróbujesz ponownie Przepraszamy, ale to nie jest prawidłowy link QR. Dodać nowe urządzenie Signal? @@ -2140,11 +2144,13 @@ Wprowadź hasło Nieprawidłowe hasło! Odblokuj Molly + Molly Android - Blokada ekranu Mapa + Umieść znacznik Zaakceptuj adres @@ -2692,6 +2698,7 @@ Wiadomość Signal + Więcej @@ -2723,6 +2730,7 @@ Brak zainstalowanych naklejek Tutaj pojawią się naklejki z wiadomości przychodzących Bez tytułu + Nieznany @@ -2946,6 +2954,7 @@ Multimedia nie są już dostępne. Nie można odtworzyć multimediów. + Błąd przy szukaniu wiadomości Nie można znaleźć aplikacji, aby udostępnić te multimedia. Zamknij @@ -3021,6 +3030,7 @@ Wiadomości Połączenia + Awarie Kopie zapasowe Status blokady @@ -3030,6 +3040,7 @@ Nieznany Wiadomości głosowe Kontakt dołączył do Signal + Brak dostępnej aktywności, aby otworzyć ustawienia kanału powiadomień. Połączenie w tle @@ -3840,10 +3851,12 @@ Cała historia wiadomości zostanie trwale usunięta ze wszystkich urządzeń. Tego działania nie można cofnąć. Usuń wszystko teraz + Zawsze 1 rok 6 miesięcy 30 dni + Brak %1$s wiadomość @@ -3870,6 +3883,7 @@ Pokaż Dzwonek Rozmiar czcionki dla wiadomości + Priorytet Rozwiązywanie problemów z powiadomieniami @@ -4098,6 +4112,7 @@ Zeskanuj kod QR odbiorcy płatności + Prośba Zapłać Dostępne środki: %1$s @@ -4231,6 +4246,7 @@ Możesz przypiąć maksymalnie %1$d czaty(ów) + Zdjęcie kontaktu Archiwum @@ -4239,6 +4255,10 @@ Nowy czat Otwórz aparat Nie masz jeszcze żadnych czatów.\nZacznij od wysłania wiadomości do znajomego. + + Brak czatów do wyświetlenia + + Ustawienia folderu @@ -4487,6 +4507,7 @@ Kopia zapasowa czatów Przenieś konto Przenieś konto na nowe urządzenie z systemem Android + Wprowadź hasło kopii zapasowej Przywróć Import kopii zapasowej z nowszej wersji nie udał się @@ -4694,6 +4715,7 @@ Nie można otworzyć ustawień Wi-Fi. Włącz Wi-Fi ręcznie. + Udziel dostępu do lokalizacji Włącz usługi lokalizacji Włącz Wi-Fi @@ -4961,6 +4983,7 @@ Udostępnij + Wyślij , %1$s @@ -5266,6 +5289,125 @@ Klawiatura Wysyłaj za pomocą Enter + + Foldery z czatami + + Dodaj folder z czatami + + + + Uporządkuj swoje czaty w folderach i przełączaj się między nimi wygodnie na swojej liście czatów. + + Foldery + + Utwórz folder + + Wszystkie czaty + + Sugerowane foldery + + Nieodczytane + + Nieodczytane wiadomości ze wszystkich czatów + + Czaty 1:1 + + Tylko wiadomości z czatów bezpośrednich + + Grupy + + Tylko wiadomości z czatów grupowych + + Dodaj + + Dodano folder %1$s. + + Edytuj folder + + Usuń folder + + Dodaj nowy folder + + Wycisz wszystkie + + Zmień kolejność folderów + + Oznacz wszystkie jako przeczytane + + + %1$d rodzaj czatu + %1$d rodzaje czatu + %1$d rodzajów czatu + %1$d rodzajów czatu + + + + %1$d czat + %1$d czaty + %1$d czatów + %1$d czatu + + + + %1$d wykluczony czat + %1$d wykluczone czaty + %1$d wykluczonych czatów + %1$d wykluczonych czatów + + + + + Utwórz folder + + Nazwa folderu (wymagana) + + Dodane czaty + + Dodaj czaty + + Wybierz czaty, które mają się pojawić w tym folderze. + + Wyjątki + + Wyklucz czaty + + Wybierz czaty, które nie mają być uwzględnione w tym folderze. + + Pokaż tylko nieodczytane czaty + + Po włączeniu tej opcji w tym folderze będą wyświetlane tylko czaty z nieodczytanymi wiadomościami. + + Uwzględnij wyciszone czaty + + Utwórz + + Utworzyć folder? + + Czy chcesz utworzyć folder z czatami „%1$s”? + + Utwórz folder + + Edytuj folder + + Zapisz + + Zapisać zmiany? + + Czy chcesz zapisać zmiany wprowadzone w tym folderze z czatami? + + Zapisz zmiany + + Odrzuć + + Usuń folder + + Usunąć ten folder z czatami? + + + + Rodzaje czatu + + Gotowe Wiadomości @@ -5352,6 +5494,7 @@ Jakość multimediów + Jakość wysyłanych multimediów Wysyłanie multimediów wysokiej jakości zużywa więcej danych. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Twoja usługa tworzenia kopii zapasowych wygasła - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Usługa tworzenia kopii zapasowych wygasła, ponieważ nie mogliśmy jej odnowić za pomocą Twojej bieżącej metody płatności. Po upływie %1$d dnia multimedia z kopii zapasowej zostaną usunięte. + Usługa tworzenia kopii zapasowych wygasła, ponieważ nie mogliśmy jej odnowić za pomocą Twojej bieżącej metody płatności. Po upływie %1$d dni multimedia z kopii zapasowej zostaną usunięte. + Usługa tworzenia kopii zapasowych wygasła, ponieważ nie mogliśmy jej odnowić za pomocą Twojej bieżącej metody płatności. Po upływie %1$d dni multimedia z kopii zapasowej zostaną usunięte. + Usługa tworzenia kopii zapasowych wygasła, ponieważ nie mogliśmy jej odnowić za pomocą Twojej bieżącej metody płatności. Po upływie %1$d dnia multimedia z kopii zapasowej zostaną usunięte. W dowolnym momencie możesz wznowić uiszczanie opłaty za dalsze tworzenie kopii zapasowych wszystkich multimediów. @@ -7570,9 +7713,9 @@ Jeśli wybierzesz opcję „Pomiń”, multimedia z kopii zapasowej zostaną usunięte w ciągu %1$d dnia. - Your backups subscription failed to renew + Nie udało się odnowić usługi kopii zapasowych - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Upewnij się, że dane dotyczące Twojej wybranej metody płatności są aktualne. Kliknij Zarządzaj subskrypcją, a w sekcji Metody płatności kliknij Aktualizuj. Nie udało się ukończyć tworzenia kopii zapasowej @@ -7584,7 +7727,7 @@ Zarządzaj subskrypcją - Subscribe for %1$s/month + Subskrybuj usługę za %1$s/mies. Pobierz multimedia teraz @@ -7619,6 +7762,17 @@ %1$s z %2$s + + + Anuluj pobieranie + + Trwa pobieranie: %1$s z %2$s (%3$s%%) + + Za mało miejsca, aby pobrać kopię zapasową. Aby kontynuować, zwolnij %1$s miejsca. + + Pomiń pobieranie + + "Nie udało się ukończyć tworzenia ostatniej kopii zapasowej. Upewnij się, że urządzenie jest podłączone do Wi-Fi, i ponownie wybierz opcję Utwórz kopię zapasową teraz." @@ -7672,20 +7826,20 @@ Optymalizacja pamięci masowej dostępna jest tylko po wykupieniu płatnego trybu tworzenia kopii zapasowych Signal. Aby móc korzystać z tej funkcji, wykup płatny tryb tworzenia kopii zapasowej. - Subscribe for %1$s/month + Subskrybuj usługę za %1$s/mies. - This media is no longer available + Te multimedia nie są już dostępne. - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + W ramach Twojej bieżącej usługi masz utworzoną kopię zapasową Signal multimediów z ostatniego %1$d dnia. Aby rozpocząć tworzenie kopii zapasowych wszystkich multimediów, wykup usługę. + W ramach Twojej bieżącej usługi masz utworzoną kopię zapasową Signal multimediów z ostatnich %1$d dni. Aby rozpocząć tworzenie kopii zapasowych wszystkich multimediów, wykup usługę. + W ramach Twojej bieżącej usługi masz utworzoną kopię zapasową Signal multimediów z ostatnich %1$d dni. Aby rozpocząć tworzenie kopii zapasowych wszystkich multimediów, wykup usługę. + W ramach Twojej bieżącej usługi masz utworzoną kopię zapasową Signal multimediów z ostatnich %1$d dni. Aby rozpocząć tworzenie kopii zapasowych wszystkich multimediów, wykup usługę. - Subscribe for %1$s/month + Subskrybuj usługę za %1$s/mies. Usuwanie jest teraz synchronizowane na wszystkich Twoich urządzeniach @@ -7733,6 +7887,8 @@ Pobieranie ukończone Kopia zapasowa będzie tworzona codziennie w nocy. + + Subskrypcja nieaktywna Tryb tworzenia kopii zapasowej @@ -7741,8 +7897,12 @@ %1$s/miesiąc Korzystasz z bezpłatnego trybu tworzenia kopii zapasowej - + Przedłużane %1$s + + Wygasa %1$s + + Wygasła %1$s Twórz kopie zapasowe swoich wiadomości, a nie stracisz ich nawet po zmianie telefonu czy ponownej instalacji Molly. @@ -7787,6 +7947,10 @@ Ręczne tworzenie kopii zapasowej Wprowadź kod PIN urządzenia, hasło lub wzór. + + Włącz ponownie + + Tworzenie kopii zapasowych zostało wyłączone, a Twoje dane zostały usunięte z bezpiecznej usługi przechowywania Signal. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5c4239ea78..55188834fc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -365,6 +365,8 @@ Chats Mensagens + + Tipos de conversa Mensagem %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Está tudo pronto. Inicie seu backup agora. Dependendo do tamanho do seu backup, o processo pode demorar bastante. Você pode usar seu telefone normalmente enquanto o backup é feito. @@ -1966,6 +1968,7 @@ +%1$d pessoa convidada +%1$d pessoas convidadas + %1$d grupo adicional %1$d grupos adicionais @@ -1992,6 +1995,7 @@ Nenhum dispositivo encontrado. Erro de rede. Código QR inválido. + Desculpe, você já possui muitos dispositivos vinculados. Tente remover alguns. Desculpe, este não é um código QR de dispositivo válido. Vincular um dispositivo Signal? @@ -2014,11 +2018,13 @@ Enviar frase-chave Frase-chave inválida! Destrancar Molly + Molly Android - Tela de bloqueio Mapa + Soltar pin Aceitar endereço @@ -2522,6 +2528,7 @@ Mensagem no Signal + Mais @@ -2553,6 +2560,7 @@ Nenhum pacote de figurinhas instalado Pacotes de figurinhas de mensagens recebidas aparecerão aqui Sem título + Desconhecida @@ -2774,6 +2782,7 @@ A mídia não está mais disponível. Não foi possível reproduzir a mídia. + Erro ao encontrar mensagem. Não foi possível encontrar um aplicativo capaz de compartilhar esta mídia. Fechar @@ -2845,6 +2854,7 @@ Mensagens Ligações + Falhas Backups Status de bloqueio @@ -2854,6 +2864,7 @@ Desconhecida Mensagens de voz O contato entrou no Signal + Nenhuma atividade está disponível para ser ajustada nas configurações das categorias de notificações. Conexão de dados em segundo plano @@ -3638,10 +3649,12 @@ Todo o histórico de mensagens será removido permanentemente de todos os dispositivos. Essa ação não pode ser desfeita. Apagar tudo agora + Para sempre 1 ano 6 meses 30 dias + Nenhum %1$s mensagem @@ -3666,6 +3679,7 @@ Exibir Toque Tamanho da fonte da mensagem + Prioridade Notificações de resolução de problemas @@ -3894,6 +3908,7 @@ Escaneie o código QR do endereço do destinatário + Pedido Pagar Saldo disponível: %1$s @@ -4025,6 +4040,7 @@ Você só pode fixar até %1$d chats + Imagem do contato Arquivado @@ -4033,6 +4049,10 @@ Novo chat Abrir câmera Nenhuma conversa ainda. \nPara começar, envie uma mensagem para alguém. + + Nenhuma conversa para exibir + + Configurações da pasta @@ -4265,6 +4285,7 @@ Backups de chat Transferir conta Transferir conta para um novo dispositivo Android + Digite a frase-chave de backup Restaurar Não é possível importar backups de versões recentes @@ -4472,6 +4493,7 @@ Não foi possível abrir as configurações do Wi-Fi. Ative o Wi-Fi manualmente. + Ativar o acesso à localização Ativar os serviços de localização Ativar o Wi-Fi @@ -4725,6 +4747,7 @@ Compartilhar + Enviar , %1$s @@ -5028,6 +5051,119 @@ Teclado Enviar com Enter + + Pastas de conversas + + Adicionar uma pasta de conversas + + + + Organize suas conversas em pastas e mude rapidamente entre elas na sua lista. + + Pastas + + Criar uma pasta + + Todas as conversas + + Pastas sugeridas + + Não lidas + + Mensagens não lidas de todas as conversas + + Conversas individuais + + Somente mensagens de conversas diretas + + Grupos + + Somente mensagens de conversas em grupo + + Adicionar + + Pasta %1$s adicionada. + + Editar pasta + + Apagar pasta + + Adicionar nova pasta + + Silenciar tudo + + Reordenar pastas + + Marcar todas como lidas + + + %1$d tipo de conversa + %1$d tipos de conversa + + + + %1$d conversa + %1$d conversas + + + + %1$d conversa apagada + %1$d conversas apagadas + + + + + Criar uma pasta + + Nome da pasta (obrigatório) + + Conversas incluídas + + Adicionar conversas + + Escolha as conversas que você quer que apareçam nessa pasta. + + Exceções + + Excluir conversas + + Selecione as conversas que você deseja ocultar desta pasta. + + Mostrar apenas conversas não lidas + + Quando essa opção estiver ativada, somente as conversas com mensagens não lidas serão mostradas nesta pasta. + + Incluir conversas silenciados + + Criar + + Criar pasta? + + Você quer criar a pasta de conversas \"%1$s\"? + + Criar pasta + + Editar pasta + + Salvar + + Salvar alterações? + + Quer salvar as alterações que você fez nessa pasta de conversas? + + Salvar alterações + + Descartar + + Apagar pasta + + Apagar essa pasta de conversas? + + + + Tipos de conversa + + Pronto Mensagens @@ -5112,6 +5248,7 @@ Qualidade das fotos + Qualidade da mídia enviada Enviar mídia com alta qualidade usará mais dados de internet. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Seu plano de assinatura de backups expirou - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Seu plano de backup expirou porque não pôde ser renovado com a forma de pagamento atual. Em %1$d dia, os arquivos de mídia em seu backup serão apagados. + Seu plano de backup expirou porque não pôde ser renovado com a forma de pagamento atual. Em %1$d dias, os arquivos de mídia em seu backup serão apagados. Você pode voltar a pagar pelos backups a qualquer momento para continuar salvando todos os seus arquivos de mídia. @@ -7254,9 +7391,9 @@ Se você selecionar \"Pular\", os arquivos de mídia do seu backup serão excluídos em %1$d dias. - Your backups subscription failed to renew + Não foi possível renovar seu plano de assinatura de backups. - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Verifique se seu método de pagamento está atualizado. Toque em Gerenciar assinatura e, em Métodos de pagamento, selecione Atualizar. Não foi possível concluir o backup @@ -7266,9 +7403,9 @@ Pular - Ajustar doação + Gerenciar plano - Subscribe for %1$s/month + Assine por %1$s/mês Baixar mídia agora @@ -7303,6 +7440,17 @@ %1$s de %2$s + + + Cancelar download + + Baixando: %1$s de %2$s (%3$s%%) + + Não há espaço suficiente para baixar seu backup. Para continuar, libere %1$s de espaço. + + Pular download + + "Não foi possível concluir seu último backup. Confira se o seu telefone está conectado à rede Wi-Fi e toque em \"Fazer backup agora\" para tentar novamente." @@ -7356,18 +7504,18 @@ A otimização de armazenamento só pode ser usada com o plano pago do Signal Backups. Atualize seu plano de backup para começar a usar esta função. - Subscribe for %1$s/month + Assine por %1$s/mês - This media is no longer available + Este arquivo de mídia não está mais disponível. - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Seu backup atual do Signal inclui apenas os arquivos de mídia do dia anterior. Atualize agora para começar a salvar todos os seus arquivos. + Seu backup atual do Signal inclui apenas os arquivos de mídia mais recentes, feitos nos últimos %1$d dias. Atualize agora para começar a salvar todos os seus arquivos. - Subscribe for %1$s/month + Assine por %1$s/mês Agora, quando você excluir algo, isso será apagado de todos os seus dispositivos. @@ -7415,6 +7563,8 @@ Download concluído O backup será criado durante a noite. + + Assinatura inativa Plano de backup @@ -7423,8 +7573,12 @@ %1$s/mês Seu plano de backup é gratuito - + Renova em %1$s + + Expira em %1$s + + Expirou em %1$s Faça backup do seu histórico de mensagens para nunca perder dados ao comprar um novo telefone ou reinstalar o Molly. @@ -7469,6 +7623,10 @@ Fazer backup manual Digite o PIN, a senha ou o padrão de desbloqueio do seu dispositivo. + + Reativar backups + + Os backups foram desativados e os dados excluídos do sistema seguro de armazenamento do Signal. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b4b9d6522a..96a31bd4ee 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -365,6 +365,8 @@ Chats Mensagens + + Tipos de chat Mensagem %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Está tudo pronto. Inicie a sua cópia de segurança agora. Dependendo do tamanho da sua cópia de segurança, isto pode demorar algum tempo. Pode usar o seu telemóvel normalmente enquanto a cópia de segurança é efetuada. @@ -1966,6 +1968,7 @@ +%1$d convidado +%1$d convidados + %1$d grupo adicional %1$d grupos adicionais @@ -1992,6 +1995,7 @@ Não foi encontrado nenhum dispositivo. Erro de rede. Código QR inválido. + Lamentamos mas tem demasiados dispositivos associados, tente remover alguns Lamento mas este não é um código QR de associação ao dispositivo válido. Associar a um dispositivo Signal? @@ -2014,11 +2018,13 @@ Submeter frase-chave Frase-chave inválida! Desbloquear o Molly + Molly Android - Ecrã de bloqueio Mapa + Colocar pino Aceitar endereço @@ -2522,6 +2528,7 @@ Mensagem do Signal + Mais @@ -2553,6 +2560,7 @@ Sem autocolantes instalados Os autocolantes das mensagens recebidas irão aparecer aqui Sem título + Desconhecido @@ -2774,6 +2782,7 @@ Multimédia atualmente indisponível. Não foi possível reproduzir multimédia. + Erro ao encontrar mensagem. Não foi possível encontrar uma aplicação capaz de partilhar este média. Fechar @@ -2845,6 +2854,7 @@ Mensagens Chamadas + Falhas Cópias de segurança Estado do bloqueio @@ -2854,6 +2864,7 @@ Desconhecido(a) Notas de voz Um contacto juntou-se ao Signal + Sem atividade disponível para abrir as definições do canal de notificações. Ligação em segundo plano @@ -3638,10 +3649,12 @@ Todo o histórico de mensagens será eliminado permanentemente de todos os dispositivos. Esta ação não pode ser revertida. Eliminar tudo agora + Para sempre 1 ano 6 meses 30 dias + Ilimitado %1$s mensagem @@ -3666,6 +3679,7 @@ Exibir Toque Tamanho da letra da mensagem + Prioridade Solucionar problemas de notificações @@ -3894,6 +3908,7 @@ Digitalize o código QR do endereço do beneficiário + Pedido Pagar Saldo disponível: %1$s @@ -4025,6 +4040,7 @@ Apenas pode afixar até %1$d chats + Fotografia de contacto Arquivado @@ -4033,6 +4049,10 @@ Novo chat Abrir câmara Ainda não existem chats.\nComece por enviar uma mensagem a um amigo. + + Não há chats para ver + + Definições da pasta @@ -4265,6 +4285,7 @@ Cópias de segurança dos chats Transferir conta Transferir conta para um dispositivo Android novo + Introduza a frase-chave da cópia de segurança Restaurar Impossível importar backups de novas versões do Signal @@ -4472,6 +4493,7 @@ Não foi possível abrir as \'Definições Wi-Fi\'. Por favor, ative o Wi-Fi manualmente. + Conceder permissão de localização Ativar os serviços de localização Ativar o Wi-Fi @@ -4725,6 +4747,7 @@ Partilhar + Enviar , %1$s @@ -5028,6 +5051,119 @@ Teclado Enviar com enter + + Pastas de chats + + Adicionar uma pasta de chats + + + + Organize os seus chats em pastas e alterne rapidamente entre eles na sua lista de chats. + + Pastas + + Criar uma pasta + + Todos os chats + + Pastas sugeridas + + Não lida + + Mensagens não lidas de todos os chats + + Chats 1:1 + + Só mensagens de chats diretos + + Grupos + + Só mensagens de chats de grupo + + Adicionar + + %1$s pasta adicionada. + + Editar pasta + + Eliminar pasta + + Adicionar nova pasta + + Silenciar tudo + + Reorganizar pastas + + Marcar tudo como lido + + + %1$d tipo de chat + %1$d tipos de chat + + + + %1$d chat + %1$d chats + + + + %1$d chat excluído + %1$d chats excluídos + + + + + Criar uma pasta + + Nome da pasta (obrigatório) + + Chats incluídos + + Adicionar chats + + Escolha os chats que quer que apareçam nesta pasta. + + Exceções + + Excluir chats + + Escolha chats que não quer que apareçam nesta pasta. + + Mostrar apenas chats não lidos + + Quando ativado, só chats com mensagens não lidas é que serão mostrados nesta pasta. + + Incluir chats silenciados + + Criar + + Criar pasta? + + Quer criar a pasta de chats \"%1$s\"? + + Criar pasta + + Editar pasta + + Guardar + + Guardar alterações? + + Quer guardar as alterações que fez a esta pasta de chats? + + Guardar alterações + + Descartar + + Eliminar pasta + + Eliminar esta pasta de chats? + + + + Tipos de chat + + Concluído Mensagens @@ -5112,6 +5248,7 @@ Qualidade média + Qualidade da multimédia enviada Enviar multimédia com alta qualidade utilizará mais dados de internet. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + A sua subscrição de cópias de segurança expirou - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + O seu plano de cópias de segurança expirou porque não pôde ser renovado através do seu atual método de pagamento. Após %1$d dia, os ficheiros multimédia na sua cópia de segurança serão eliminados. + O seu plano de cópias de segurança expirou porque não pôde ser renovado através do seu atual método de pagamento. Após %1$d dias, os ficheiros multimédia na sua cópia de segurança serão eliminados. Pode voltar a pagar a qualquer altura para continuar a fazer cópias de segurança dos seus ficheiros. @@ -7254,9 +7391,9 @@ Se escolher \"Ignorar\", os ficheiros na sua cópia de segurança serão eliminados dentro de %1$d dias. - Your backups subscription failed to renew + A renovação da sua subscrição de cópias de segurança falhou - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Certifique-se que o seu método de pagamento está atualizado. Toque em \"Gerir subscrição\" e em \"Métodos de pagamento\" toque em \"Atualizar\". Não foi possível concluir a cópia de segurança @@ -7268,7 +7405,7 @@ Gerir assinatura - Subscribe for %1$s/month + Subscreva por %1$s/mês Transferir ficheiros multimédia @@ -7303,6 +7440,17 @@ %1$s de %2$s + + + Cancelar transferência + + A transferir: %1$s de %2$s (%3$s%%) + + Não há espaço suficiente para transferir a sua cópia de segurança. Para continuar, liberte %1$s de espaço. + + Saltar transferência + + "A sua última cópia de segurança não pôde ser completada. Certifique-se de que o seu telemóvel está ligado a uma rede Wi-Fi e toca em \"Fazer cópia de segurança\" para tentar outra vez." @@ -7356,18 +7504,18 @@ A otimização do armazenamento só pode ser usada com a categoria paga das Cópias de Segurança do Signal. Faça upgrade ao seu plano de cópias de segurança para começar a usar esta funcionalidade. - Subscribe for %1$s/month + Subscreva por %1$s/mês - This media is no longer available + Este ficheiro multimédia já não está disponível - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + O seu atual plano de cópias de segurança do Signal inclui o seu último dia de ficheiros multimédia. Para começar a fazer cópias de segurança de todos os seus ficheiros multimédia, atualize agora. + O seu atual plano de cópias de segurança do Signal inclui os seus últimos %1$d dias de ficheiros multimédia. Para começar a fazer cópias de segurança de todos os seus ficheiros multimédia, atualize agora. - Subscribe for %1$s/month + Subscreva por %1$s/mês A eliminação está agora sincronizada entre todos os seus dispositivos @@ -7415,6 +7563,8 @@ Download completo A cópia de segurança será criada durante a noite. + + Subscrição inativa Plano de cópia de segurança @@ -7423,8 +7573,12 @@ %1$s/mês O seu plano de cópia de segurança é grátis - + Renovações %1$s + + Expira a %1$s + + Expira a %1$s Efetue cópias de segurança do seu histórico de mensagens para nunca perder dados ao mudar de telemóvel ou reinstalar o Molly. @@ -7469,6 +7623,10 @@ Cópia de segurança manual Insira o pin, palavra-passe ou padrão do seu dispositivo. + + Reativar cópias de segurança + + As cópias de segurança foram desativadas e os seus dados foram eliminados do serviço de armazenamento seguro do Signal. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c579f98973..be0ded5e2e 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -368,6 +368,8 @@ Conversații Mesaje + + Tipuri de conversații Mesaj %1$s @@ -833,7 +835,7 @@ - You\'re all set. Start your backup now. + Ești gata. Începe acum backup-ul. În funcție de dimensiunea copiei tale de rezervă, acest lucru poate dura mult timp. Poți utiliza telefonul așa cum o faci în mod normal în timp ce are loc backup-ul. @@ -2027,6 +2029,7 @@ +%1$d invitați %1$d de invitați + %1$d grup adițional %1$d grupuri adiționale @@ -2054,6 +2057,7 @@ Nu a fost găsit niciun dispozitiv. Eroare rețea. Cod QR invalid. + Ne pare rău, ai deja prea multe dispozitive asociate, încearcă să elimini câteva Ne pare rău, acest cod de asociere QR este invalid. Asociez un dispozitiv Signal? @@ -2077,11 +2081,13 @@ Trimite parola Parolă incorectă! Deblochează Molly + Molly Android - Ecran de Blocare Hartă + Alege marcaj Acceptă adresa @@ -2607,6 +2613,7 @@ Mesaj Signal + Mai multe @@ -2638,6 +2645,7 @@ Nici un autocolant instalat Autocolantele din mesajele primite se vor afișa aici Fără titlu + Necunoscut @@ -2860,6 +2868,7 @@ Media nu mai este disponibilă. Nu s-a putut porni fișierul media. + Eroare la găsirea mesajului. Nu pot găsi o aplicație pentru a distribui acest tip media. Închide @@ -2933,6 +2942,7 @@ Mesaje Apeluri + Erori Backup-uri Stare blocare @@ -2942,6 +2952,7 @@ Necunoscut Notițe vocale Un contact s-a alăturat pe Signal + Nu există activitate disponibilă pentru a deschide setările canalului de notificare. Conexiune de fundal @@ -3739,10 +3750,12 @@ Tot istoricul mesajelor va fi eliminat definitiv de pe toate dispozitivele. Această acțiune este ireversibilă. Șterge tot acum + Pentru totdeauna 1 an 6 luni 30 zile + Niciunul %1$s mesaj @@ -3768,6 +3781,7 @@ Afișează Ton de apel Mărimea textului + Prioritate Rezolvă notificările @@ -3996,6 +4010,7 @@ Scanează codul QR al adresei beneficiarului + Cerere Plătește Sold disponibil: %1$s @@ -4128,6 +4143,7 @@ Poți fixa până la %1$d conversații + Poză Contact Arhivat @@ -4136,6 +4152,10 @@ Conversație nouă Deschide Camera Nu există conversații. Începe prin a trimite unui prieten un mesaj. + + Nu există conversații de afișat + + Setări pentru dosare @@ -4376,6 +4396,7 @@ Backup-uri pt. conversații Transfer cont Transfer cont pe un nou dispozitiv Android + Introdu parola pentru backup Restaurează Nu se importă backup-uri din versiuni mai noi de Signal @@ -4583,6 +4604,7 @@ Nu se pot deschide setările Wi-Fi. Te rugăm să activezi manual Wi-Fi. + Acordă permisiunea pentru locație Activare servicii de localizare Activare Wi-Fi @@ -4843,6 +4865,7 @@ Distribuie + Trimite , %1$s @@ -5147,6 +5170,122 @@ Tastatură Trimite cu enter + + Dosare de conversații + + Adaugă un dosar de conversații + + + + Organizează-ți conversațiile în dosare și schimbă între ele pe lista de conversații. + + Dosare + + Creează un dosar + + Toate conversațiile + + Dosare sugerate + + Necitite + + Mesaje necitite din toate conversațiile + + Conversații 1 la 1 + + Numai mesajele din conversațiile directe + + Grupuri + + Numai mesajele din conversațiile de grup + + Adaugă + + Dosarul %1$s a fost adăugat. + + Editează dosarul + + Elimină dosarul + + Adaugă un dosar nou + + Silențios pentru toate + + Reordonează dosarele + + Marchează tot ca citit + + + %1$d tip de conversație + %1$d tipuri de conversații + %1$d de tipuri de conversații + + + + %1$d conversație + %1$d conversații + %1$d de conversații + + + + %1$d conversație exclusă + %1$d conversații excluse + %1$d de conversații excluse + + + + + Creează un dosar + + Numele dosarului (necesar) + + Conversații incluse + + Adaugă conversații + + Alege conversațiile care dorești să apară în acest dosar. + + Excepții + + Exclude conversațiile + + Alege ce conversații nu vrei să apară în acest dosar. + + Arată doar conversații necitite + + Când e activată, doar conversațiile cu mesaje necitite vor apărea în acest dosar. + + Include conversațiile silențioase + + Creează + + Creezi dosarul? + + Vrei să creezi dosarul de conversații „%1$s“? + + Creează dosar + + Editează dosarul + + Salvează + + Salvezi modificările? + + Vrei să salvezi modificările pe care le-ai făcut în acest dosar de conversații? + + Salvează modificările + + Renunță + + Elimină dosarul + + Elimini acest dosar de conversații? + + + + Tipuri de conversații + + Gata Mesaje @@ -5232,6 +5371,7 @@ Calitate Media + Calitatea fișierelor media trimise Trimiterea fișierelor media la calitate înaltă va duce la un consum mai mare de date. @@ -7388,12 +7528,12 @@ - Your backups subscription expired + Abonamentul pentru backup-uri a expirat - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Planul tău de backup a expirat deoarece nu a putut fi reînnoit cu metoda ta de plată actuală. După %1$d zi, fișierele tale din backup vor fi eliminate. + Planul tău de backup a expirat deoarece nu a putut fi reînnoit cu metoda ta de plată actuală. După %1$d zile, fișierele tale din backup vor fi eliminate. + Planul tău de backup a expirat deoarece nu a putut fi reînnoit cu metoda ta de plată actuală. După %1$d de zile, fișierele tale din backup vor fi eliminate. Poți începe să plătești din nou pentru backup în orice moment, pentru a continua să îți salvezi toate fișierele media. @@ -7412,9 +7552,9 @@ Dacă alegi \"Sari peste\", fișierele din backup vor fi eliminate în %1$d de zile. - Your backups subscription failed to renew + Abonamentul tău pentru backup nu s-a reînnoit - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Asigură-te că metoda ta de plată este actualizată. Atinge Gestionează abonamentul și sub Metode de plată, atinge Actualizare. Nu s-a putut finaliza backup-ul @@ -7426,7 +7566,7 @@ Gestionare abonament - Subscribe for %1$s/month + Abonează-te pentru %1$s/lună Descarcă media acum @@ -7461,6 +7601,17 @@ %1$s din %2$s + + + Anulează descărcarea + + Se descarcă: %1$s din %2$s (%3$s%%) + + Nu este suficient spațiu pentru a descărca backup-ul. Pentru a continua, eliberează %1$s din spațiu. + + Omite descărcarea + + "Ultimul backup nu a putut fi finalizat. Asigură-te că telefonul este conectat la Wi-Fi și atinge Back-up acum pentru a încerca din nou." @@ -7514,19 +7665,19 @@ Optimizarea stocării poate fi utilizată numai cu nivelul plătit al Signal Backups. Actualizează-ți planul de backup pentru a începe să folosești această funcție. - Subscribe for %1$s/month + Abonează-te pentru %1$s/lună - This media is no longer available + Acest fișier nu mai este disponibil - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Planul tău actual de rezervă Signal include %1$d zi cu cele mai recente fișiere media. Ca să începi să faci backup pentru toate fișierele, realizează un upgrade acum. + Planul tău actual de rezervă Signal include %1$d zile cu cele mai recente fișiere media. Ca să începi să faci backup pentru toate fișierele, realizează un upgrade acum. + Planul tău actual de rezervă Signal include %1$d de zile cu cele mai recente fișiere media. Ca să începi să faci backup pentru toate fișierele, realizează un upgrade acum. - Subscribe for %1$s/month + Abonează-te pentru %1$s/lună Eliminarea este acum sincronizată pe toate dispozitivele tale @@ -7574,6 +7725,8 @@ Descărcare completă Backup-ul va fi creat peste noapte. + + Abonament inactiv Plan de back-up @@ -7582,8 +7735,12 @@ %1$s/lună Planul tău de back-up este gratuit - + Se reînnoiește %1$s + + Expiră la %1$s + + Expiră la %1$s Fă back-up pentru istoricul mesajelor, astfel încât niciodată să nu pierzi date, atunci când îți iei un telefon nou sau reinstalezi Molly. @@ -7628,6 +7785,10 @@ Efectuează backup manual Introdu codul PIN, parola sau șablonul pentru dispozitivul tău. + + Reactivează backup-urile + + Backup-urile au fost dezactivate și datele tale au fost eliminate din serviciul de stocare securizată de la Signal. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 010dc73fca..8844b21f55 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -371,6 +371,8 @@ Чаты Сообщения + + Типы чатов Сообщение %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Всё готово. Начните резервное копирование. Из-за большого размера резервной копии это может занять много времени. Во время резервного копирования вы можете пользоваться своим телефоном как обычно. @@ -2088,6 +2090,7 @@ +%1$d приглашено +%1$d приглашено + ещё %1$d группы ещё %1$d групп @@ -2116,6 +2119,7 @@ Устройство не найдено. Ошибка сети. Неверный QR-код. + К сожалению, у вас уже привязано слишком много устройств, попробуйте отвязать некоторые из них К сожалению, это неправильный QR-код для привязки устройства. Привязать устройство Signal? @@ -2140,11 +2144,13 @@ Подтвердить парольную фразу Неверная парольная фраза! Разблокировать Molly + Molly Android - Экран блокировки Карта + Поставить метку Принять адрес @@ -2692,6 +2698,7 @@ Сообщение Signal + Больше @@ -2723,6 +2730,7 @@ Нет установленных стикеров Стикеры из входящих сообщений появятся здесь Безымянный + Неизвестно @@ -2946,6 +2954,7 @@ Медиафайл больше не доступен. Не удалось воспроизвести медиафайл. + Ошибка при поиске сообщения Не найдено приложение, в котором можно поделиться этим медиафайлом. Закрыть @@ -3021,6 +3030,7 @@ Сообщения Звонки + Сбои Резервные копии Статус блокировки @@ -3030,6 +3040,7 @@ Неизвестный Голосовые заметки Контакт присоединился к Signal + Нет доступной активности для открытия настроек категорий уведомлений. Фоновое соединение @@ -3840,10 +3851,12 @@ Вся история сообщений будет безвозвратно удалена со всех устройств. Это действие не может быть отменено. Удалить всё сейчас + Бессрочно 1 год 6 месяцев 30 дней + Нет %1$s сообщение @@ -3870,6 +3883,7 @@ Показывать Мелодия Размер шрифта сообщения + Приоритет Устранение неполадок с уведомлениями @@ -4098,6 +4112,7 @@ Просканируйте QR-код адреса получателя платежа. + Запросить Заплатить Доступный баланс: %1$s @@ -4231,6 +4246,7 @@ Вы можете прикрепить только до %1$d чатов + Фотография контакта В архиве @@ -4239,6 +4255,10 @@ Новый чат Открыть камеру Ещё нет чатов.\nОтправьте другу своё первое сообщение. + + Нет чатов для отображения + + Настройки папки @@ -4487,6 +4507,7 @@ Резервные копии чатов Перенести учётную запись Перенести учётную запись на новое Android-устройство + Введите парольную фразу резервной копии Восстановить Невозможно импортировать более новые резервные копии @@ -4694,6 +4715,7 @@ Не удалось открыть настройки Wi-Fi. Пожалуйста, включите Wi-Fi вручную. + Предоставьте разрешение на доступ к местоположению Включите службы геолокации Включите Wi-Fi @@ -4961,6 +4983,7 @@ Поделиться + Отправить , %1$s @@ -5266,6 +5289,125 @@ Клавиатура Отправка с помощью ввода + + Папки чатов + + Добавить папку чата + + + + Организуйте свои чаты в папки и быстро переключайтесь между ними в списке чатов. + + Папки + + Создать папку + + Все чаты + + Рекомендуемые папки + + Непрочитанное + + Непрочитанные сообщения из всех чатов + + Личные чаты + + Только сообщения из личных чатов + + Группы + + Только сообщения из групповых чатов + + Добавить + + Папка добавлена: %1$s. + + Изменить папку + + Удалить папку + + Добавить новую папку + + Выключить звук для всех + + Изменить порядок папок + + Отметить все как прочитанные + + + %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$s»? + + Создать папку + + Изменить папку + + Сохранить + + Сохранить изменения? + + Вы хотите сохранить изменения, которые вы внесли в эту папку чата? + + Сохранить изменения + + Сбросить + + Удалить папку + + Удалить эту папку чата? + + + + Типы чатов + + Готово Сообщения @@ -5352,6 +5494,7 @@ Качество медиа + Качество отправляемого медиа Отправление медиа в высоком качестве использует больше данных. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Срок действия подписки на резервное копирование истёк - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Срок действия плана резервного копирования истек, так как его не удалось продлить с помощью текущего способа оплаты. По истечении %1$d дня медиафайлы из резервной копии будут удалены. + Срок действия плана резервного копирования истек, так как его не удалось продлить с помощью текущего способа оплаты. По истечении %1$d дней медиафайлы из резервной копии будут удалены. + Срок действия плана резервного копирования истек, так как его не удалось продлить с помощью текущего способа оплаты. По истечении %1$d дней медиафайлы из резервной копии будут удалены. + Срок действия плана резервного копирования истек, так как его не удалось продлить с помощью текущего способа оплаты. По истечении %1$d дня медиафайлы из резервной копии будут удалены. Вы можете снова начать оплату за резервное копирование в любое время, чтобы продолжить создавать резервные копии всех своих медиафайлов. @@ -7570,9 +7713,9 @@ Если вы выберете «Пропустить», медиафайлы из резервной копии будут удалены через %1$d дня. - Your backups subscription failed to renew + Не удалось продлить подписку на резервное копирование - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Проверьте актуальность вашего способа оплаты. Нажмите «Управлять подпиской» и в разделе «Способы оплаты» нажмите «Обновить». Не удалось выполнить резервное копирование @@ -7584,7 +7727,7 @@ Управлять подпиской - Subscribe for %1$s/month + Подписаться за %1$s/месяц Загрузить медиафайлы сейчас @@ -7619,6 +7762,17 @@ %1$s из %2$s + + + Отменить загрузку + + Загрузка: %1$s из %2$s (%3$s%%) + + Недостаточно места, чтобы загрузить вашу резервную копию. Чтобы продолжить, освободите %1$s места. + + Пропустить загрузку + + "Не удалось завершить последнее резервное копирование. Убедитесь, что телефон подключён к сети Wi-Fi, и нажмите «Создать резервную копию сейчас», чтобы повторить попытку." @@ -7672,20 +7826,20 @@ Оптимизация хранилища доступна только с платным уровнем резервного копирования Signal. Обновите план резервного копирования, чтобы начать использовать эту функцию. - Subscribe for %1$s/month + Подписаться за %1$s/месяц - This media is no longer available + Эти медиафайлы больше не доступны - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Ваш текущий план резервного копирования Signal включает в себя медиафайлы за %1$d последний день. Чтобы начать резервное копирование всех медиафайлов, обновите план прямо сейчас. + Ваш текущий план резервного копирования Signal включает в себя медиафайлы за %1$d последних дня. Чтобы начать резервное копирование всех медиафайлов, обновите план прямо сейчас. + Ваш текущий план резервного копирования Signal включает в себя медиафайлы за %1$d последних дней. Чтобы начать резервное копирование всех медиафайлов, обновите план прямо сейчас. + Ваш текущий план резервного копирования Signal включает в себя медиафайлы за %1$d последнего дня. Чтобы начать резервное копирование всех медиафайлов, обновите план прямо сейчас. - Subscribe for %1$s/month + Подписаться за %1$s/месяц Удаление теперь происходит синхронно на всех ваших устройствах @@ -7733,6 +7887,8 @@ Скачивание завершено Резервная копия будет создана за одну ночь. + + Подписка неактивна План резервного копирования @@ -7741,8 +7897,12 @@ %1$s/месяц У вас бесплатный план резервного копирования - + Продлится %1$s + + Истекает %1$s + + Истекла %1$s Создайте резервную копию истории сообщений, и вы не потеряете ни одно сообщение при покупке нового телефона или переустановке Molly. @@ -7787,6 +7947,10 @@ Резервное копирование вручную Пожалуйста, введите Пин-код, пароль или графический ключ вашего устройства. + + Включить резервное копирование снова + + Резервное копирование было отключено, а ваши данные — удалены из защищённого хранилища Signal. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index ff6ef003b2..581d2468dd 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -371,6 +371,8 @@ Čety Správy + + Typy četu Správa %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Hotovo Môžete spustiť zálohovanie. V závislosti od veľkosti zálohy to môže trvať dlhšie. Počas zálohovania môžete telefón používať ako obvykle. @@ -2088,6 +2090,7 @@ +%1$d pozvaných +%1$d pozvaných + %1$d ďalšia skupina %1$d ďalšie skupiny @@ -2116,6 +2119,7 @@ Nebolo nájdené žiadne zariadenie. Chyba siete. Neplatný QR kód. + Máte príliš veľa pripojených zariadení, skúste niektoré odpojiť Tento QR kód neslúži na pridanie zariadenia. Pridať zariadenie so Signalom? @@ -2140,11 +2144,13 @@ Odoslať heslo Nesprávne heslo! Odomknúť Molly + Molly Android - Zámok obrazovky Mapa + Umiestniť značku Prijať adresu @@ -2692,6 +2698,7 @@ Signal správa + Viac @@ -2723,6 +2730,7 @@ Žiadne nainštalované nálepky Tu uvidíte nálepky z prichádzajúcich správ Nepomenovaná + Neznáme @@ -2946,6 +2954,7 @@ Médiá už nie sú dostupné. Nemožno prehrať médiá. + Chyba pri vyhľadávaní správy. Nepodarilo sa nájsť aplikáciu schopnú zdieľať tento typ súboru. Zatvoriť @@ -3021,6 +3030,7 @@ Správy Volania + Chyby Zálohy Stav zámku @@ -3030,6 +3040,7 @@ Neznáma Hlasové poznámky Váš kontakt začal používať Signal + Na otvorenie nastavení kanála upozornení nie je k dispozícii žiadna aktivita. Pripojenie na pozadí @@ -3840,10 +3851,12 @@ Celá história správ bude natrvalo odstránená zo všetkých zariadení. Túto akciu nie je možné vrátiť späť. Zmazať všetky teraz + Navždy 1 rok 6 mesiacov 30 dní + Žiadny %1$s správa @@ -3870,6 +3883,7 @@ Zobraziť Zvonenie Veľkosť písma správy + Priorita Riešiť problémy s upozorneniami @@ -4098,6 +4112,7 @@ Naskenujte QR kód adresu príjemcu platby + Žiadosť Zaplať Disponibilný zostatok: %1$s @@ -4231,6 +4246,7 @@ Môžete pripnúť maximálne %1$d čety + Fotka kontaktu Archivované @@ -4239,6 +4255,10 @@ Nový čet Otvoriť fotoaparát Zatiaľ tu nie sú žiadne čety.\nZačnite poslaním správy priateľovi. + + Žiadne čety na zobrazenie + + Nastavenia priečinka @@ -4487,6 +4507,7 @@ Zálohy četov Preniesť účet Preniesť účet do nového Android zariadenia + Zadajte heslo pre zálohy Obnovenie Zálohy z novších verzií Signalu nie je možné importovať @@ -4694,6 +4715,7 @@ Nie je možné otvoriť Wi-Fi nastavenia. Prosím, zapnite Wi-Fi. + Povoliť prístup k polohe Zapnúť služby polohy Zapnúť Wi-Fi @@ -4961,6 +4983,7 @@ Zdieľať + Poslať , %1$s @@ -5266,6 +5289,125 @@ Klávesnica Odoslať stlačením tlačidla „Enter“ + + Priečinky četov + + Pridať priečinok četov + + + + Usporiadajte si čety do priečinkov a rýchlo medzi nimi prepínajte v zozname četov. + + Priečinky + + Vytvoriť priečinok + + Všetky čety + + Odporúčané priečinky + + Neprečítané + + Neprečítané správy zo všetkých četov + + Čety 1:1 + + Iba správy z priamych četov + + Skupiny + + Iba správy zo skupinových četov + + Pridať + + Bol pridaný priečinok %1$s. + + Upraviť priečinok + + Vymazať priečinok + + Pridať nový priečinok + + Stlmiť všetky + + Zmeniť poradie priečinkov + + Označiť všetko ako prečítané + + + %1$d typ četu + %1$d typy četu + %1$d typu četu + %1$d typov četu + + + + %1$d čet + %1$d čety + %1$d četu + %1$d četov + + + + %1$d vylúčený čet + %1$d vylúčené čety + %1$d vylúčeného četu + %1$d vylúčených četov + + + + + Vytvoriť priečinok + + Názov priečinka (povinné) + + Zahrnuté čety + + Pridať čety + + Vyberte čety, ktoré sa majú zobrazovať v tomto priečinku. + + Výnimky + + Vylúčiť čety + + Vyberte čety, ktoré nechcete zobrazovať v tomto priečinku. + + Zobraziť iba neprečítané čety + + Ak je táto možnosť povolená, v tomto priečinku sa zobrazia iba čety s neprečítanými správami. + + Zahrnúť stlmené čety + + Vytvoriť + + Vytvoriť priečinok? + + Chcete vytvoriť priečinok četov „%1$s“? + + Vytvoriť priečinok + + Upraviť priečinok + + Uložiť + + Uložiť zmeny? + + Chcete uložiť zmeny, ktoré ste vykonali v tomto priečinku četov? + + Uložiť zmeny + + Zahodiť + + Vymazať priečinok + + Vymazať tento priečinok četov? + + + + Typy četu + + Hotovo Správy @@ -5352,6 +5494,7 @@ Kvalita médií + Kvalita odoslaných médií Odosielanie médií vo vysokej kvalite využije viac dát. @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Platnosť vášho predplatného záloh vypršala - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Platnosť vášho zálohovacieho plánu vypršala, pretože ho nebolo možné obnoviť pomocou vášho aktuálneho spôsobu platby. Za %1$d deň budú médiá vo vašej zálohe vymazané. + Platnosť vášho zálohovacieho plánu vypršala, pretože ho nebolo možné obnoviť pomocou vášho aktuálneho spôsobu platby. Po %1$d dňoch budú médiá vo vašej zálohe vymazané. + Platnosť vášho zálohovacieho plánu vypršala, pretože ho nebolo možné obnoviť pomocou vášho aktuálneho spôsobu platby. Po %1$d dňoch budú médiá vo vašej zálohe vymazané. + Platnosť vášho zálohovacieho plánu vypršala, pretože ho nebolo možné obnoviť pomocou vášho aktuálneho spôsobu platby. Po %1$d dňoch budú médiá vo vašej zálohe vymazané. Kedykoľvek môžete začať opäť platiť za zálohy. Budete tak môcť pokračovať v zálohovaní všetkých svojich médií. @@ -7570,9 +7713,9 @@ Ak vyberiete možnosť Preskočiť, médiá vo vašej zálohe sa vymažú o %1$d dní. - Your backups subscription failed to renew + Vaše predplatné záloh sa nepodarilo obnoviť - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Skontrolujte, či je váš spôsob platby aktuálny. Ťuknite na Spravovať predplatné a v časti Spôsoby platby ťuknite na Aktualizovať. Zálohovanie sa nepodarilo dokončiť @@ -7584,7 +7727,7 @@ Spravovať predplatné - Subscribe for %1$s/month + Predplatiť za %1$s mesačne Stiahnuť médiá teraz @@ -7619,6 +7762,17 @@ %1$s z %2$s + + + Zrušiť sťahovanie + + Sťahuje sa: %1$s z %2$s (%3$s %%) + + Nedostatok miesta na stiahnutie zálohy. Ak chcete pokračovať, uvoľnite %1$s miesta. + + Preskočiť sťahovanie + + "Vašu poslednú zálohu sa nepodarilo dokončiť. Uistite sa, že váš telefón je pripojený k sieti Wi-Fi a skúste to znova ťuknutím na možnosť Zálohovať teraz." @@ -7672,20 +7826,20 @@ Optimalizáciu úložiska je možné využiť iba v prípade, ak používate platenú verziu Signal záloh. Ak chcete používať túto funkciu, aktualizujte svoj plán zálohovania. - Subscribe for %1$s/month + Predplatiť za %1$s mesačne - This media is no longer available + Toto médium už nie je dostupné - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Váš aktuálny zálohovací plán Signal zahŕňa váš posledný %1$d deň médií. Ak chcete začať zálohovať všetky svoje médiá, upgradujte teraz. + Váš aktuálny zálohovací plán Signal zahŕňa vaše posledné %1$d dni médií. Ak chcete začať zálohovať všetky svoje médiá, upgradujte teraz. + Váš aktuálny zálohovací plán Signal zahŕňa vášho posledného %1$d dňa médií. Ak chcete začať zálohovať všetky svoje médiá, upgradujte teraz. + Váš aktuálny zálohovací plán Signal zahŕňa vašich posledných %1$d dní médií. Ak chcete začať zálohovať všetky svoje médiá, upgradujte teraz. - Subscribe for %1$s/month + Predplatiť za %1$s mesačne Vymazávanie je teraz synchronizované na všetkých vašich zariadeniach @@ -7733,6 +7887,8 @@ Sťahovanie dokončené Zálohovanie prebehne počas noci. + + Predplatné je neaktívne Plán zálohovania @@ -7741,8 +7897,12 @@ %1$s/mesiac Váš plán zálohovania je bezplatný - + Obnoví sa %1$s + + Platnosť vyprší %1$s + + Platnosť vypršala %1$s Zálohujte si históriu správ, aby ste pri výmene telefónu alebo opätovnom nainštalovaní Mollyu už nikdy neprišli o dáta. @@ -7787,6 +7947,10 @@ Manuálne zálohovanie Zadajte PIN kód, heslo alebo vzor svojho zariadenia. + + Znova povoliť zálohovanie + + Zálohovanie bolo vypnuté a vaše údaje boli vymazané zo zabezpečeného úložiska Signal. diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index e12122a000..55b9a3ab4e 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -371,6 +371,8 @@ Klepeti Sporočila + + Vrste klepeta Sporočilo %1$s @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Vse je pripravljeno. Začnite varnostno kopiranje. Glede na velikost varnostne kopije lahko to traja zelo dolgo. Med varnostnim kopiranjem lahko telefon uporabljate kot običajno. @@ -2088,6 +2090,7 @@ +%1$d povabljeni +%1$d povabljenih + %1$d dodatna skupina %1$d dodatni skupini @@ -2116,6 +2119,7 @@ Nobena naprava ni bila najdena. Napaka omrežja. Neveljavna koda QR. + Imate preveč registriranih naprav. Za povezavo nove najprej kakšno odstranite. Koda QR za povezavo naprav ni veljavna. Povežem z napravo Signal? @@ -2140,11 +2144,13 @@ Vnesite geslo Napačno geslo! Odkleni Molly + Molly Android - Zaklenjen zaslon Zemljevid + Izpusti Sprejmi naslov @@ -2692,6 +2698,7 @@ Sporočilo Signal + Več @@ -2723,6 +2730,7 @@ Brez nameščenih nalepk Tu bodo prikazane nalepke iz dohodnih sporočil. Brez naslova + Neznano @@ -2946,6 +2954,7 @@ Medijsko sporočilo ni več na voljo. Ni mogoče predvajati medijev. + Napaka pri iskanju sporočila. Ne najdem ustrezne aplikacije za delitev tega medija. Zapri @@ -3021,6 +3030,7 @@ Sporočila Klici + Napake Varnostne kopije Stanje zaklepa @@ -3030,6 +3040,7 @@ Neznano Glasovna sporočila Oseba iz imenika se je pridružila Signalu + Na voljo ni nobene aktivnosti povezane z obvestili. Povezava v ozadju @@ -3840,10 +3851,12 @@ Vsa zgodovina sporočil bo trajno odstranjena iz vseh naprav. Ta korak je nepovraten. Izbriši vse zdaj + Za vedno 1 leto 6 mesecev 30 dni + Brez %1$s sporočilo @@ -3870,6 +3883,7 @@ Prikaži Zvonjenje Velikost črk v sporočilu + Pomembnost Odpravljanje težav z obvestili @@ -4098,6 +4112,7 @@ Skeniraj kodo QR naslova prejemnika + Prošnja Plačaj Stanje: %1$s @@ -4231,6 +4246,7 @@ Pripnete lahko do %1$d klepetov + Slika stika Arhivirano @@ -4239,6 +4255,10 @@ Nov klepet Odpri kamero Zaenkrat brez klepetov.\nZačnite s sporočilom prijatelju_ici. + + Ni klepetov za prikaz + + Nastavitve mape @@ -4487,6 +4507,7 @@ Varnostno kopiranje klepetov Prenos računa Prenos računa na novo androidno napravo + Vnesite geslo varnostne kopije Obnovi Uvoz varnostnih kopij iz novejših različic ni mogoč @@ -4694,6 +4715,7 @@ Dostop do nastavitev Wi-Fi ni bil mogoč. Poskusite ročno vklopiti Wi-Fi. + Dovoli dostop do lokacije Vklopi lokacijske storitve Vklopi Wi-Fi @@ -4961,6 +4983,7 @@ Deli + Pošlji , %1$s @@ -5266,6 +5289,125 @@ Tipkovnica Pošlji z enter + + Mape klepetov + + Dodaj mapo klepeta + + + + Klepete organizirajte v mape in med njimi hitro preklapljajte na seznamu klepetov. + + Mape + + Ustvari mapo + + Vsi klepeti + + Predlagane mape + + Neprebrana + + Neprebrana sporočila iz vseh klepetov + + Klepeti 1:1 + + Samo sporočila iz neposrednih klepetov + + Skupine + + Samo sporočila iz skupinskih klepetov + + Dodaj + + %1$s dodana mapa. + + Uredi mapo + + Izbriši mapo + + Dodaj novo mapo + + Izklopi vse + + Spremeni vrstni red map + + Označi vse kot prebrano + + + %1$d vrsta klepeta + %1$d vrsti klepeta + %1$d vrste klepeta + %1$d vrst klepeta + + + + %1$d klepet + %1$d klepeta + %1$d klepeti + %1$d klepetov + + + + %1$d izključen klepet + %1$d izključena klepeta + %1$d izključeni klepeti + %1$d izključenih klepetov + + + + + Ustvari mapo + + Ime mape (obvezno) + + Vključeni klepeti + + Dodaj klepete + + Izberite klepete, ki jih želite prikazati v tej mapi. + + Izjeme + + Izključi klepete + + Izberite klepete, za katere ne želite, da so prikazani v tej mapi. + + Prikaži samo neprebrane klepete + + Če je ta možnost omogočena, bodo v tej mapi prikazani samo klepeti z neprebranimi sporočili. + + Vključi utišane klepete + + Ustvari + + Želite ustvariti mapo? + + Ali želite ustvariti mapo za klepet \"%1$s\" ? + + Ustvari mapo + + Uredi mape + + Shrani + + Želite shraniti spremembe? + + Ali želite shraniti spremembe, ki ste jih naredili v tej mapi klepeta? + + Shrani spremembe + + Zavrzi + + Izbriši mapo + + Želite izbrisati mapo klepeta? + + + + Vrste klepeta + + OK Sporočila @@ -5352,6 +5494,7 @@ Kvaliteta medisjkih datotek + Kvaliteta poslanih medijskih datotek Pošiljanje medijskih datotek boljše kvalitete porabi več podatkov. @@ -6172,7 +6315,7 @@ Količina - Thank you for supporting Signal. Your contribution helps fuel the mission of developing open source privacy technology that protects free expression and enables secure global communication for millions around the world. If you’re a resident of the United States, please retain this receipt for your tax records. Signal Technology Foundation is a tax–exempt nonprofit organization in the United States under section 501c3 of the Internal Revenue Code. Our Federal Tax ID is 82–4506840. + Hvala, ker podpirate Signal. S svojim prispevkom pomagate pri uresničevanju poslanstva razvoja odprtokodne tehnologije zasebnosti, ki varuje svobodo izražanja in omogoča varno globalno komunikacijo za milijone ljudi po vsem svetu. Če ste prebivalec Združenih držav Amerike, hranite to potrdilo za svojo davčno evidenco. Tehnološka fundacija Signal je neprofitna organizacija, ki je v Združenih državah Amerike oproščena plačila davkov v skladu z oddelkom 501c3 zakonika o notranjih prihodkih. Naša zvezna davčna številka je 82–4506840. %1$s - %2$s @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Vaša naročnina na varnostne kopije je potekla - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Vaš načrt varnostne kopije je potekel, ker ga ni bilo mogoče podaljšati z vašim trenutnim načinom plačila. Po %1$d dnevu bodo mediji v vaši varnostni kopiji izbrisani. + Vaš načrt varnostne kopije je potekel, ker ga ni bilo mogoče podaljšati z vašim trenutnim načinom plačila. Po %1$d dneh bodo mediji v vaši varnostni kopiji izbrisani. + Vaš načrt varnostne kopije je potekel, ker ga ni bilo mogoče podaljšati z vašim trenutnim načinom plačila. Po %1$d dneh bodo mediji v vaši varnostni kopiji izbrisani. + Vaš načrt varnostne kopije je potekel, ker ga ni bilo mogoče podaljšati z vašim trenutnim načinom plačila. Po %1$d dneh bodo mediji v vaši varnostni kopiji izbrisani. Kadarkoli lahko ponovno začnete plačevati za varnostne kopije in tako nadaljujete z varnostnim kopiranjem vseh svojih medijev. @@ -7570,9 +7713,9 @@ Če izberete \"Preskoči\", bodo mediji v varnostni kopiji izbrisani v %1$d dneh. - Your backups subscription failed to renew + Vaša naročnina na varnostne kopije se ni obnovila - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Prepričajte se, da je vaš način plačila posodobljen. Tapnite Upravljanje naročnine in v razdelku Plačila tapnite Posodobitev. Varnostne kopije ni bilo mogoče dokončati @@ -7584,7 +7727,7 @@ Upravljanje naročnine - Subscribe for %1$s/month + Naročite se za %1$s/mesec Prenos medijev @@ -7619,6 +7762,17 @@ %1$s od %2$s + + + Prekliči prenos + + Prenos %1$s od %2$s (%3$s %%) + + Premalo prostora za prenos varnostne kopije. Za nadaljevanje sprostite %1$s prostora. + + Preskoči prenos + + "Zadnje varnostne kopije ni bilo mogoče dokončati. Prepričajte se, da je vaš telefon povezan na Wi-Fi, in tapnite Izdelaj varnostno kopijo, da poskusite znova." @@ -7672,20 +7826,20 @@ Optimizacijo shranjevanja je mogoče uporabljati samo s plačljivo ravnjo Signal Backups. Za uporabo te funkcije nadgradite načrt varnostnega kopiranja. - Subscribe for %1$s/month + Naročite se za %1$s/mesec - This media is no longer available + Ta medij ni več na voljo - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Vaš trenutni načrt varnostne kopije Signal vključuje vaš zadnji %1$d dan medijev. Če želite začeti varnostno kopiranje vseh svojih medijev, nadgradite. + Vaš trenutni načrt varnostne kopije Signal vključuje vaša zadnja %1$d dneva medijev. Če želite začeti varnostno kopiranje vseh svojih medijev, nadgradite. + Vaš trenutni načrt varnostne kopije Signal vključuje vaša zadnje %1$d dni medijev. Če želite začeti varnostno kopiranje vseh svojih medijev, nadgradite. + Vaš trenutni načrt varnostne kopije Signal vključuje vaša zadnjih %1$d dni medijev. Če želite začeti varnostno kopiranje vseh svojih medijev, nadgradite. - Subscribe for %1$s/month + Naročite se za %1$s/mesec Brisanje je zdaj sinhronizirano v vseh napravah @@ -7733,6 +7887,8 @@ Prenos dokončan Varnostna kopija bo ustvarjena čez noč. + + Neaktivna naročnina Načrt varnostne kopije @@ -7741,8 +7897,12 @@ %1$s/mesec Vaš načrt varnostne kopije je brezplačen - + Obnovitev naročnine: %1$s + + Poteče %1$s + + Potekla je %1$s Ustvarite varnostno kopijo zgodovine sporočil, da ne izgubite podatkov, ko dobite nov telefon ali znova namestite Molly. @@ -7787,6 +7947,10 @@ Ročno varnostno kopiranje Vnesite pin, geslo ali vzorec naprave. + + Ponovna vključitev varnostnih kopij + + Varnostne kopije so bile izklopljene, vaši podatki pa izbrisani iz Signalove storitve varnega shranjevanja. diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index c12bac8d70..1b70addf3c 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -365,6 +365,8 @@ Bisedat Mesazhe + + Llojet e bisedave %1$s mesazhi @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Je gati. Nis kopjeruajtjen tani. Në varësi të madhësisë së kopjeruajtjes, kjo mund të zgjasë shumë. Mund ta përdorësh telefonin siç bën zakonisht ndërsa bëhet kopjeruajtja. @@ -1966,6 +1968,7 @@ +%1$d të ftuar +%1$d të ftuar + %1$d grup shtesë %1$d grupe shtesë @@ -1992,6 +1995,7 @@ S\\’u gjet pajisje. Gabim rrjeti. Kod QR i pavlefshëm. + Na ndjeni, keni tashmë shumë pajisje të lidhura, provoni të hiqni disa Na ndjeni, ky s\\’është kod QR lidhjeje pajisjeje i vlefshëm. Të lidhet një pajisje Signal? @@ -2014,11 +2018,13 @@ Parashtroje frazëkalimin Frazëkalim i pavlefshëm! Shkyçe Molly-in + Molly Android - Kyçje Ekrani Hartë + Lini pin Pranoje adresën @@ -2522,6 +2528,7 @@ Mesazhe Signal + Më tepër @@ -2553,6 +2560,7 @@ S\\’ka ngjitës të instaluar Këtu do të shfaqen ngjitësit prej mesazhesh të marrë Pa titull + I panjohur @@ -2774,6 +2782,7 @@ Media s\\’është më e passhme. Media nuk mund të luhet. + Gabim në gjetjen e mesazhit. S\\’gjendet dot një aplikacion për të ndarë me të tjerët këtë media. Mbylle @@ -2845,6 +2854,7 @@ Mesazhe Thirrje + Dështime Kopjeruajtje Gjendje kyçjeje @@ -2854,6 +2864,7 @@ I panjohur Shënime Zanore Kontakti zuri të përdorë Signal-in + Nuk ofrohet asnjë aktivitet për të hapur parametrat e kanalit të njoftimeve. Lidhje në prapaskenë @@ -3638,10 +3649,12 @@ I gjithë historiku i mesazheve do të fshihet përgjithmonë nga të gjitha pajisjet. Ky veprim nuk mund të zhbëhet. Fshije krejt tani + Përgjithmonë 1 vit 6 muaj 30 ditë + Asnjë %1$s mesazh @@ -3666,6 +3679,7 @@ Shfaq Zile Madhësi shkronjash mesazhi + Përparësi Diagnostikim i njoftimeve @@ -3894,6 +3908,7 @@ Skanoni adresën kod QR të të paguarit + Kërkesë Paguani Depozitë e përdorshme: %1$s @@ -4025,6 +4040,7 @@ Mund të fiksoni deri në %1$d biseda + Foto Kontakti Të arkivuar @@ -4033,6 +4049,10 @@ Bisedë e re Hape Kamerën Ende pa biseda.\nFillo duke i dërguar një mesazh një shoku. + + Nuk ka biseda për të shfaqur + + Parametrat e dosjeve @@ -4265,6 +4285,7 @@ Kopjeruajtje bisedash Shpërngulni llogari Shpërngulni llogari te një pajisje Android e re + Jepni frazëkalim kopjeruajtjeje Riktheje Kopjet rezervë s\'importohen nga versionet e reja Signal @@ -4472,6 +4493,7 @@ S’arrihet të hapen parametrat e Wi-Fi. Ju lutemi, hapeni dorazi Wi-Fi-n. + Akordoni leje vendndodhjesh Aktivizoni shërbime vendndodhjesh Hapni Wi-Fi @@ -4725,6 +4747,7 @@ Ndajeni Me të Tjerë + Dërgoje , %1$s @@ -5028,6 +5051,119 @@ Tastierë Dërgo me enter + + Dosjet e bisedës + + Shto dosje bisede + + + + Organizo bisedat në dosje dhe kalo shpejt ndërmjet tyre në listën e bisedave. + + Dosjet + + Krijo dosje + + Të gjitha bisedat + + Dosjet e sugjeruara + + Të palexuara + + Mesazhe të palexuara nga të gjitha bisedat + + Biseda 1:1 + + Vetëm mesazhe nga biseda direkte + + Grupet + + Mesazh vetëm nga bisedat në grup + + Shtoje + + Dosja %1$s u shtua. + + Përpuno dosjen + + Fshi dosjen + + Shto dosje të re + + Hiq zërin për të gjithë + + Rirendit dosjet + + Shënoji krejt si të lexuar + + + %1$d lloji i bisedës + %1$d llojet e bisedave + + + + %1$d bisedat + %1$d bisedë + + + + %1$d bisedë e përjashtuar + %1$d biseda të përjashtuara + + + + + Krijo dosje + + Emri i dosjes (kërkohet) + + Bisedat e përfshira + + Shto biseda + + Zgjidh bisedat që dëshiron të shfaqen në këtë dosje. + + Përjashtime + + Përjashto biseda + + Zgjidh bisedat që nuk dëshiron të shfaqen në këtë dosje. + + Shfaq vetëm biseda të palexuara + + Kur aktivizohet, në këtë dosje do të shfaqen vetëm biseda me mesazhe të palexuara. + + Përfshi bisedat pa zë + + Krijoje + + Të krijohet dosja? + + Dëshiron të krijosh dosjen \"%1$s\" të bisedës? + + Krijo dosje + + Përpuno dosjen + + Ruaj + + Të ruhen ndryshimet? + + Dëshiron të ruash ndryshimet që ke bërë në dosjen e bisedës? + + Ruaj ndryshimet + + Hidhe tej + + Fshi dosjen + + Të fshihet dosja e bisedë? + + + + Llojet e bisedave + + U bë Mesazhe @@ -5112,6 +5248,7 @@ Cilësi media + Cilësi medie të dërguar Dërgimi i medias në cilësi të lartë do të përdorë më tepër të dhëna. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Abonimi për kopjeruajtjen ka skaduar - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Plani i kopjeruajtjes ka skaduar sepse nuk mund të rinovohej me mënyrën aktuale të pagesës. Pas %1$d ditë media në kopjeruajtjen tënde do të fshihet. + Plani i kopjeruajtjes ka skaduar sepse nuk mund të rinovohej me mënyrën aktuale të pagesës. Pas %1$d ditësh media në kopjeruajtjen tënde do të fshihet. Mund të fillosh të paguash përsëri për kopjeruajtjet në çdo kohë për të vazhduar të kopjeruash të gjitha mediat. @@ -7254,9 +7391,9 @@ Nëse zgjedh \"Kapërce\", media e ruajtur në kopjeruajtje do të fshihet pas %1$d ditësh. - Your backups subscription failed to renew + Abonimi i kopjeruajtjeve nuk u rinovua - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Kontrollo për t\'u siguruar që mënyra jote e pagesës është e përditësuar. Kliko \"Menaxho abonimin\" dhe te \"Metodat e pagesës\" kliko \"Përditëso\". Kopjeruajtja nuk përfundoi @@ -7268,7 +7405,7 @@ Menaxho abonimin - Subscribe for %1$s/month + Abonohu për %1$s/muaj Shkarko media tani @@ -7303,6 +7440,17 @@ %1$s nga %2$s + + + Anulo shkarkimin + + Po shkarkohet: %1$s nga %2$s (%3$s%%) + + Nuk ka hapësirë të mjaftueshme për të shkarkuar kopjeruajtjen. Për të vazhduar liro %1$s hapësirë. + + Kapërce shkarkimin + + "Kopjeruajtja e fundit nuk mund të kryhej. Sigurohu që telefoni të jetë i lidhur me Wi-Fi dhe kliko \"Kopjeruaj tani\" për të provuar përsëri." @@ -7356,18 +7504,18 @@ Optimizimi i hapësirës ruajtëse mund të përdoret vetëm me nivelin e paguar të kopjeruajtjeve të Signal. Përmirëso planin e kopjeruajtjeve për të nisur përdorimin e veçorisë. - Subscribe for %1$s/month + Abonohu për %1$s/muaj - This media is no longer available + Media nuk disponohet më - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Plani aktual i kopjeruajtjes në Signal përfshin median e %1$d dite më parë. Për të filluar kopjeruajtjen e të gjitha mediave, përmirësohu tani. + Plani aktual i kopjeruajtjes në Signal përfshin median e%1$d ditëve më parë. Për të filluar kopjeruajtjen e të gjitha mediave, përmirësohu tani. - Subscribe for %1$s/month + Abonohu për %1$s/muaj Fshirja u sinkronizua tashmë në të gjitha pajisjet @@ -7410,11 +7558,13 @@ Lloji i kopjeruajtjes u ndryshua dhe abonimi u anulua - Pajtimi u anulua + Abonimi u anulua Shkarkimi përfundoi Kopjeruajtja do të krijohet brenda natës. + + Abonim joaktiv Plani i kopjeruajtjes @@ -7423,8 +7573,12 @@ %1$s/muaj Plani i kopjeruajtjes është falas - + Rinovohet më %1$s + + Skadon më %1$s + + Ka skaduar më %1$s Bëj kopjeruajtje të historikut të mesazheve në mënyrë që të mos i humbasësh kurrë të dhënat kur merr një telefon të ri ose kur e riinstalon sërish Molly. @@ -7469,6 +7623,10 @@ Kopjeruajtje manuale Të lutem, vendos pinin, fjalëkalimin ose vizimin e pajisjes. + + Riaktivizo kopjeruajtjet + + Kopjeruajtjet janë çaktivizuar dhe të dhënat e tua janë fshirë nga shërbimi i ruajtjes së sigurt të Signal. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 0abd00dfa2..f162e9736f 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -365,6 +365,8 @@ Ћаскања Поруке + + Типови ћаскања Порука: %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Све је спремно. Покрените креирање резервне копије. У зависности од величине ваше резервне копије, ово може дуже потрајати. Можете нормално да користите телефон док се прави резервна копија. @@ -1966,6 +1968,7 @@ Позвана је још %1$d особа Позвано је још њих %1$d + Додатних група: %1$d Додатних група: %1$d @@ -1992,6 +1995,7 @@ Није пронађен ниједан уређај. Дошло је до грешке са мрежом. QR код је неважећи. + Већ сте повезали превише уређаја. Пробајте да уклоните неке од њих Нажалост, ово није важећи QR код за повезивање уређаја. Желите ли да повежете уређај на ком је инсталиран Signal? @@ -2014,11 +2018,13 @@ Пошаљи приступну фразу Приступна фраза је неважећа! Откључај Molly + Molly Android – закључани екран Мапа + Спусти чиоду Прихвати адресу @@ -2522,6 +2528,7 @@ Signal порука + Више @@ -2553,6 +2560,7 @@ Нема инсталираних налепница Налепнице из долазних порука ће бити приказане овде Без наслова + Непознато @@ -2774,6 +2782,7 @@ Медиј више није доступан. Није могуће пустити медиј. + Грешка приликом тражења поруке. Није пронађена апликација која може да подели овај медиј. Затвори @@ -2845,6 +2854,7 @@ Поруке Позиви + Грешке Резервне копије Статус закључавања @@ -2854,6 +2864,7 @@ Непознато Гласовне белешке Контакт се придружио Signal-у + Није доступна активност за отварање подешавања канала за обавештења. Позадинска веза @@ -3638,10 +3649,12 @@ Целокупна историја порука биће трајно уклоњена са свих уређаја. Ова радња се не може опозвати. Избриши све сада + Заувек 1 годину 6 месеци 30 дана + Неограничен %1$s порука @@ -3666,6 +3679,7 @@ Прикажи Звоно Величина фонта поруке + Приоритет Решавање проблема у вези са обавештењима @@ -3894,6 +3908,7 @@ Скенирајте QR код за адресу примаоца уплате + Захтев Плати Доступан износ: %1$s @@ -4025,6 +4040,7 @@ Могуће је закачити највише %1$d ћаскања + Слика контакта Архивирано @@ -4033,6 +4049,10 @@ Ново ћаскање Отвори камеру Још нема ћаскања.\nЗапочните слањем поруке пријатељу. + + Нема ћаскања + + Подешавања фолдера @@ -4265,6 +4285,7 @@ Резерве ћаскања Пренесите налог Пренесите налог на нови Android уређај + Унесите приступну фразу за резервне копије Врати Није могуће увести резервну копију из новије верзије. @@ -4472,6 +4493,7 @@ Отварање подешавања Wi-Fi мреже није успело. Упалите Wi-Fi ручно. + Одобрите дозволу за приступ локацији Укључите локацију Укључите Wi-Fi @@ -4725,6 +4747,7 @@ Поделите + Пошаљи , %1$s @@ -5028,6 +5051,119 @@ Тастатура Шаљи помоћу тастера за нови ред + + Фолдери за ћаскања + + Додај фолдер за ћаскања + + + + Организујте ћаскања по фолдерима и брзо се пребацујте између њих на листи ћаскања. + + Фолдери + + Креирај фолдер + + Сва ћаскања + + Предложени фолдери + + Непрочитано + + Непрочитане поруке из свих ћаскања + + Ћаскања 1 на 1 + + Само поруке из директних ћаскања + + Групе + + Само поруке из групних ћаскања + + Додај + + Додат је фолдер %1$s. + + Измени фолдер + + Избриши фолдер + + Додај нови фолдер + + Искључи сва обавештења + + Промени редослед фолдера + + Означи све као прочитано + + + Типова ћаскања: %1$d + Типова ћаскања: %1$d + + + + Ћаскања: %1$d + Ћаскања: %1$d + + + + Изузетих ћаскања: %1$d + Изузетих ћаскања: %1$d + + + + + Креирај фолдер + + Назив фолдера (обавезно) + + Укључена ћаскања + + Додај ћаскања + + Изаберите ћаскања која желите да се појаве у овом фолдеру. + + Изузеци + + Искључи ћаскања + + Изаберите ћаскања која не желите да се појаве у овом фолдеру. + + Прикажи само непрочитана ћаскања + + Када је ова опција активирана, у овом фолдеру ће бити приказана само ћаскања са непрочитаним порукама. + + Укључи ћаскања са искљученим обавештењима + + Креирај + + Желите ли да креирате фолдер? + + Желите ли да креирате фолдер за ћаскања „%1$s“? + + Креирај фолдер + + Измени фолдер + + Сачувај + + Желите ли да сачувате промене? + + Желите ли да сачувате промене које сте направили у овом фолдеру за ћаскања? + + Сачувај промене + + Одбаци + + Избриши фолдер + + Желите ли да избришете овај фолдер за ћаскања? + + + + Типови ћаскања + + Готово Поруке @@ -5112,6 +5248,7 @@ Квалитет медија + Квалитет послатог медија Слање висококвалитетних медија ће користити више података. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Ваша претплата на резервне копије је истекла - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Ваш пакет за резервне копије је истекао јер се не може обновити са тренутним начином плаћања. Након %1$d дана, медији у резервној копији ће бити избрисани. + Ваш пакет за резервне копије је истекао јер се не може обновити са тренутним начином плаћања. Након %1$d дана, медији у резервној копији ће бити избрисани. Можете поново да почнете да плаћате резервне копије у било ком тренутку да бисте наставили са прављењем резервних копија свих својих медија. @@ -7254,9 +7391,9 @@ Ако изаберете „Прескочи“, медији у вашој резервној копији ће бити избрисани за %1$d дан(а). - Your backups subscription failed to renew + Ваша претплата на резервне копије није обновљена - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Проверите да ли је ваш начин плаћања ажуриран. Додирните „Управљање претплатом“ и под „Начини плаћања“ додирните „Ажурирај“. Прављење резервне копије није успело @@ -7268,7 +7405,7 @@ Управљање претплатом - Subscribe for %1$s/month + Претплатите се за %1$s месечно Преузми медије @@ -7303,6 +7440,17 @@ %1$s од %2$s + + + Откажи преузимање + + Преузима се: %1$s од %2$s (%3$s%%) + + Нема довољно простора за преузимање резервне копије. Да бисте наставили, ослободите %1$s простора. + + Прескочи преузимање + + "Последње креирање резервне копије није успело. Проверите да ли вам је телефон повезан на Wi-Fi, а затим додирните „Направи резервну копију“ да пробате поново." @@ -7356,18 +7504,18 @@ Оптимизација меморијског простора се може користити само ако имате плаћени пакет резервних копија на Signal-у. Надоградите пакет резервних копија да бисте могли да користите ову функционалност. - Subscribe for %1$s/month + Претплатите се за %1$s месечно - This media is no longer available + Овај медиј више није доступан - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Ваш тренутни пакет за резервне копије на Signal-у обухвата најскорији период од %1$d дана медија. Да бисте започели креирање резервних копија свих медија, надоградите се сада. + Ваш тренутни пакет за резервне копије на Signal-у обухвата најскорији период од %1$d дана медија. Да бисте започели креирање резервних копија свих медија, надоградите се сада. - Subscribe for %1$s/month + Претплатите се за %1$s месечно Брисање је сада синхронизовано на свим вашим уређајима @@ -7415,6 +7563,8 @@ Преузимање је завршено Резервна копија ће бити направљена преко ноћи. + + Претплата је неактивна План за резервне копије @@ -7423,8 +7573,12 @@ %1$s месечно Овај план за резервне копије је бесплатан - + Обнавља се на дан %1$s + + Истиче %1$s + + Истекло је %1$s Направите резервне копије историје порука да не бисте изгубили податке када набавите нови телефон или поново инсталирате Molly. @@ -7469,6 +7623,10 @@ Ручно прави резервне копије Унесите PIN, лозинку или шаблон за уређај. + + Поново омогући резервне копије + + Резервне копије су искључене и ваши подаци су избрисани из Signal-овог сервиса за безбедно складиштење. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 62b846312e..97dee1a19d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -365,6 +365,8 @@ Chattar Meddelanden + + Chattyper Meddelande %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Du är redo. Starta din säkerhetskopiering nu. Beroende på hur stor din säkerhetskopia är kan detta ta lång tid. Du kan använda din telefon som vanligt medan säkerhetskopieringen pågår. @@ -1966,6 +1968,7 @@ + %1$d inbjuden + %1$d inbjudna + %1$d ytterligare grupp %1$d ytterligare grupper @@ -1992,6 +1995,7 @@ Ingen enhet hittades. Nätverksfel. Ogiltig QR-kod. + Tyvärr har du för många enheter redan länkade, prova att ta bort en del Tyvärr, detta är ingen giltig QR-kod för enhetslänkning. Länka en Signal-enhet? @@ -2014,11 +2018,13 @@ Skicka lösenord Fel lösenord! Lås upp Molly + Molly Android - Låsskärm Karta + Släpp stift Acceptera adress @@ -2522,6 +2528,7 @@ Signal-meddelande + Mer @@ -2553,6 +2560,7 @@ Inga klistermärken installerade Klistermärken från inkommande meddelanden visas här Utan titel + Okänt @@ -2774,6 +2782,7 @@ Media är inte längre tillgängligt. Det gick inte att spela upp media. + Fel vid sökning av meddelande Det går inte att hitta en app som kan dela detta medium. Stäng @@ -2845,6 +2854,7 @@ Meddelanden Samtal + Misslyckanden Säkerhetskopior Låsstatus @@ -2854,6 +2864,7 @@ Okänd Röstanteckningar Kontakt anslöt sig till Signal + Ingen aktivitet tillgänglig för att öppna inställningar för aviseringskanaler. Bakgrundsanslutning @@ -3638,10 +3649,12 @@ All meddelandehistorik kommer att tas bort permanent från alla enheter. Denna åtgärd kan inte ångras. Ta bort allt nu + För alltid 1 år 6 månader 30 dagar + Ingen %1$s meddelande @@ -3666,6 +3679,7 @@ Visa Rington Teckenstorlek för meddelanden + Prioritet Felsök aviseringar @@ -3894,6 +3908,7 @@ Skanna betalningsmottagarens adress-QR-kod + Förfrågan Betala Tillgängligt saldo: %1$s @@ -4025,6 +4040,7 @@ Du kan bara nåla %1$d chattar + Kontaktfoto Arkiverad @@ -4033,6 +4049,10 @@ Ny chatt Öppna kameran Inga chattar ännu.\nKom igång genom att skriva till en vän. + + Inga chattar att visa + + Mappinställningar @@ -4265,6 +4285,7 @@ Säkerhetskopior av chattar Överför konto Överför konto till en ny Android-enhet + Ange lösenord för säkerhetskopian Återställ Kan ej importera backuper från nyare Signal-versioner @@ -4472,6 +4493,7 @@ Det gick inte att öppna Wi-Fi-inställningar. Aktivera Wi-Fi manuellt. + Bevilja platsbehörighet Aktivera platstjänster Aktivera Wi-Fi @@ -4725,6 +4747,7 @@ Dela + Skicka , %1$s @@ -5028,6 +5051,119 @@ Tangentbord Skicka med Retur + + Chattmappar + + Lägg till en chattmapp + + + + Organisera dina chattar i mappar och växla snabbt mellan dem i din chattlista. + + Mappar + + Skapa en mapp + + Alla chattar + + Föreslagna mappar + + Olästa + + Olästa meddelanden från alla chattar + + 1:1-chattar + + Endast meddelanden från direktchattar + + Grupper + + Endast meddelanden från gruppchattar + + Lägg till + + Mapp har lagts till: %1$s. + + Redigera mapp + + Ta bort mapp + + Lägg till ny mapp + + Tysta alla + + Ordna om mappar + + Markera alla som lästa + + + %1$d chattyp + %1$d chattyper + + + + %1$d chatt + %1$d chattar + + + + %1$d chatt exkluderad + %1$d chattar exkluderade + + + + + Skapa en mapp + + Mappnamn (krävs) + + Inkluderade chattar + + Lägg till chattar + + Välj chattar som du vill ska visas i den här mappen. + + Undantag + + Exkludera chattar + + Välj chattar som du inte vill ska visas i den här mappen. + + Visa bara olästa chattar + + När det är aktiverat kommer endast chattar med olästa meddelanden att visas i den här mappen. + + Inkludera tystade chattar + + Skapa + + Skapa mapp? + + Vill du skapa chattmappen \"%1$s\"? + + Skapa mapp + + Redigera mapp + + Spara + + Spara ändringar? + + Vill du spara ändringarna som du har gjort till denna chattmapp? + + Spara ändringar + + Kassera + + Ta bort mapp + + Ta bort den här chattmappen? + + + + Chattyper + + Klar Meddelanden @@ -5112,6 +5248,7 @@ Mediekvalitet + Skickade mediekvalitet Om du skickar högkvalitativa medier kommer du att använda mera data. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Ditt abonnemang för säkerhetskopiering har upphört - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Din säkerhetskopieringsplan har upphört eftersom den inte kunde förnyas med din nuvarande betalningsmetod. Om %1$d dag kommer media i din säkerhetskopia att tas bort. + Din säkerhetskopieringsplan har upphört eftersom den inte kunde förnyas med din nuvarande betalningsmetod. Om %1$d dagar kommer media i din säkerhetskopia att tas bort. Du kan när som helst börja betala för säkerhetskopiering igen för att fortsätta säkerhetskopiera alla dina medier. @@ -7254,9 +7391,9 @@ Om du väljer Hoppa över kommer media i säkerhetskopian att tas bort om %1$d dagar. - Your backups subscription failed to renew + Ditt abonnemang för säkerhetskopiering kunde inte förnyas - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Kontrollera att din betalningsmetod är uppdaterad. Tryck på Hantera abonnemang och tryck på Uppdatera under Betalningsmetoder. Det gick inte slutföra säkerhetskopieringen @@ -7268,7 +7405,7 @@ Hantera abonnemang - Subscribe for %1$s/month + Prenumerera för %1$s/månad Ladda ner media nu @@ -7303,6 +7440,17 @@ %1$s av %2$s + + + Avbryt nedladdning + + Laddar ned: %1$s av %2$s (%3$s %%) + + Det finns inte tillräckligt med utrymme för att ladda ner din säkerhetskopia. Frigör %1$s utrymme för att fortsätta. + + Hoppa över nedladdning + + "Din senaste säkerhetskopiering kunde inte slutföras. Se till att din telefon är ansluten till wifi och tryck på Säkerhetskopiera nu för att försöka igen." @@ -7356,18 +7504,18 @@ Lagringsoptimering kan endast användas med den betalda nivån av Säkerhetskopiering av Signal. Uppgradera din säkerhetskopieringsplan för att börja använda den här funktionen. - Subscribe for %1$s/month + Prenumerera för %1$s/månad - This media is no longer available + Den här mediafilen är inte längre tillgänglig. - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Din nuvarande plan för Signal-säkerhetskopiering inkluderar din senaste %1$d dags media. Uppgradera nu för att börja säkerhetskopiera alla dina media. + Din nuvarande plan för Signal-säkerhetskopiering inkluderar dina senaste %1$d dagars media. Uppgradera nu för att börja säkerhetskopiera alla dina media. - Subscribe for %1$s/month + Prenumerera för %1$s/månad Radering synkroniseras nu mellan alla dina enheter @@ -7410,11 +7558,13 @@ Typ av säkerhetskopia har ändrats och abonnemanget har sagts upp - Abonnemang uppsagt + Abonnemanget uppsagt Nerladdning slutförd Säkerhetskopia kommer att skapas över natten. + + Abonnemanget inaktivt Säkerhetskopieringsplan @@ -7423,8 +7573,12 @@ %1$s/månad Din säkerhetskopieringsplan är gratis - + Förnyas %1$s + + Upphör %1$s + + Upphörde %1$s Säkerhetskopiera din meddelandehistorik så att du aldrig förlorar data när du skaffar en ny telefon eller installerar om Molly. @@ -7469,6 +7623,10 @@ Manuell säkerhetskopiering Ange din enhets pinkod, lösenord eller mönster. + + Återaktivera säkerhetskopiering + + Säkerhetskopieringar har stängts av och dina data har tagits bort från Signals säkra lagringstjänst. diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index 60f508ec56..4bb31fb04e 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -365,6 +365,8 @@ Gumzo Jumbe + + Aina za gumzo Ujumbe %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Umemaliza. Anza kuhifadhi nakala yako sasa. Kutegemeana na ukubwa wa hifadhi nakala yako, hii inaweza kuchukua muda mrefu. Unaweza kutumia simu yako kama kawaida wakati uhifadhi nakala unaendelea. @@ -1966,6 +1968,7 @@ +%1$d amekaribishwa +%1$d umealikwa + Kikundi %1$d cha ziada Vikundi %1$dvya ziada @@ -1992,6 +1995,7 @@ Hakuna kifaa kilichopatikana Hitilafu ya kimtandao Msimbo wa QR sio sahihi + Samahani, una vifaa vingi vilivyounganishwa tayari, jaribu kuondoa baadhi Samahani, hiki sio kiungo halali cha msimbo wa QR kwa kifaa Unganisha kifaa cha Signal @@ -2014,11 +2018,13 @@ Wasilisha nenosiri Nenosiri sio sahihi Fungua Molly + Molly Android - Kufunga Skrini Ramani + Weka nambari ya siri Kubali anwani @@ -2522,6 +2528,7 @@ Ujumbe wa Signal + Zaidi @@ -2553,6 +2560,7 @@ Hakuna vibandiko vilivyosakinishwa Vibandiko kutoka kwa jumbe zinazoingia zitaonekana hapa Haina kichwa + Isiyojulikana @@ -2774,6 +2782,7 @@ Media haipatikani tena. Imeshindikana kuchezesha video. + Hitilafu katika kutafuta Ujumbe. Hatujapata programu inayoweza kushiriki media hii. Funga @@ -2845,6 +2854,7 @@ Jumbe Simu + Zilizoshindwa Nakalahifadhi Funga hali @@ -2854,6 +2864,7 @@ Isiyojulikana Vidokezo vya Sauti Mwasiliani amejiunga na Signal + Hakuna shughuli inayopatikana ili kufungua mipangilio ya kituo cha arifa. Muunganisho wa Mandharinyuma @@ -3638,10 +3649,12 @@ Historia ya jumbe zote itaondolewa kwenye vifaa vyote. Kitendo hiki hakitenguliwi. Futa zote sasa + Daima Mwaka 1 Miezi 6 Siku 30 + Hakuna Ujumbe %1$s @@ -3666,6 +3679,7 @@ Onyesha Mlio wa simu ukubwa wa maandishi ya ujumbe + Kipaumbele Arifa za utatuzi @@ -3894,6 +3908,7 @@ Changanua msimbo wa QR ya anwani ya anayelipa + Omba Lipa Salio linalopatikana: %1$s @@ -4025,6 +4040,7 @@ Unaweza kubandika hadi gumzo %1$d tu + Picha ya mwasiliani Jalidiwa @@ -4033,6 +4049,10 @@ Gumzo mpya Fungua Kamera Bado hakuna gumzo.\nAnza kwa kumtumia rafiki ujumbe. + + Hakuna magumzo ya kuonyesha + + Mipangilio ya folda @@ -4265,6 +4285,7 @@ Nakalahifadhi ya Gumzo Hamisha akaunti Hamishia akaunti kwenye kifaa kipya cha Android + ingiza nenosiri la nakalahifadhi Rejesha Haihamishi hifadhi nakala toka matoleo mapya ya Signal @@ -4472,6 +4493,7 @@ Imeshindwa kufungua Mipangilio ya Wi-Fi. Tafadhali washa Wi-Fi mwenyewe. + Ruhusu ufikiaji maelezo ya eneo Washa huduma za eneo Washa Wi-Fi @@ -4725,6 +4747,7 @@ Shiriki + Tuma , %1$s @@ -5028,6 +5051,119 @@ Kibodi Tuma kwa kubofya enter + + Folda la magumzo + + Weka folda la gumzo + + + + Panga magumzo yako katika folda na hama haraka baina yao katika orodha yako ya gumzo. + + Mafolda + + Tengeneza folda + + Magumzo yote + + Mafolda yaliyopendekezwa + + Hazijasomwa + + Jumbe ambazo hazijasomwa kutoka kwenye magumzo yote + + Magumzo ya 1:1 + + Jumbe kutoka kwenye magumzo ya moja kwa moja tu + + Makundi + + Ujumbe kutoka kwenye magumzo ya moja kwa moja tu + + Ongeza + + Folda %1$s imeongezwa. + + Hariri folda + + Futa folda + + Weka folda jipya + + Nyamazisha yote + + Panga tena mafolda + + Alamisha zote zilimesomwa + + + %1$d aina ya gumzo + %1$d aina ya magumzo + + + + Gumzo %1$d + Magumzo %1$d + + + + %1$d gumzo halijajumuishwa + %1$d magumzo hayajajumuishwa + + + + + Tengeneza folda + + Jina la folda (linahitajika) + + Magumzo yaliyojumuishwa + + Weka magumzo + + Chagua magumzo unayotaka yaonekane kwenye folda hili. + + Isipokuwa + + Usijumuishe magumzo + + Chagua magumzo ambayo hutaki yaonekana kwenye folda hii. + + Onyesha magumzo hayajasomwa + + Ikiwashwa, ni magumzo yenye ujumbe hazijasomwa pekee ndizo zitakazoonyeshwa kwenye folda hii. + + Jumuisha magumzo yaliyonyamazishwa + + Tengeneza + + Ungependa kutengeneza folda? + + Unataka kutengeneza folda la gumzo \"%1$s\"? + + Tengeneza folda + + Badili folda + + Hifadhi + + Hifadhi mabadiliko? + + Unataka kuhifadhi mabadiliko uliyofanya kwenye folda hili la gumzo? + + Hifadhi mabadiliko + + Tupa + + Futa folda + + Ungependa kufuta folda hili la gumzo? + + + + Aina za gumzo + + Imekamilika Jumbe @@ -5112,6 +5248,7 @@ Ubora wa Media + Ubora wa media iliyotumwa Kutuma media za ubora wa juu kutatumia data zaidi. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Usajili wako wa kuhifadhi nakala umekwisha muda - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Mpango wako wa kuhifadhi nakala umeisha muda kwa sababu haukuweza kusasishwa kwa kutumia njia yako ya malipo ya sasa hivi. Baada ya siku %1$d, picha na video kwenye hifadhi yako zitafutwa. + Mpango wako wa kuhifadhi nakala umeisha muda kwa sababu haukuweza kusasishwa kwa kutumia njia yako ya malipo ya sasa hivi. Baada ya siku %1$d, picha na video kwenye hifadhi yako zitafutwa. Unaweza kuanza kulipia nakala muda wowote ule ili kuendelea kuhifadhi nakala ya video na picha zako. @@ -7254,9 +7391,9 @@ Ukichagua \"Ruka\" picha na video kwenye nakala yako itafutwa ndani ya siku %1$d. - Your backups subscription failed to renew + Usajili wako wa uhifadhi nakala umeshindwa kusasisha - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Angalia kuhakikisha njia yako ya malipo imesasishwa. Gusa Dhibiti usajili na chini ya Njia za malipo gusa Sasisha. Imeshindwa kumaliza nakala @@ -7268,7 +7405,7 @@ Ratibu usajili - Subscribe for %1$s/month + Sajili kwa %1$s/mwezi Pakua video na picha sasa @@ -7303,6 +7440,17 @@ %1$s kwa %2$s + + + Ghairi upakuaji + + Inapakua: %1$s ya %2$s (%3$s%%) + + Hakuna nafasi tosha kupakua Hifadhi Nakala yako. Ili uendelee futa ili upate nafasi ya %1$s. + + Ruka upakuaji + + "Uhifadhi nakala wako wa mwisho haukukamilika. Hakikisha kuwa simu yako imeunganishwa kwenye Wi-Fi na uguse Hifadhi nakala sasa ili ujaribu tena." @@ -7356,18 +7504,18 @@ Uboreshaji wa nafasi ya hifadhi inaweza tu kutumiwa na walipaji wa huduma ya Uhifadhi Nakala kwa Signal. Sasisha mpango wako wa uhifadhi nakala ili uanze kutumia kipengele hiki. - Subscribe for %1$s/month + Sajili kwa %1$s/mwezi - This media is no longer available + Video hii haipatikani tena - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Mpango wako wa sasa wa kuhifadhi nakala wa Signal unajumuisha picha na video zako za hivi majuzi za siku %1$d. Ili kuanza kuhifadhi nakala za picha na video zako zote, sasisha sasa. + Mpango wako wa sasa wa kuhifadhi nakala wa Signal unajumuisha picha na video zako za hivi majuzi za siku %1$d. Ili kuanza kuhifadhi nakala za picha na video zako zote, sasisha sasa. - Subscribe for %1$s/month + Sajili kwa %1$s/mwezi Kufuta sasa kumeunganishwa kwenye vifaa vyao vyote @@ -7415,6 +7563,8 @@ Upakuaji umekamilika Hifadhi nakala itaundwa usiku. + + Usajili hautumiki Mpango wa uhifadhi nakala @@ -7423,8 +7573,12 @@ %1$s/mwezi Mpango wako wa uhifadhi nakala ni bure - + Kuhuishwa %1$s + + Inakwisha muda %1$s + + Ilikwisha muda %1$s Hifadhi nakala ya historia ya jumbe wako ili usiwahi kupoteza data unapopata simu mpya au kusakinisha upya Molly. @@ -7469,6 +7623,10 @@ Fanya chelezo mwenyewe Tafadhali ingiza nenosiri, pini au alama ya kifaa chako. + + Wezesha tena uhifadhi nakala + + Hifadhi nakala zimezimwa na data yako kufutwa kutoka kwenye huduma salama ya uhifadhi ya Signal. diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index f7b7cdb6c9..8871763235 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -365,6 +365,8 @@ சாட்ஸ் மெசேஜ்கள் + + சாட் வகைகள் செய்தி %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + நீங்கள் தயாராக உள்ளீர்கள். உங்கள் காப்புப்பிரதியை இப்போதே துவங்குக. உங்கள் காப்புப்பிரதியின் அளவைப் பொறுத்து, இதற்கு நீண்ட நேரம் ஆகலாம். காப்புப்பிரதி எடுக்கப்படும்போது நீங்கள் வழக்கம் போல் உங்கள் தொலைபேசியைப் பயன்படுத்தலாம். @@ -1966,6 +1968,7 @@ +%1$dஅழைக்கப்பட்டிருக்கிறார்கள் +%1$d அழைக்கப்பட்டிருக்கிறார்கள்  + %1$d கூடுதல் குழு %1$d கூடுதல் குழு @@ -1992,6 +1995,7 @@ எந்த சாதனமும் காணப்படவில்லை. இணையத்தில் பிழை. QR குறியீடு செல்லாது. + மன்னிக்கவும், ஏற்கனவே பல சாதனங்கள் இணைக்கப்பட்டுள்ளது, சிலவற்றை வெளியேற்றவும் … மன்னிக்கவும், இது சரியான சாதன இணைப்பு QR குறியீடு அல்ல. Signal சாதனத்தை இணைக்கவா? @@ -2014,11 +2018,13 @@ கடவுச்சொல்லை சமர்ப்பிக்க தவறான கடவுச்சொல்! Molly லைத் திற + Molly ஆண்ட்ராய்டு - திரைப் பூட்டு வரைபடம் + கடவை கைவிடு முகவரியை ஒப்புக்கொள் @@ -2522,6 +2528,7 @@ Signal செய்தி + மேலும் @@ -2553,6 +2560,7 @@ ஸ்டிக்கர்கள் எதுவும் நிறுவப்படவில்லை உள்வரும் செய்திகளின் ஒட்டிகள் இங்கே தோன்றும் பெயரிடாத + முன் தெரிந்திராத @@ -2774,6 +2782,7 @@ இந்த ஊடகம் சேமிப்பகத்தில் இல்லை. மீடியாவை இயக்க முடியவில்லை. + செய்தியைக் கண்டறிவதில் பிழை. இந்த மீடியாவைப் பகிரக்கூடிய பயன்பாட்டைக் கண்டுபிடிக்க முடியவில்லை. நெருக்கமான @@ -2845,6 +2854,7 @@ செய்திகள் அழைப்புகள் + தோல்விகள் காப்புப் பிரதிகள் பூட்டு நிலை @@ -2854,6 +2864,7 @@ முன் தெரிந்திராத குரல் குறிப்புகள் தொடர்பு Signal இல் இணைந்தது  + இல்லை செயல்பாடு கிடைக்கிறது திறந்த அறிவிப்பு சேனல் அமைப்புகள். பின்னணி இணைப்பு @@ -3638,10 +3649,12 @@ எல்லா மெசேஜ் வரலாறும் அனைத்து சாதனங்களிலிருந்தும் நிரந்தரமாக அகற்றப்படும். இந்தச் செயலைச் செயல்தவிர்க்க முடியாது. அனைத்தையும் இப்போது நீக்கு + என்றென்றும் 1 வருடம் 6 மாதங்கள் 30 நாட்கள் + எதுவும் இல்லை %1$s மெசேஜ் @@ -3666,6 +3679,7 @@ காட்டு ரிங்டோன் செய்தி எழுத்துரு அளவு + முன்னுரிமை அறிவிப்புகளை சரிசெய்தல் @@ -3894,6 +3908,7 @@ ஊடுகதிர் முகவரி க்யு ஆர் குறியீடு செலுத்துபவரின் + கோரிக்கை செலுத்துங்கள் கிடைக்கிறது சமநிலை: %1$s @@ -4025,6 +4040,7 @@ நீங்கள் %1$d சாட்ஸ் வரை மட்டுமே பின் செய்ய முடியும் + தொடர்பின் புகைப்படம் பெட்டகப்படுத்தப்பட்டது @@ -4033,6 +4049,10 @@ புதிய சாட் புகைப்படக்கருவியை திறக்கவும் இதுவரை சாட்ஸ் எதுவும் இல்லை.\nநண்பருக்கு மெசேஜ் அனுப்புவதன் மூலம் தொடங்கவும். + + காண்பிப்பதற்கான சாட்ஸ் ஏதும் இல்லை + + கோப்புறை அமைப்புகள் @@ -4265,6 +4285,7 @@ சாட் காப்புப்பிரதிகள் Signal கணக்கை நகர்த்தவும் கணக்கை புதிய சாதனத்திற்கு நகர்த்தவும் + காப்புப்பதிவு பயனர் தரவு கடவுச்சொற்றொடரை உள்ளிடவும் மீட்க Signal இன் புதிய பதிப்புகளில் பேக்அப்களை இறக்க முடியாது @@ -4472,6 +4493,7 @@ வைஃபை அமைப்புகளைத் திறக்க முடியவில்லை. கைமுறையாக வைஃபை இயக்கவும். + இருப்பிடத்தை வழங்கவும் அனுமதி இயக்கவும் இருப்பிட சேவை இயக்கவும் வைஃபை @@ -4725,6 +4747,7 @@ பகிர் + அனுப்புக , %1$s @@ -5028,6 +5051,119 @@ விசைப்பலகை உள்ளிடுக மூலம் அனுப்புக + + சாட் கோப்புறைகள் + + சாட் கோப்புறையைச் சேர் + + + + உங்கள் சாட்ஸைக் கோப்புறைகளாக ஒழுங்கமைத்து, உங்கள் சாட் பட்டியலில் அவற்றுக்கிடையே விரைவாக மாறவும். + + கோப்புறைகள் + + கோப்புறையை உருவாக்கு + + அனைத்து சாட்ஸ் + + பரிந்துரைக்கப்பட்ட கோப்புறைகள் + + படிக்கப்படாதவை + + அனைத்து சாட்ஸில் இருந்தும் படிக்கப்பட்டாத மெசேஜ்கள் + + 1:1 சாட்ஸ் + + நேரடி சாட்ஸிலிருந்து மெசேஜ்கள் மட்டும் + + குழுக்கள் + + குழு சாட்ஸிலிருந்து மெசேஜ்கள் மட்டும் + + சேர்க்கவும் + + %1$s கோப்புறை சேர்க்கப்பட்டது. + + கோப்புறையைத் திருத்து + + கோப்புறையை அழி + + புதிய கோப்புறையைச் சேர் + + அனைத்தையும் மியூட் செய் + + கோப்புறையை மறுவரிசைப்படுத்து + + அனைத்தையும் படித்தாக குறியிடு + + + %1$d சாட் வகை + %1$d சாட் வகைகள் + + + + %1$d சாட்ஸ் + %1$d சாட்ஸ் + + + + %1$d சாட் விலக்கப்பட்டது + %1$d சாட்ஸ் விலக்கப்பட்டன + + + + + கோப்புறையை உருவாக்கு + + கோப்புறை பெயர் (தேவையானது) + + சாட்ஸ் உள்ளடங்கும் + + சாட்ஸைச் சேர் + + இந்தக் கோப்புறையில் தோன்ற வேண்டிய சாட்ஸைத் தேர்ந்தெடுக்கவும். + + விதிவிலக்குகள் + + சாட்ஸை விலக்கு + + இந்தக் கோப்புறையில் தோன்றக் கூடாத சாட்ஸைத் தேர்ந்தெடுக்கவும். + + படிக்கப்படாத சாட்ஸை மட்டும் காட்டு + + செயல்படுத்தப்பட்டதும், கோப்புறையில் படிக்கப்படாத மெசேஜ்களைக் கொண்ட சாட்ஸ் மற்றும் தோன்றும். + + மியூட் செய்யப்பட்ட சாட்ஸைச் சேர்க்கவும் + + உருவாக்கவும் + + கோப்புறையை உருவாக்குவதா? + + \"%1$s\" சாட் கோப்புறையை உருவாக்க வேண்டுமா? + + சாட் கோப்புறை + + கோப்புறையைத் திருத்து + + சேமி + + மாற்றங்களைச் சேமிப்பதா? + + இந்த சாட் கோப்புறையில் நீங்கள் மேற்கொண்ட மாற்றங்களைச் சேமிக்க விரும்புகிறீர்களா? + + மாற்றங்களைச் சேமி + + புறந்தள்ளு + + கோப்புறையை அழி + + இந்த சாட் கோப்புறையை அழிக்க வேண்டுமா? + + + + சாட் வகைகள் + + முடிந்தது செய்திகள் @@ -5112,6 +5248,7 @@ மீடியா தரம் + அனுப்பிய மீடியா தரம் உயர்தரத்தை அனுப்புகிறது ஊடகம் அதிக தரவைப் பயன்படுத்தும். @@ -7232,11 +7369,11 @@ - Your backups subscription expired + உங்கள் காப்புப்பிரதிகளின் சந்தா காலாவதியாகிவிட்டது - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + உங்களின் தற்போதைய கட்டண முறையில் புதுப்பிக்க முடியாததால், எங்கள் காப்புப் பிரதி திட்டம் காலாவதியானது. %1$d நாள் கழித்து, உங்கள் காப்புப்பிரதியில் உள்ள மீடியா அழிக்கப்படும். + உங்களின் தற்போதைய கட்டண முறையில் புதுப்பிக்க முடியாததால், எங்கள் காப்புப் பிரதி திட்டம் காலாவதியானது. %1$d நாட்கள் கழித்து, உங்கள் காப்புப்பிரதியில் உள்ள மீடியா அழிக்கப்படும். உங்கள் எல்லா மீடியாவையும் தொடர்ந்து பேக்கப் எடுப்பதற்கு எந்த நேரத்திலும் பேக்கப்பிற்கு மீண்டும் பணம் செலுத்தத் தொடங்கலாம். @@ -7254,9 +7391,9 @@ \"தவிர்\" என்பதைத் தேர்வுசெய்தால், உங்கள் பேக்கப்பில் உள்ள ஊடகம் %1$d நாட்களில் அழிக்கப்படும். - Your backups subscription failed to renew + உங்கள் காப்புப் பிரதிகள் சந்தாவைப் புதுப்பிக்க முடியவில்லை - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + உங்கள் கட்டண முறை புதுப்பித்த நிலையில் உள்ளதா எனச் சரிபார்க்கவும். சந்தாவை நிர்வகி என்பதை அழுத்தவும் மற்றும் கட்டண முறைகளின் கீழ் புதுப்பி என்பதை அழுத்தவும். பேக்கப்பை நிறைவு செய்ய முடியவில்லை @@ -7268,7 +7405,7 @@ சந்தாவை நிர்வகி - Subscribe for %1$s/month + மாதத்திற்கு %1$s க்கு சப்ஸ்கிரைப் செய்க இப்போதே மீடியாவைப் பதிவிறக்கு @@ -7303,6 +7440,17 @@ %2$s இன் %1$s + + + பதிவிறக்கத்தை ரத்து செய் + + பதிவிறக்குகிறது: %2$s இல் %1$s (%3$s%%) + + உங்கள் காப்பிப்பிரதியை பதிவிறக்கப் போதுமான இடம் இல்லை. தொடர்ந்து %1$s இடத்தை விடுவிக்கவும். + + பதிவிறக்கத்தைத் தவிர் + + "உங்களின் கடைசிக் காப்புப்பிரதி முழுமையடைவில்லை. உங்கள் ஃபோன் வைஃபை உடன் இணைக்கப்பட்டுள்ளத்தை உறுதி செய்து, மீண்டும் முயற்சி செய்ய இப்போதே காப்புப் பிரதியெடு என்பதை அழுத்தவும்." @@ -7356,18 +7504,18 @@ சிக்னல் காப்புப்பிரதிகளின் கட்டண அடுக்குடன் மட்டுமே சேமிப்பக மேம்படுத்துதலைப் பயன்படுத்த முடியும். இந்த அம்சத்தைப் பயன்படுத்தத் தொடங்க, உங்கள் காப்புப்பிரதித் திட்டத்தை அப்கிரேட் செய்யவும். - Subscribe for %1$s/month + மாதத்திற்கு %1$s க்கு சப்ஸ்கிரைப் செய்க - This media is no longer available + இந்த மீடியா இனி கிடைக்கப்பெறாது - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + உங்களின் தற்போதைய சிக்னல் காப்புப் பிரதி திட்டத்தில் மிகச் சமீபத்திய %1$d நாள் மீடியா காணப்படும். உங்கள் எல்லா மீடியாவையும் காப்புப் பிரதி எடுக்கத் தொடங்க, இப்போதே மேம்படுத்தவும். + உங்களின் தற்போதைய சிக்னல் காப்புப் பிரதி திட்டத்தில் மிகச் சமீபத்திய %1$d நாட்கள் மீடியா காணப்படும். உங்கள் எல்லா மீடியாவையும் காப்புப் பிரதி எடுக்கத் தொடங்க, இப்போதே மேம்படுத்தவும். - Subscribe for %1$s/month + மாதத்திற்கு %1$s க்கு சப்ஸ்கிரைப் செய்க இப்போது உங்களின் அனைத்து சாதனங்களிலும் அழித்தல் அம்சம் ஒத்திசைக்கப்பட்டுள்ளது @@ -7415,6 +7563,8 @@ பதிவிறக்கம் முடிக்கப்பட்டது ஒரு இரவிற்குள் காப்புப்பிரதி உருவாக்கப்படும். + + சந்தா செயலில் இல்லை காப்புப்பிரதி திட்டம் @@ -7423,8 +7573,12 @@ %1$s/மாதம் உங்கக் காப்புப்பிரதி திட்டம் இலவசமாக உள்ளது - + %1$s அன்று புதுப்பிக்கப்படும் + + %1$s அன்று காலவதியாகிறது + + %1$s அன்று காலாவதியானது உங்கள் செய்தி வரலாற்றைக் காப்புப் பிரதி எடுக்கவும், எனவே நீங்கள் புதிய தொலைபேசியைப் பெறும்போது அல்லது சிக்னலை மீண்டும் நிறுவும்போது தரவை இழக்க மாட்டீர்கள். @@ -7469,6 +7623,10 @@ கைமுறையாகக் காப்புப்பிரதி எடுத்தல் உங்கள் சாதனத்தின் பின், கடவுச்சொல் அல்லது வடிவத்தை உள்ளிடவும். + + காப்புப்பிரதிகளை மறுசெயல்படுத்து + + சிக்னலின் பாதுகாப்பான சேமிப்பகச் சேவையிலிருந்து காப்புப்பிரதிகள் முடக்கப்பட்டு உங்கள் தரவு அழிக்கப்பட்டது. diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 6d46f6b436..45908532d5 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -365,6 +365,8 @@ చాట్‌లు సందేశాలు + + చాట్ రకాలు %1$sకి సందేశం పంపు @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + మీరు అంతా సిద్ధంగా ఉన్నారు. మీ బ్యాకప్‌ను ఇప్పుడే ప్రారంభించండి. మీ బ్యాకప్ పరిమాణంపై ఆధారపడి, దీనికి ఎక్కువ సమయం పట్టవచ్చు. బ్యాకప్ జరుగుతున్నప్పుడు మీరు మీ ఫోన్‌ను ఎప్పటిలానే మామూలుగా ఉపయోగించవచ్చు. @@ -1966,6 +1968,7 @@ +%1$d ఆహ్వానించారు +%1$d ఆహ్వానించారు + %1$d అదనపు సమూహం %1$d అదనపు సమూహాలు @@ -1992,6 +1995,7 @@ పరికరం కనుగొనబడలేదు. నెట్వర్క్ లోపం. చెల్లని QR కోడ్. + క్షమించండి,మీరు చాల పరికరాలను అనుసంధానం చేసారు, కొన్ని తొలగించడానికి ప్రయత్నించండి. క్షమించండి,ఇది ఒక చెల్లని అనుసంధానం చేసిన పరికరం యొక్క QR కోడ్. ఒక Signal పరికరం లింక్ చేయాలా? @@ -2014,11 +2018,13 @@ సంకేతపదమును సమర్పించండి చెల్లని సంకేతపదము! అన్లాక్ Molly + Molly Android - లాక్ స్క్రీన్ పటం + డ్రాప్ పిన్ చిరునామాను అంగీకరించండి @@ -2522,6 +2528,7 @@ Signal సందేశం + మరింత @@ -2553,6 +2560,7 @@ స్టిక్కర్లు వ్యవస్థాపించబడలేదు ఇన్కమింగ్ సందేశాల నుండి స్టిక్కర్లు ఇక్కడ కనిపిస్తాయి శీర్షికలేని + తెలియని @@ -2774,6 +2782,7 @@ మీడియా ఇకపై అందుబాటులో లేదు. మీడియాను ప్లే చేయలేకపోయింది. + సందేశాన్ని కనుగొనడంలో లోపం. ఈ మీడియాను భాగస్వామ్యం చేయగల అనువర్తనాన్ని కనుగొనలేకపోయాము. మూసివెయ్యి @@ -2845,6 +2854,7 @@ సందేశాలు కాల్స్ + వైఫల్యాలు ప్రత్యామ్నాయములు స్థితి లాక్ @@ -2854,6 +2864,7 @@ తెలియని స్వర గమనికలు పరిచయం Signal లొ చేరారు + నోటిఫికేషన్ ఛానల్ సెట్టింగ్‌లు ఓపెన్ చేయడానికి ఎలాంటి యాక్టివిటీ లభ్యం కావడం లేదు. బ్యాక్‌గ్రౌండ్ కనెక్షన్ @@ -3638,10 +3649,12 @@ అన్ని పరికరాల నుండి మొత్తం సందేశ చరిత్ర శాశ్వతంగా తొలగించబడుతుంది. ఈ చర్య రద్దు చేయబడదు. ఇప్పుడు అన్నీ తొలిగించండి + ఎప్పటికీ 1 సంవత్సరం 6 నెలలు 30 రోజులు + ఏదీ కాదు %1$s సందేశం @@ -3666,6 +3679,7 @@ కనబర్చు రింగ్టోన్ సందేశం ఫాంట్ పరిమాణం + ప్రాధాన్యత నోటిఫికేషన్‌లను పరిష్కరించండి @@ -3894,6 +3908,7 @@ పేయీ యొక్క చిరునామా QR కోడ్‌ని స్కాన్ చేయండి + అభ్యర్థన చెల్లించండి లభ్యమవుతున్న బ్యాలెన్స్: %1$s @@ -4025,6 +4040,7 @@ మీరు %1$d చాట్‌ల వరకు మాత్రమే పిన్ చేయవచ్చు + పరిచయ ఫొటొ చిత్రం భద్రపరచబడినది @@ -4033,6 +4049,10 @@ కొత్త చాట్ కెమెరా తెరువు ఇంకా చాట్‌లు లేవు.\nఒక స్నేహితుడికి సందేశం పంపడం ద్వారా ప్రారంభించండి. + + ప్రదర్శించడానికి ఏ చాట్స్ లేవు + + ఫోల్డర్ సెట్టింగులు @@ -4265,6 +4285,7 @@ చాట్ బ్యాకప్‌లు ఖాతాను బదిలీ చేయడం ఖాతాను కొత్త Android పరికరానికి బదిలీ చేయండి + ప్రత్యామ్నాయ పాస్ఫ్రేజ్ని నమోదు చేయండి పునరుద్ధరించు Signal నూతన వెర్షన్ల నుండి బ్యాకప్స్ దిగుమతి చేయలేరు @@ -4472,6 +4493,7 @@ Wi-Fi సెట్టింగ్‌లు ఓపెన్ చేయలేకపోయింది. దయచేసి Wi-Fiని మాన్యువల్‌గా ఆన్ చేయండి. + లొకేషన్ పర్మిషన్‌ని మంజూరు చేయండి లొకేషన్ సర్వీస్‌లను ఆన్ చేయండి Wi-Fi టర్న్ ఆన్ చేయండి @@ -4725,6 +4747,7 @@ పంచుకోండి + పంపు , %1$s @@ -5028,6 +5051,119 @@ కీబోర్డ్ ఎంటర్‌తో పంపించండి + + చాట్ ఫోల్డర్‌లు + + ఒక చాట్ ఫోల్డర్‌ను జోడించండి + + + + మీ చాట్‌లను ఫోల్డర్‌లుగా నిర్వహించండి మరియు మీ చాట్ జాబితాలో వాటి మధ్య త్వరగా మారండి. + + ఫోల్డర్లు + + ఫోల్డర్‌ను సృష్టించండి + + అన్ని చాట్స్ + + సూచించబడిన ఫోల్డర్లు + + చదవనివి + + అన్ని చాట్స్ నుండి చదవని సందేశాలు + + 1:1 చాట్స్ + + ప్రత్యక్ష చాట్స్ నుండి మాత్రమే సందేశాలు + + గ్రూప్స్ + + గ్రూప్ చాట్స్ నుండి మాత్రమే సందేశం + + చేర్చు + + %1$s ఫోల్డర్ జోడించబడింది. + + ఫోల్డర్‌ను సవరించండి + + ఫోల్డర్‌ను తొలగించండి + + కొత్త ఫోల్డర్‌ను జోడించండి + + అన్నిటినీ మ్యూట్ చేయండి + + ఫోల్డర్ల క్రమాన్ని మార్చండి + + మార్క్ చేసినవన్నీ చదవండి + + + %1$d చాట్ రకం + %1$d చాట్ రకాలు + + + + %1$d చాట్ + %1$d చాట్‌లు + + + + %1$d చాట్ మినహాయించబడింది + %1$d చాట్స్ మినహాయించబడ్డాయి + + + + + ఫోల్డర్‌ను సృష్టించండి + + ఫోల్డర్ పేరు (అవసరమైనది) + + చేర్చబడిన చాట్స్ + + చాట్‌లను జోడించండి + + ఈ ఫోల్డర్‌లో కనిపించాలనుకుంటున్న చాట్‌లను మీరు ఎంచుకోండి. + + మినహాయింపులు + + చాట్‌లను మినహాయించండి + + ఈ ఫోల్డర్లో కనిపించకూడదనుకునే చాట్‌లను మీరు ఎంచుకోండి. + + చదవని చాట్‌లను మాత్రమే చూపండి + + ప్రారంభించబడినప్పుడు, చదవని సందేశాలతో కూడిన చాట్‌లు మాత్రమే ఈ ఫోల్డర్‌లో చూపబడతాయి. + + మ్యూట్ చేయబడిన చాట్‌లను చేర్చండి + + సృష్టించు + + ఫోల్డర్‌ను సృష్టించేదా? + + మీరు చాట్ ఫోల్డర్ \"%1$s\" ను సృష్టించాలనుకుంటున్నారా? + + ఫోల్డర్‌ను సృష్టించండి + + ఫోల్డర్‌ను సవరించండి + + సేవ్ చేయండి + + మార్పులను సేవ్ చేసేదా? + + మీరు చేసిన మార్పులను ఈ చాట్ ఫోల్డర్‌లో సేవ్ చేయాలనుకుంటున్నారా? + + మార్పులను సేవ్ చేయండి + + తీసివేయు + + ఫోల్డర్‌ను తొలగించండి + + ఈ చాట్ ఫోల్డర్‌ను తొలగించేదా? + + + + చాట్ రకాలు + + పూర్తయింది సందేశాలు @@ -5112,6 +5248,7 @@ మీడియా నాణ్యత + పంపిన మీడియా నాణ్యత అధిక నాణ్యత కలిగిన మీడియాను పంపడం వల్ల మరింత డేటా ఉపయోగించబడుతుంది. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + మీ బ్యాకప్‌ల సబ్స్క్రిప్షన్ గడువు ముగిసింది - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + మీ బ్యాకప్ ప్లాన్ గడువు ముగిసింది ఎందుకంటే అది మీ ప్రస్తుత చెల్లింపు విధానంతో పునరుద్ధరించడం సాధ్యం కాదు. %1$d రోజు తర్వాత, మీ బ్యాకప్‌లోని మీడియా తొలగించబడుతుంది. + మీ బ్యాకప్ ప్లాన్ గడువు ముగిసింది ఎందుకంటే అది మీ ప్రస్తుత చెల్లింపు విధానంతో పునరుద్ధరించడం సాధ్యం కాదు.%1$d రోజుల తర్వాత, మీ బ్యాకప్‌లోని మీడియా తొలగించబడుతుంది. మీ మీడియాను అంతా బ్యాకప్ చేయడం కొనసాగించడానికి మీరు ఏ సమయంలోనైనా బ్యాకప్‌ల కోసం మళ్ళీ చెల్లించడం ప్రారంభించవచ్చు. @@ -7254,9 +7391,9 @@ ఒక వేళ మీరు \"స్కిప్\" ను ఎంచుకుంటే మీ బ్యాకప్లో ఉన్న మీడియా %1$d రోజులలో తొలగించబడుతుంది. - Your backups subscription failed to renew + మీ బ్యాకప్‌ల సబ్స్క్రిప్షన్ పునరుద్ధరించబడడంలో విఫలమైంది - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + మీ చెల్లింపు విధానం అప్ టు డేట్ గా ఉందో లేదో తనిఖీ చేయండి. మేనేజ్ సబ్స్క్రిప్షన్ ను తట్టండి మరియు చెల్లింపు విధానాల కింద అప్‌డేట్ తట్టండి. బ్యాకప్‌ను పూర్తి చేయలేకపోయాము @@ -7268,7 +7405,7 @@ సబ్‌స్క్రిప్షన్‌ను నిర్వహించండి - Subscribe for %1$s/month + %1$s/నెలకు సబ్‌స్క్రైబ్ చేయండి ఇప్పుడే మీడియాను డౌన్‌లోడ్ చేయండి @@ -7303,6 +7440,17 @@ %1$s ఆఫ్ %2$s + + + డౌన్‌లోడ్‌ను రద్దు చేయండి + + డౌన్లోడ్ అవుతోంది: %2$s యొక్క%1$s (%3$s%%) + + మీ బ్యాకప్‌ను డౌన్లోడ్ చేయడానికి తగినంత స్థలం లేదు. కొనసాగించడానికి స్థలంలో %1$s ను ఖాళీ చేయండి. + + డౌన్‌లోడ్‌ను దాటవేయండి + + "మీ చివరి బ్యాకప్‌ను పూర్తిచేయడం సాధ్యం కాలేదు. మీ ఫోన్ Wi-Fi కు కనెక్ట్ చేయబడిందని నిర్ధారించుకొని మళ్ళీ ప్రయత్నించడానికి ఇప్పుడే బ్యాకప్ చేయండిని తట్టండి." @@ -7356,18 +7504,18 @@ నిల్వ అనుకూలత Signal బ్యాకప్‌ల చెల్లింపు శ్రేణితో మాత్రమే ఉపయోగించడానికి సాధ్యం అవుతుంది. ఈ విలక్షణత ఉపయోగించడం ప్రారంభించడానికి మీ బ్యాకప్ ప్లాన్ అప్‌గ్రేడ్ చేయండి. - Subscribe for %1$s/month + %1$s/నెలకు సబ్‌స్క్రైబ్ చేయండి - This media is no longer available + ఈ మీడియా ఇకపై అందుబాటులో లేదు - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + మీ ప్రస్తుత Signal బ్యాకప్ ప్లాన్ మీ ఇటీవలి %1$d రోజు మీడియా ను కలిగి ఉంది. మీ మొత్తం మీడియాను బ్యాకప్ చేయడం ప్రారంభించడానికి, ఇప్పుడే అప్‌గ్రేడ్ చేయండి. + మీ ప్రస్తుత సిగ్నల్ బ్యాకప్ ప్లాన్ మీ ఇటీవలి %1$d రోజుల మీడియాను కలిగి ఉంది. మీ మొత్తం మీడియాను బ్యాకప్ చేయడం ప్రారంభించడానికి, ఇప్పుడే అప్‌గ్రేడ్ చేయండి. - Subscribe for %1$s/month + %1$s/నెలకు సబ్‌స్క్రైబ్ చేయండి తొలగించడం ఇప్పుడు మీ అన్ని పరికరాలలో సింక్ చేయబడింది @@ -7415,6 +7563,8 @@ డౌన్‌లోడ్ పూర్తయింది బ్యాకప్ రాత్రికి రాత్రి సృష్టించబడుతుంది. + + సబ్స్క్రిప్షన్ నిష్క్రియంగా ఉంది బ్యాకప్ ప్రణాళిక @@ -7423,8 +7573,12 @@ %1$s/నెల మీ బ్యాకప్ ప్రణాళిక ఉచితం - + %1$s ను పునరుద్ధరిస్తుంది + + %1$s న గడువు ముగుస్తుంది + + %1$s న గడువు ముగిసింది మీ సందేశ చరిత్రను బ్యాకప్ చేసుకోండి దానివల్ల మీరు కొత్త ఫోన్ కొన్నప్పుడు గానీ లేదా Molly ను తిరిగి ఇన్‌స్టాల్ చేసినప్పుడు గానీ డేటాను ఎప్పటికీ కోల్పోరు. @@ -7469,6 +7623,10 @@ మాన్యువల్‌గా బ్యాకప్ చేయండి దయచేసి మీ పరికరం PIN, పాస్‌వర్డ్ లేదా ప్యాటర్న్ ఎంటర్ చేయండి. + + బ్యాకప్‌లను మళ్ళీ ప్రారంభించండి + + బ్యాకప్స్ ఆఫ్ చేయబడ్డాయి మరియు Signal యొక్క సురక్షిత నిల్వ సేవ నుండి మీ డేటా తొలగించబడింది. diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index f0abd6e784..ddd8934754 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -362,6 +362,8 @@ แชท ข้อความ + + ประเภทของแชท ข้อความ %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + ตั้งค่าเรียบร้อย เริ่มสำรองข้อมูลของคุณได้เลย ขั้นตอนนี้อาจใช้เวลาค่อนข้างนาน ขึ้นอยู่กับขนาดของข้อมูลสำรอง โดยคุณสามารถใช้โทรศัพท์ได้ตามปกติในระหว่างที่ระบบกำลังสำรองข้อมูล @@ -1905,6 +1907,7 @@ +%1$d ได้รับเชิญ + %1$d กลุ่มเพิ่มเติม @@ -1930,6 +1933,7 @@ ไม่พบอุปกรณ์ ข้อผิดพลาดจากเครือข่าย รหัส QR ไม่ถูกรูปแบบ + ขออภัย คุณมีอุปกรณ์ที่เชื่อมโยงมากเกินไป ลองถอนการเชื่อมโยงจากบางอุปกรณ์ ขออภัย นี่ไม่ใช่รหัส QR สำหรับเชื่อมโยงอุปกรณ์ที่ถูกต้อง เชื่อมโยงกับอุปกรณ์ Signal หรือไม่? @@ -1951,11 +1955,13 @@ ส่งวลีรหัสผ่าน วลีรหัสผ่านไม่ถูกต้อง! ปลดล็อก Molly + Molly Android - หน้าล็อก แผนที่ + ปักหมุด ยอมรับที่อยู่ @@ -2437,6 +2443,7 @@ ข้อความ Signal + ดูเพิ่ม @@ -2468,6 +2475,7 @@ ไม่มีการติดตั้งสติกเกอร์ สติกเกอร์จากข้อความเข้าจะปรากฏที่นี่ ไม่มีชื่อ + ไม่ทราบ @@ -2688,6 +2696,7 @@ สื่อตัวนี้ไม่มีอยู่แล้ว ไม่สามารถเล่นสื่อได้ + เกิดข้อผิดพลาดในการหาข้อความ ไม่พบแอปที่แบ่งปันสื่อนี้ได้ ปิด @@ -2757,6 +2766,7 @@ ข้อความ การโทร + ความล้มเหลว ข้อมูลสำรอง สถานะล็อก @@ -2766,6 +2776,7 @@ ไม่ทราบ ข้อความเสียง มีผู้ติดต่อเริ่มใช้ Signal + ไม่มีกิจกรรมเพื่อเปิดการตั้งค่าเปิดการแจ้งเตือนช่อง การเชื่อมต่อพื้นหลัง @@ -3537,10 +3548,12 @@ ประวัติการส่งข้อความทั้งหมดจะถูกลบออกจากอุปกรณ์ทุกเครื่องอย่างถาวร การกระทำนี้ไม่สามารถยกเลิกได้ ลบทั้งหมดเดี๋ยวนี้ + ตลอดไป 1 ปี 6 เดือน 30 วัน + ไม่มี %1$s ข้อความ @@ -3564,6 +3577,7 @@ แสดง เสียงเรียกเข้า ขนาดอักษรของข้อความ + ความสำคัญ แก้ไขปัญหาเกี่ยวกับการแจ้งเตือน @@ -3792,6 +3806,7 @@ สแกนรหัส QR ที่อยู่ของผู้รับจ่าย + คำขอ จ่าย ยอดคงเหลือ: %1$s @@ -3922,6 +3937,7 @@ คุณปักหมุดแชทได้ %1$d รายการเท่านั้น + รูปภาพของผู้ติดต่อ ถูกเก็บเข้าที่เก็บถาวรแล้ว @@ -3930,6 +3946,10 @@ แชทใหม่ เปิดกล้อง ยังไม่มีแชท\nเริ่มต้นด้วยการส่งข้อความหาเพื่อนสักคน + + ไม่มีแชทให้แสดง + + การตั้งค่าของโฟลเดอร์ @@ -4154,6 +4174,7 @@ ข้อมูลสำรองของแชท ถ่ายโอนบัญชี ถ่ายโอนบัญชีไปยังอุปกรณ์ Android เครื่องใหม่ + ใส่วลีรหัสผ่านสำหรับข้อมูลสำรอง กู้คืน ไม่สามารถนำเข้าข้อมูลสำรองจาก Signal รุ่นที่ใหม่กว่า @@ -4361,6 +4382,7 @@ ไม่สามารถเปิดการตั้งค่า Wi-Fi ได้ กรุณาเปิดใช้งาน Wi-Fi ด้วยตนเอง + อนุญาตให้เข้าถึงตำแหน่ง เปิดการใช้งานการเข้าถึงตำแหน่ง เปิดใช้งาน Wi-Fi @@ -4607,6 +4629,7 @@ แบ่งปัน + ส่ง , %1$s @@ -4909,6 +4932,116 @@ แป้นพิมพ์ กด Enter เพื่อส่ง + + โฟลเดอร์แชท + + เพิ่มโฟลเดอร์แชท + + + + จัดแยกแชทเป็นโฟลเดอร์ ให้คุณเปิดสลับไปมาได้อย่างสะดวกรวดเร็วในหน้ารายการแชท + + โฟลเดอร์ + + สร้างโฟลเดอร์ + + แชททั้งหมด + + โฟลเดอร์ที่แนะนำ + + ยังไม่ได้อ่าน + + ข้อความที่ยังไม่ได้อ่านจากแชททั้งหมด + + แชทส่วนตัว + + ข้อความจากแชทส่วนตัวเท่านั้น + + กลุ่ม + + ข้อความจากแชทกลุ่มเท่านั้น + + เพิ่ม + + เพิ่มโฟลเดอร์ \"%1$s\" เรียบร้อยแล้ว + + แก้ไขโฟลเดอร์ + + ลบโฟลเดอร์ + + เพิ่มโฟลเดอร์ใหม่ + + ปิดการแจ้งเตือนทั้งหมด + + เปลี่ยนการจัดเรียงโฟลเดอร์ + + ทำเครื่องหมายทั้งหมดว่าอ่านแล้ว + + + แชท %1$d ประเภท + + + + %1$d แชท + + + + ไม่รวมแชท %1$d รายการ + + + + + สร้างโฟลเดอร์ + + ชื่อโฟลเดอร์ (ต้องระบุ) + + แชทในโฟลเดอร์ + + เพิ่มแชท + + เลือกแชทที่คุณต้องการให้ปรากฏในโฟลเดอร์นี้ + + ข้อยกเว้น + + แยกแชทออกจากโฟลเดอร์ + + เลือกแชทที่คุณไม่ต้องการให้ปรากฏในโฟลเดอร์นี้ + + แสดงเฉพาะแชทที่ยังไม่ได้อ่าน + + เมื่อเปิดใช้งาน โฟลเดอร์นี้จะแสดงเฉพาะแชทที่มีข้อความที่ยังไม่ได้อ่าน + + รวมแชทที่ถูกปิดการแจ้งเตือนเข้าไว้ด้วย + + สร้าง + + สร้างโฟลเดอร์ใช่หรือไม่ + + คุณต้องการสร้างโฟลเดอร์แชท \"%1$s\" ใช่หรือไม่ + + สร้างโฟลเดอร์ + + แก้ไขโฟลเดอร์ + + บันทึก + + บันทึกการเปลี่ยนแปลงหรือไม่ + + คุณต้องการบันทึกการเปลี่ยนแปลงในโฟลเดอร์แชทนี้หรือไม่ + + บันทึกการเปลี่ยนแปลง + + ยกเลิก + + ลบโฟลเดอร์ + + ลบโฟลเดอร์แชทนี้ใช่หรือไม่ + + + + ประเภทของแชท + + เสร็จสิ้น ข้อความ @@ -4992,6 +5125,7 @@ คุณภาพของสื่อ + ส่งคุณภาพสื่อแล้ว การส่งสื่อคุณภาพสูงจะใช้ข้อมูลมากขึ้น @@ -7076,10 +7210,10 @@ - Your backups subscription expired + แพ็กเกจสำรองข้อมูลของคุณหมดอายุแล้ว - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + แพ็กเกจสำรองข้อมูลของคุณหมดอายุเนื่องจากไม่สามารถใช้วิธีการชำระเงินที่คุณบันทึกไว้ในการต่ออายุได้ โดยไฟล์สื่อที่คุณสำรองข้อมูลไว้จะถูกลบภายใน %1$d วัน หากต้องการสำรองข้อมูลสื่อต่อ คุณสามารถเริ่มชำระเงินเพื่อสำรองข้อมูลอีกครั้งได้ทุกเมื่อ @@ -7096,9 +7230,9 @@ หากคุณเลือก \"ข้าม\" ไฟล์สื่อในข้อมูลสำรองของคุณจะถูกลบใน %1$d วัน - Your backups subscription failed to renew + ไม่สามารถต่ออายุแพ็กเกจสำรองข้อมูลของคุณ - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + โปรดตรวจสอบให้แน่ใจว่าคุณอัปเดตวิธีการชำระเงินแล้ว โดยแตะที่จัดการการเป็นสมาชิก แล้วแตะอัปเดตตรงหัวข้อวิธีการชำระเงิน การสำรองข้อมูลไม่เสร็จสมบูรณ์ @@ -7110,7 +7244,7 @@ จัดการการเป็นสมาชิก - Subscribe for %1$s/month + สมัครใช้งาน %1$s/เดือน ดาวน์โหลดสื่อเดี๋ยวนี้ @@ -7145,6 +7279,17 @@ %1$s จาก %2$s + + + ยกเลิกการดาวน์โหลด + + กำลังดาวน์โหลด: %1$s จาก %2$s (%3$s%%) + + พื้นที่จัดเก็บของคุณไม่เพียงพอสำหรับการดาวน์โหลดข้อมูลสำรอง โปรดเพิ่มพื้นที่จัดเก็บ %1$s เพื่อดำเนินการต่อ + + ข้ามการดาวน์โหลด + + "การสำรองข้อมูลครั้งล่าสุดของคุณไม่เสร็จสมบูรณ์ โปรดตรวจสอบว่าโทรศัพท์เชื่อมต่อกับ Wi-Fi แล้วแตะสำรองข้อมูลเดี๋ยวนี้เพื่อลองอีกครั้ง" @@ -7198,17 +7343,17 @@ เริ่มใช้งานฟีเจอร์การเพิ่มประสิทธิภาพพื้นที่จัดเก็บ โดยอัปเกรดแพ็กเกจสำรองข้อมูลของคุณด้วยการชำระค่าสำรองข้อมูลของ Signal - Subscribe for %1$s/month + สมัครใช้งาน %1$s/เดือน - This media is no longer available + ไม่พบไฟล์สื่อนี้ - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + แพ็กเกจสำรองข้อมูล Signal ที่คุณใช้อยู่จะสำรองไฟล์สื่อจาก %1$d วันที่ผ่านมา โปรดอัปเกรดแพ็กเกจของคุณเพื่อเริ่มสำรองไฟล์สื่อทั้งหมด - Subscribe for %1$s/month + สมัครใช้งาน %1$s/เดือน การลบซิงค์เข้ากับอุปกรณ์ทุกเครื่องของคุณแล้ว @@ -7256,6 +7401,8 @@ ดาวน์โหลดเสร็จสิ้น ระบบจะสำรองข้อมูลในช่วงกลางคืน + + ไม่มีแพ็กเกจที่ใช้งานอยู่ แพ็กเกจสำรองข้อมูล @@ -7264,8 +7411,12 @@ %1$s/เดือน แพ็กเกจสำรองข้อมูลที่คุณเลือกไม่มีค่าใช้จ่าย - + ต่ออายุ %1$s + + จะหมดอายุวันที่ %1$s + + หมดอายุแล้ววันที่ %1$s สำรองประวัติการส่งข้อความของคุณ ช่วยเก็บรักษาข้อมูลแม้ในกรณีที่คุณเปลี่ยนโทรศัพท์เครื่องใหม่หรือติดตั้ง Molly อีกครั้ง @@ -7310,6 +7461,10 @@ สำรองข้อมูลด้วยตัวเอง โปรดใส่ PIN, รหัสผ่าน หรือรูปแบบการวาดเส้นของอุปกรณ์คุณ + + เปิดใช้งานการสำรองข้อมูลอีกครั้ง + + ปิดใช้งานการสำรองข้อมูลและข้อมูลของคุณถูกลบออกจากบริการจัดเก็บที่ปลอดภัยของ Signal แล้ว diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index e04e2eebbd..0fdd7f789d 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -365,6 +365,8 @@ Chats Messages + + Chat types Mensahe %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Ready ka na. Simulan na ang pag-backup. Depende sa size ng backup mo, maaari itong tumagal. Maaari mong gamitin ang iyong phone as usual habang isinasagawa ang backup. @@ -1966,6 +1968,7 @@ +%1$d invited +%1$d invited + %1$d additional group %1$d additional groups @@ -1992,6 +1995,7 @@ Walang device na nahanap. Nagka-error sa network. Hindi valid ang QR code. + Paumanhin, masyado ka nang maraming naka-link na device, subukang magtanggal ng ilan Paumanhin, hindi ito valid na QR code para sa pagli-link ng device. Mag-link ng Signal na device? @@ -2014,11 +2018,13 @@ Isumite ang passphrase Hindi valid ang passphrase! I-unlock ang Molly + Molly Andoid - Lock Screen Mapa + Maglagay ng pin Tanggapin ang address @@ -2522,6 +2528,7 @@ Mensahe sa Signal + More @@ -2553,6 +2560,7 @@ Walang naka-install na sticker Ang mga sticker mula sa mga paparating na mensahe ay lalabas dito Walang pamagat + Hindi alam @@ -2774,6 +2782,7 @@ Hindi na available ang media. Hindi ma-play ang media. + Nagka-error sa paghahanap ng message. Walang makitang app na pwedeng mag-share ng media na ito. Isara @@ -2845,6 +2854,7 @@ Mga Mensahe Mga Tawag + Mga kabiguan Mga backup Lock na status @@ -2854,6 +2864,7 @@ Hindi alam Voice Notes Sumali ang kontak sa Signal + Walang activity na available para i-open ang notification channel settings. Background connection @@ -3638,10 +3649,12 @@ Ang buong message history ay permanenteng tatanggalin. Hindi na pwedeng bawiin ang action na ito. Burahin na lahat + Forever 1 year 6 months 30 days + Wala %1$s message @@ -3666,6 +3679,7 @@ Ipakita Ringtone Laki ng font ng mensahe + Priyoridad I-troubleshoot ang notifications @@ -3894,6 +3908,7 @@ I-scan ang address QR code ng payee + Request Pay Available balance: %1$s @@ -4025,6 +4040,7 @@ Up to %1$d chats ang pwede mong i-pin + Larawang Imahe ng Kontak Nai-archive @@ -4033,6 +4049,10 @@ Bagong chat Buksan ang Camera Wala pang chats.\nMag-message ng friend para magsimula. + + Walang makitang chats + + Folder settings @@ -4265,6 +4285,7 @@ Chat backups Transfer account I-transfer ang account sa bagong Android device + Ilagay ang passphrase ng backup I-restore \'Di ma-import ang backups mula sa newer Signal versions @@ -4472,6 +4493,7 @@ Unable to open Wi-Fi Settings. I-turn on ang Wi-Fi manually. + Grant location permission I-turn on ang location services I-turn on ang Wi-Fi @@ -4725,6 +4747,7 @@ Ibahagi + Ipadala , %1$s @@ -5028,6 +5051,119 @@ Keyboard Mag-send gamit ang enter + + Chat folders + + Magdagdag ng chat folder + + + + I-organize ang chats mo sa iba\'t-ibang folders at mag-switch nang mabilis sa mga ito sa iyong chat list. + + Folders + + Gumawa ng folder + + Lahat ng chats + + Suggested folders + + Unreads + + Unread messages mula sa lahat ng chats + + 1:1 chats + + Messages lang mula sa direct chats + + Groups + + Messages lang mula sa group chats + + Mag-add + + Idinagdag ang %1$s folder. + + I-edit ang folder + + Burahin ang folder + + Magdagdag ng bagong folder + + I-mute lahat + + Ayusin ang folders + + Markahan ang lahat na nabasa na + + + %1$d type ng chat + %1$d types ng chat + + + + %1$d chat + %1$d chats + + + + %1$d chat ang excluded + %1$d chats ang excluded + + + + + Gumawa ng folder + + Pangalan ng folder (required) + + Included chats + + Magdagdag ng chats + + Piliin ang chats na gusto mong makita sa folder na ito. + + Exceptions + + Mag-exclude ng chats + + Piliin ang chats na ayaw mong makita sa folder na ito. + + Ipakita lamang ang unread chats + + Kapag naka-enable, ang chats na may unread messages lamang ang ipakikita sa folder na ito. + + Isama ang muted chats + + Lumikha + + Gumawa ng folder? + + Gusto mo bang gawin ang chat folder na \"%1$s\"? + + Gumawa ng folder + + I-edit ang folder + + I-save + + I-save ang changes? + + Gusto mo bang i-save ang changes na ginawa mo sa chat folder na ito? + + I-save ang changes + + I-discard + + Burahin ang folder + + Gusto mo bang burahin ang chat folder na ito? + + + + Chat types + + Done Mga Mensahe @@ -5112,6 +5248,7 @@ Media quality + Sent media quality Ang pag-send ng high quality media will use more data. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Expired na ang backups subscription mo - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Nag-expire na ang backup plan mo dahil hindi ito na-renew gamit ang current payment method mo. Mabubura ang media sa backup mo pagkatapos ng %1$d araw. + Nag-expire na ang backup plan mo dahil hindi ito na-renew gamit ang current payment method mo. Mabubura ang media sa backup mo pagkatapos ng %1$d araw. Maaari kang magbayad ulit para sa backups anumang oras para magpatuloy sa pag-back up ng lahat ng media mo. @@ -7254,9 +7391,9 @@ Kapag pinili mo ang \"Skip\", mabubura ang media sa backup mo pagkatapos ng %1$d na araw. - Your backups subscription failed to renew + Failed ang pag-renew ng backups subscription mo - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Siguraduhing updated ang payment method. I-tap ang Manage subscription at sa ilalim ng Payment methods, i-tap ang Update. Hindi makumpleto ang backup @@ -7268,7 +7405,7 @@ I-manage ang subscription - Subscribe for %1$s/month + Mag-subscribe. %1$s/month. I-download na ang media @@ -7303,6 +7440,17 @@ %1$s sa %2$s + + + Kanselahin ang pag-download + + Nagda-download: %1$s ng %2$s (%3$s%%) + + Walang enough space para i-download ang Backup mo. Para ituloy ang backup, mag-free up ng %1$s ng space. + + I-skip ang download + + "Hindi makumpleto ang huling backup mo. Siguraduhing connected sa Wi-Fi ang phone mo at i-tap ang Back up now para subukan ulit." @@ -7356,18 +7504,18 @@ Ang storage optimization ay magagamit lamang sa paid tier ng Signal Backups. I-upgrade ang backup plan mo para masimulang gamitin ang feature na ito. - Subscribe for %1$s/month + Mag-subscribe. %1$s/month. - This media is no longer available + Hindi na available ang media na ito - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Kasama sa current Signal backup plan mo ang pinaka-recent na media noong nakaraang %1$d araw. Para simulan ang pag-back up ng lahat ng media mo, mag-upgrade na ngayon. + Kasama sa current Signal backup plan mo ang pinaka-recent na media noong nakaraang %1$d araw. Para simulan ang pag-back up ng lahat ng media mo, mag-upgrade na ngayon. - Subscribe for %1$s/month + Mag-subscribe. %1$s/month. Naka-sync na sa lahat ng devices mo ang pagbura ng messages @@ -7410,11 +7558,13 @@ Pinalitan ang uri ng backup at kinansela ang subscription - Cancelled ang subscription + Kinancel ang subscription Tapos na ang pag-download Gagawin ang backup overnight. + + Inactive ang subscription Backup plan @@ -7423,8 +7573,12 @@ %1$s/buwan Free ang backup plan mo - + Mare-renew sa %1$s + + Mage-expire sa %1$s + + Nag-expire noong %1$s I-back up ang message history mo para hindi mawala ang data mo kapag nagpalit ka ng phone o ni-reinstall mo ang Molly. @@ -7469,6 +7623,10 @@ Manual na pag backup Ilagay ang iyong device pin, password o pattern. + + I-enable ulit ang backups + + In-off ang backups at ang iyong data ay binura mula sa secure storage service ng Signal. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4e289db1e3..4fb440aae1 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -365,6 +365,8 @@ Sohbetler Mesajlar + + Sohbet türleri İleti %1$s @@ -813,7 +815,7 @@ - You\'re all set. Start your backup now. + Şimdi hazırsın. Yedeklemeni şimdi başlat. Yedeklemenin büyüklüğüne bağlı olarak bu işlem uzun sürebilir. Yedekleme gerçekleşirken telefonunu normal şekilde kullanabilirsin. @@ -1966,6 +1968,7 @@ +%1$d davetli +%1$d davetli + %1$d diğer grup %1$d diğer grup @@ -1992,6 +1995,7 @@ Hiç cihaz bulanamadı. Ağ hatası. Geçersiz karekod. + Üzgünüz, halihazırda bağlı olan çok fazla cihazınız var. Bazılarını kaldırmayı deneyin. Üzgünüz, bu geçerli bir cihaz bağlama karekodu değil. Bir Signal cihazı bağlansın mı? @@ -2014,11 +2018,13 @@ Parola gir Geçersiz parola! Molly\'in Kilidini Aç + Molly Android - Kilit Ekranı Harita + İşaretle Adresi onayla @@ -2522,6 +2528,7 @@ Signal İletisi + Daha fazla @@ -2553,6 +2560,7 @@ Yüklü çıkartma yok Gelen iletilerden aldığınız çıkartmalar burada gözükecektir İsimsiz + Bilinmeyen @@ -2774,6 +2782,7 @@ İçerik artık mevcut değil. Medya oynatılamıyor. + Mesaj bulma hatası. Bu içeriği paylaşabilen bir uygulama bulunamadı. Kapat @@ -2845,6 +2854,7 @@ İletiler Aramalar + Hatalar Yedekler Kilit durumu @@ -2854,6 +2864,7 @@ Bilinmeyen Sesli Notlar Kontaklarınızdan biri Signal\'e katıldı + Bildirim kanal ayarlarını açmak için mevcut bir faaliyet yok Arkaplan bağlantısı @@ -3638,10 +3649,12 @@ Tüm mesaj geçmişi cihazların hepsinden kalıcı olarak kaldırılacaktır. Bu eylem geri alınamaz. Tümünü hemen sil + Daima 1 yıl 6 ay 30 gün + Hiçbiri %1$s mesaj @@ -3666,6 +3679,7 @@ Göster Zil sesi İleti yazı tipi boyutu + Öncelik Bildirim sorunlarını giderme @@ -3894,6 +3908,7 @@ Alacaklının adres kare kodunu tara + İstek Öde Mevcut bakiye: %1$s @@ -4025,6 +4040,7 @@ Yalnızca %1$d sohbet sabitleyebilirsin + Kişi Fotoğrafı Arşivlendi @@ -4033,6 +4049,10 @@ Yeni sohbet Kamerayı Aç Henüz sohbet yok.\nBir arkadaşına mesaj göndererek başlayabilirsin. + + Görüntülenecek sohbet yok + + Klasör ayarları @@ -4265,6 +4285,7 @@ Sohbet yedekleri Hesabı aktar Hesabı yeni bir Android cihaza aktar + Yedek parolasını giriniz Geri yükle Signal\'in daha yeni sürümlerinden yedek alınamaz @@ -4472,6 +4493,7 @@ Kablosuz ayarları açılamadı. Lütfen kablosuzu açın. + Konum izni ver Konum hizmetlerini aç Kablosuzu aç @@ -4725,6 +4747,7 @@ Paylaş + Gönder , %1$s @@ -5028,6 +5051,119 @@ Klavye Enter ile gönder + + Sohbet klasörleri + + Sohbet klasörü ekle + + + + Sohbetlerini klasörler halinde düzenle ve sohbet listende bunlar arasında hızla geçiş yap. + + Klasörler + + Bir klasör oluştur + + Tüm sohbetler + + Önerilen klasörler + + Okunmayanlar + + Tüm sohbetlerden okunmamış mesajlar + + Bireysel sohbetler + + Yalnızca doğrudan sohbetlerdeki mesajlar + + Gruplar + + Yalnızca grup sohbetlerindeki mesajlar + + Ekle + + %1$s klasörü eklendi. + + Klasörü düzenle + + Klasörü sil + + Yeni klasör ekle + + Tümünü sessize al + + Klasörleri yeniden sırala + + Tümünü okundu olarak işaretle + + + %1$d sohbet türü + %1$d sohbet türü + + + + %1$d sohbet + %1$d sohbet + + + + %1$d sohbet hariç tutuldu + %1$d sohbet hariç tutuldu + + + + + Bir klasör oluştur + + Klasör adı (zorunlu) + + Dahil edilen sohbetler + + Sohbet ekle + + Bu klasörde görünmesini istediğin sohbetleri seç. + + İstisnalar + + Sohbeti hariç tut + + Bu klasörde görünmesini istemediğin sohbetleri seç. + + Yalnızca okunmamış sohbetleri göster + + Etkinleştirildiğinde, bu klasörde yalnızca okunmamış mesajları olan sohbetler gösterilir. + + Sessize Alınan Sohbetler Sayılsın + + Oluştur + + Klasör oluşturulsun mu? + + \"%1$s\" sohbet klasörünü oluşturmak istiyor musun? + + Klasör oluştur + + Klasörü düzenle + + Kaydet + + Değişiklikler kaydedilsin mi? + + Bu sohbet klasöründe yaptığın değişiklikleri kaydetmek istiyor musun? + + Değişiklikleri kaydet + + Vazgeç + + Klasörü sil + + Bu sohbet klasörü silinsin mi? + + + + Sohbet türleri + + Tamam İletiler @@ -5112,6 +5248,7 @@ İçerik kalitesi + Gönderilen içerik kalitesi Yüksek kalitede içerik göndermek daha fazla veri kullanacaktır. @@ -7232,11 +7369,11 @@ - Your backups subscription expired + Yedekleme aboneliğinin süresi doldu - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Mevcut ödeme yönteminle yenilenemediği için yedekleme planının süresi doldu. %1$d gün sonra yedeklemendeki medyalar silinecek. + Mevcut ödeme yönteminle yenilenemediği için yedekleme planının süresi doldu. %1$d gün sonra yedeklemendeki medyalar silinecek. Medyanın tamamını yedeklemeye devam etmek için istediğin zaman yedeklemeler için yeniden ödeme yapmaya başlayabilirsin. @@ -7254,9 +7391,9 @@ \"Atla\" öğesini seçersen yedeklemendeki medya %1$d gün içinde silinecektir. - Your backups subscription failed to renew + Yedekleme aboneliğin yenilenemedi - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Ödeme yönteminin güncel olduğundan emin olmak için kontrol et. Aboneliği yönet\'e ve Ödeme yöntemleri altında Güncelle\'ye dokun. Yedekleme tamamlanamadı @@ -7268,7 +7405,7 @@ Aboneliği yönet - Subscribe for %1$s/month + %1$s/ay ile abone ol Medyayı şimdi indir @@ -7303,6 +7440,17 @@ %1$s / %2$s + + + İndirmeyi iptal et + + İndiriliyor: %1$s / %2$s (%%%3$s) + + Yedeklemeni indirecek yeterli alan yok. Devam etmek için %1$s alan boşalt. + + İndirmeyi atla + + "Son yedeklemen tamamlanamadı. Telefonunun Wi-Fi\'ye bağlı olduğundan emin ol ve tekrar denemek için Şimdi yedekle\'ye dokun." @@ -7356,18 +7504,18 @@ Depolama optimizasyonu yalnızca Signal Yedeklemelerin ücretli katmanı ile kullanılabilir. Bu özelliği kullanmaya başlamak için yedekleme planını yükselt. - Subscribe for %1$s/month + %1$s/ay ile abone ol - This media is no longer available + Bu medya artık kullanılamıyor - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Mevcut Signal yedekleme planın en son %1$d günlük medyanı içerir. Tüm medyanı yedeklemeye başlamak için şimdi yükselt. + Mevcut Signal yedekleme planın en son %1$d günlük medyanı içerir. Tüm medyanı yedeklemeye başlamak için şimdi yükselt. - Subscribe for %1$s/month + %1$s/ay ile abone ol Silme işlemi şu anda tüm cihazlarında senkronize ediliyor @@ -7415,6 +7563,8 @@ İndirme tamamlandı Yedekleme gece boyunca oluşturulur. + + Abonelik etkin değil Yedekleme planı @@ -7423,8 +7573,12 @@ %1$s/ay Yedekleme planın ücretsizdir - + %1$s tarihinde yenilenir + + %1$s tarihinde sona eriyor + + %1$s tarihinde sona erdi Mesaj geçmişini yedekle böylece yeni bir telefon aldığında veya Molly\'i yeniden yüklediğinde asla veri kaybetmezsin. @@ -7469,6 +7623,10 @@ Manüel yedekleme Lütfen cihaz pinini, parolanı veya desenini gir. + + Yedeklemeleri yeniden etkinleştir + + Yedeklemeler kapatıldı ve verilerin Signal\'in güvenli depolama hizmetinden silindi. diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml index 4cfaafa828..8bf57f0b31 100644 --- a/app/src/main/res/values-ug/strings.xml +++ b/app/src/main/res/values-ug/strings.xml @@ -362,6 +362,8 @@ پاراڭلار ئۇچۇرلار + + پاراڭ تۈرلىرى %1$s گە ئۇچۇر قىلىش @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + ھەممىسى تەييار بولدى. زاپاسلاشنى ھازىرلا باشلاڭ. زاپاسلايدىغان مەلۇماتلارنىڭ ھەجىمى سەۋەبىدىن ، بۇنىڭغا ئۇزۇن ۋاقىت كېتىشى مۇمكىن. زاپاسلاش ئېلىپ بېرىلۋاتقاندىمۇ تېلېفونىڭىزنى ئادەتتىكىدەكلا ئىشلىتەلەيسىز. @@ -1905,6 +1907,7 @@ +%1$d تەكلىپ قىلىندى + %1$d قوشۇمچە گۇرۇپپا @@ -1930,6 +1933,7 @@ ھېچقانداق ئۈسكۈنە تېپىلمىدى. تور خاتالىقى. ئىناۋەتسىز QR كودى. + كەچۈرۈڭ، ئۇلانغان ئۈسكۈنىلىرىڭىز بەك كۆپ بولۇپ كەتتى، بەزىلىرىنى چىقىرىۋېتىڭ كەچۈرۈڭ، بۇ ئىناۋەتلىك بولغان ئۈسكۈنە ئۇلانمىسى QR كودى ئەمەس. بىر Signal ئۈسكۈنىسى ئۇلامسىز؟ @@ -1951,11 +1955,13 @@ ئىم ئىبارىسىنى تاپشۇرۇڭ ئىناۋەتسىز ئىم ئىبارىسى! Molly نى ئاجرىتىڭ + Molly Android - قۇلۇپ ئېكرانى خەرىتە + ئەن قوبۇللاش ئادرېسى @@ -2437,6 +2443,7 @@ Signal ئۇچۇرى + تېخىمۇ كۆپ @@ -2468,6 +2475,7 @@ چىراي ئىپادىسى ئورنىتىلمىغان بۇ جايدا كەلگەن ئۇچۇرلاردىكى چىراي ئىپادىلىرى كۆرۈنىدۇ ماۋزۇسىز + نامەلۇم @@ -2688,6 +2696,7 @@ ۋاسىتەنى ئىشلەتكىلى بولمايدۇ. مېدىيانى قويالمىدى. + ئۇچۇرنى ئىزدەش خاتالىقى. بۇ ۋاسىتەنى ھەمبەھىرلەيدىغان ئەپ تېپىلمىدى. تاقا @@ -2757,6 +2766,7 @@ ئۇچۇرلار چاقىرىشلار + مەغلۇبىيەت زاپاسلار قۇلۇپ ھالىتى @@ -2766,6 +2776,7 @@ نامەلۇم ئاۋازلىق ئەسلەتمە ئالاقاداش Signal غا قېتىلدى + ئۇقتۇرۇش قانال تەڭشەكلىرىنى ئاچىدىغان پائالىيەت يوق. ئارقا سۇپا ئۇلىنىشى @@ -3537,10 +3548,12 @@ بارلىق ئۈسكۈنىلەردىكى بارلىق ئۇچۇر خاتىرىسى مەڭگۈلۈك ئۆچۈرۈلىدۇ. بۇ مەشغۇلاتنى ئەمەلدىن قالدۇرغىلى بولمايدۇ. ھازىرلا ھەممىنى ئۆچۈر + مەڭگۈ 1 يىل 6 ئاي 30 كۈن + ھېچنېمە %1$s ئۇچۇرلار @@ -3564,6 +3577,7 @@ كۆرسەت قوڭغۇراق ئاۋازى ئۇچۇر خەت چوڭلۇقى + مۇھىملىقى كاشىلا ئوڭشاش ئۇقتۇرۇشلىرى @@ -3792,6 +3806,7 @@ پۇل ئالغۇچىنىڭ ئادرېس QR كودىنى سايىلەڭ + ئىلتىماس تۆلە ئىشلىتىشكە بولىدىغان قالدۇق: %1$s @@ -3922,6 +3937,7 @@ كۆپ بولغاندا %1$d پاراڭنى مىخلىيالايسىز + ئالاقەداش فوتو رەسىمى ئارخىپلاشتۇرۇلدى @@ -3930,6 +3946,10 @@ يېڭى پاراڭ كامېرا ئاچ تېخى پاراڭ يوق.\nدوستىڭىزغا ئۇچۇر يوللاپ پاراڭلىشىشنى باشلاڭ. + + كۆرسىتىدىغان پاراڭلار يوق + + ھۆججەت قىسقۇچ تەڭشىكى @@ -4154,6 +4174,7 @@ پاراڭ زاپاسلانمىسى ھېساباتنى يۆتكە يېڭى بىر Android ئۈسكىنىسگە ھېساباتنى يۆتكە + زاپاسلاش ئىم ئىبارىسىنى كىرگۈزۈڭ ئەسلىگە كەلتۈرۈش Signal نىڭ يېڭى نەشرىدىكى زاپاسلارنى ئەكىرگىلى بولمايدۇ @@ -4361,6 +4382,7 @@ Wi-Fi تەڭشەكلەرنى ئاچالمىدى. Wi-Fi ئېچىڭ. + ئورۇن ھوقۇقى بەر ئورۇن مۇلازىمىتىنى قوزغات Wi-Fi نى قوزغات @@ -4607,6 +4629,7 @@ ھەمبەھىرلە + ئەۋەت , %1$s @@ -4909,6 +4932,116 @@ ھەرپتاختا Enter بىلەن ئەۋەتىڭ + + پاراڭ ھۆججەت قىسقۇچلىرى + + بىرتال پاراڭ قىسقۇچ قوشۇش + + + + پاراڭلىرىڭىزنى ھۆججەت قىسقۇچقا ئورۇنلاشتۇرۇڭ ۋە پاراڭ تىزىملىكىڭىزدە تېز ئالماشتۇرۇڭ. + + ھۆججەت قىسقۇچلار + + بىرتال ھۆججەت قىسقۇچ قۇرۇش + + بارلىق پاراڭلار + + تەكلىپلىك ھۆججەت قىسقۇچلار + + ئوقۇلمىغانلار + + بارلىق پاراڭلاردىن ئوقۇلمىغان ئۇچۇرلار + + 1:1 پاراڭلار + + بىۋاسىتە پاراڭلاردىن ئوقۇلمىغان ئۇچۇرلار + + گۇرۇپپىلار + + پەقەت گۇرۇپپا پاراڭلىرىدىن كەلگەن ئۇچۇر + + قوشۇش + + %1$s ھۆججەت قىسقۇچ قوشۇلدى. + + ھۆججەت قىسقۇچنى تەھرىرلەش + + ھۆججەت قىسقۇچنى ئۆچۈرۈش + + يېڭى ھۆججەت قىسقۇچ قوشۇش + + ھەممىنى ئاۋاسسىزلاشتۇرۇش + + ھۆججەت قىسقۇچلارنى رەتلەش + + ھەممىسى ئوقۇلدى + + + %1$d پاراڭ تۈرى + + + + %1$d پاراڭ + + + + %1$d پاراڭلارنى ئۆز ئىچىگە ئالمايدۇ + + + + + بىرتال ھۆججەت قىسقۇچ قۇرۇش + + ھۆججەت قىسقۇچ نامى (تەلەپ قىلىنىدۇ) + + ئۆز ئىچىگە ئېلىنغان پاراڭلار + + پاراڭلارنى قوشۇش + + بۇ ھۆججەت قىسقۇچتا كۆرۈشنى خالايدىغان پاراڭلارنى تاللاڭ. + + ئايرىم ئەھۋاللار + + پاراڭلارنى چىقىرىۋېتىش + + بۇ ھۆججەت قىسقۇچتا كۆرۈشنى خالايدىغان پاراڭلارنى تاللاڭ. + + پەقەت ئوقۇلمىغان پاراڭلارنىلا كۆرسىتىش + + قوزغىتىلغاندا ، بۇ ھۆججەت قىسقۇچتا پەقەت ئوقۇلمىغان ئۇچۇرلارلا كۆرسىتىلىدۇ. + + ئۈنسىز پاراڭلارنى ئۆز ئىچىگە ئېلىش + + قۇر + + ھۆججەت قىسقۇچ قۇرامسىز؟ + + %1$s پالاڭ ھۆججىتىنى قۇرۇشنى خالامسىز؟ + + ھۆججەت قىسقۇچ قۇرۇش + + ھۆججەت قىسقۇچنى تەھرىرلەش + + ساقلاش + + ئۆزگەرتىشلەرنى ساقلامسىز؟ + + بۇ پاراڭ ھۆججىتىدە قىلغان ئۆزگەرتىشلەرنى ساقلامسىز؟ + + ئۆزگەرتىشلەرنى ساقلاڭ + + تاشلىۋەت + + ھۆججەت قىسقۇچنى ئۆچۈرۈش + + بۇ پاراڭ ھۆججىتىنى ئۆچۈرەمسىز؟ + + + + پاراڭ تۈرلىرى + + تامام ئۇچۇرلار @@ -4992,6 +5125,7 @@ ۋاسىتە سۈپىتى + ۋاسىتە سۈپىتىنى ئەۋەت يۇقىرى سۈپەتلىك ۋاسىتە يوللىسىڭىز كۆپرەك مەلۇمات ئىشلىتىسىز @@ -7076,10 +7210,10 @@ - Your backups subscription expired + زاپاسلاش مۇشتەرىلىكىڭىزنىڭ ۋاقتى ئۆتۈپ كەتتى - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + زاپاسلاش پىلانىڭىزنىڭ ۋاقتى ئۆتۈپ كەتتى چۈنكى ئۇ ھازىرقى پۇل تۆلەش ئۇسۇلىڭىز بىلەن يېڭىلانمايدۇ. %1$d كۈندىن كېيىن ، زاپاسلىغان مېدىيا ئۆچۈرۈلىدۇ. سىز ھارقانداق ۋاقىتتا بارلىق مېدىيالىرىڭىزنى داۋاملىق زاپاسلاش ئۈچۈن پۇل تۆلەشكە باشلىسىڭىز بولىدۇ. @@ -7096,9 +7230,9 @@ زاپاسلاشتىكى مېدىيانى «ئاتلاش» نى تاللىسىڭىز %1$d كۈندە ئۆچۈرۈلىدۇ. - Your backups subscription failed to renew + زاپاسلاش مۇشتەرىلىكىڭىز يېڭىلىنىشنى تاماملىيالمىدى - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + پۇل تۆلەش ئۇسۇلىڭىزنىڭ ئەڭ يېڭى ئىكەنلىكىنى جەزملەشتۈرۈڭ. مۇشتەرىلىك باشقۇرۇشنى چېكىڭ ۋە پۇل تۆلەش ئۇسۇللىرى ئاستىدىكى «يېڭىلاش» نى چېكىڭ. زاپاسلاشنى تاماملىيالمىدى @@ -7110,7 +7244,7 @@ مۇشتەرىلىكنى باشقۇرۇش - Subscribe for %1$s/month + %1$s/ ئايلىقى مۇشتەرى بولۇڭ مېدىيانى ھازىر چۈشۈرۈڭ @@ -7145,6 +7279,17 @@ %1$s نىڭ%2$s + + + چۈشۈرۈشنى بىكار قىلىش + + %2$s نىڭ %1$s تى چۈشۈۋاتىدۇ(%3$s) + + زاپاسلىرىڭىزنى چۈشۈرۈشكە يېتەرلىك بوشلۇق يوق. داۋاملاشتۇرۇش ئۈچۈن %1$s بوشلۇق ھازىرلاڭ . + + چۈشۈرۈشتىن ۋاز كېچىش + + "ئاخىرقى زاپاسلىشىڭىزنى تاماملىيالمىدى. تېلېفونىڭىزنىڭ Wi-Fi غا ئۇلانغانلىقىنى جەزملەشتۈرۈڭ ھەمدە «ھازىر زاپاسلاڭ»نى چېكىپ قايتا سىناڭ." @@ -7198,17 +7343,17 @@ ساقلاشنى ئەلالاشتۇرۇش پەقەت سىگنال زاپاسلاشنىڭ ھەقلىق دەرىجىسى بىلەنلا ئىشلىتىلىدۇ. زاپاسلاش پىلانىڭىزنى يېڭىلاپ بۇ ئىقتىدارنى ئىشلىتىشنى باشلاڭ. - Subscribe for %1$s/month + %1$s/ ئايلىقى مۇشتەرى بولۇڭ - This media is no longer available + بۇ مېدىيا ئەمدى مەۋجۇت ئەمەس - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + نۆۋەتتىكى سىگنال زاپاسلاش پىلانىڭىز ئەڭ يېقىنقى %1$d كۈنلۈك مېدىيانى ئۆز ئىچىگە ئالىدۇ. بارلىق مېدىيالىرىڭىزنى زاپاسلاشنى باشلاش ئۈچۈن ، ھازىر يېڭىلاڭ. - Subscribe for %1$s/month + %1$s/ ئايلىقى مۇشتەرى بولۇڭ ئۆچۈرۈش ھازىر بارلىق ئۈسكۈنىلىرىڭىزدە ماسقەدەملىنىدۇ @@ -7256,6 +7401,8 @@ چۈشۈرۈلدى زاپاسلاش بىر كېچىدىلا قۇرۇلىدۇ. + + مۇشتەرىلىك قوزغىتىقسىز زاپاسلاش پىلانى @@ -7264,8 +7411,12 @@ %1$s/ئايلىقى زاپاسلاش پىلانىڭىز ھەقسىز - + يېڭىلىنىش ۋاقتى %1$s + + %1$s ۋاقتى ئۆتىدۇ + + %1$s ۋاقتى ئۆتكەن ئۇچۇرلىشىش تارىخىڭىزنى زاپاسلاڭ ، يېڭى تېلېفون ئالغاندا ياكى سىگنالنى قايتا قاچىلىغاندا سانلىق مەلۇماتنى ھەرگىز يوقىتىپ قويمايسىز. @@ -7310,6 +7461,10 @@ قولدا زاپاسلاش ئۈسكۈنىڭىزگە PIN نومۇر، مەخپىي نۇمۇر ياكى نەقىشنى كىرگۈزۈڭ. + + زاپاسلاشنى قايتا قوزغىتىش + + زاپاسلاش ئېتىلدى ۋە سىگنالنىڭ بىخەتەر ساقلاش مۇلازىمىتىدىن سانلىق مەلۇماتلىرىڭىز ئۆچۈرۈلدى. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 837fc61b9c..beb500d018 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -106,7 +106,7 @@ Не знайдено застосунок для вибору медіафайлів. Molly потребує доступу до пам\'яті, щоб прикріплювати фото, відео та аудіо, але його не надано. Перейдіть у налаштування застосунку, відкрийте «Дозволи» та виберіть «Пам\'ять». - Molly потребує доступу до «Контактів», щоб прикріплювати контактну інформацію, але його не надано. Перейдіть у налаштування застосунку, відкрийте «Дозволи», та виберіть «Пам\'ять». + Molly потребує доступу до «Контактів», щоб прикріплювати контактну інформацію, але його не надано. Перейдіть у налаштування застосунку, відкрийте «Дозволи», та виберіть «Контакти». Molly потребує доступу до місцеположення, щоб його прикріпити, але його не надано. Перейдіть у налаштування застосунку, відкрийте «Дозволи», та виберіть «Геодані». @@ -127,7 +127,7 @@ %1$s не активував/-ла платежі - Ви хочете надіслати користувачу запит на активацію платежів? + Надіслати цьому користувачеві запит на активацію платежів? Надіслати запит @@ -371,6 +371,8 @@ Чати Повідомлення + + Типи чатів Написати користувачу %1$s @@ -414,7 +416,7 @@ у %1$s   Читати далі   Завантажити ще -   Очікування +   Очікується Це повідомлення видалено. Ви видалили це повідомлення. @@ -853,7 +855,7 @@ - You\'re all set. Start your backup now. + Усе готово. Тепер можна створити резервну копію. Що більший розмір резервної копії, то довше триватиме її створення. Поки копія створюється, ви можете користуватися телефоном як зазвичай. @@ -1337,7 +1339,7 @@ Не вдалося створити групу. Спробуйте пізніше. Вилучити - SMS контакт + Надіслати контакту SMS Вилучити %1$s з цієї групи? Ви вибрали контакт, який не підтримує групи Signal, тому ця група буде MMS-групою. Настроювані назви і фото MMS-групи зможете бачити тільки ви. @@ -1431,12 +1433,12 @@ Не вдалося встановити зображення профілю Значки - QR-код чи посилання + QR-код або посилання Змінити фото - Поділіться своїм іменем користувача + Повідомте своє ім\'я користувача - Поділіться своїм унікальним QR-кодом чи посиланням з людиною, із якою хочете створити чат. + Інші користувачі зможуть з вами зв\'язатися, якщо ви надішлете їм свій унікальний QR-код або посилання. Ім’я користувача створено @@ -1955,7 +1957,7 @@ %2$s володіє номером %1$s - Ви надіслали користувачу %1$s запит на активацію платежів + Ви надіслали користувачеві %1$s запит на активацію платежів %1$s хоче, щоб ви активували платежі. Надсилайте платежі лише тим людям, яким ви довіряєте. @@ -2088,6 +2090,7 @@ +%1$d запрошено +%1$d запрошено + %1$d додаткова група %1$d додаткові групи @@ -2116,6 +2119,7 @@ Пристрою не знайдено. Помилка мережі. Недійсний QR-код. + На жаль, у вас забагато зв\'язаних пристроїв. Спробуйте відв\'язати якісь із них Це не QR-код для зв\'язування пристрою. Зв\'язати пристрій Signal? @@ -2140,11 +2144,13 @@ Завершити введення Неправильний пароль! Розблокувати Molly + Molly Android - Екран блокування Мапа + Поставити мітку Підтвердити адресу @@ -2558,7 +2564,7 @@ Це могло статися через те, що користувач не позначив ваш змінений код безпеки як перевірений, має проблему з пристроєм або заблокував вас. - Свайпніть, щоб побачити демонстрацію екрана + Потягніть вгору для демонстрації екрана Проксі-сервер @@ -2692,6 +2698,7 @@ Повідомлення Signal + Більше @@ -2723,6 +2730,7 @@ Немає встановлених стікерів Тут будуть стікери зі вхідних повідомлень Без назви + Невідомо @@ -2946,6 +2954,7 @@ Медіафайл більше не доступний. Не вдається відтворити медіа. + Під час пошуку повідомлення сталася помилка. Немає застосунку, через який можна було б поділитися цим медіафайлом. Закрити @@ -3021,16 +3030,18 @@ Повідомлення Виклики - Відмови + + Помилки Резервні копії Статус блокування - Оновлення додатку - Інший + Оновлення застосунку + Інше Чати - Невідомо + Невідомий користувач Голосові нотатки Контакт приєднався до Signal - Немає доступної активності для відкриття налаштувань категорій повідомлень. + + Немає доступних дій, щоб відкрити налаштування каналу сповіщень. Фонове з\'єднання @@ -3043,7 +3054,7 @@ - Швидка відповідь неможлива, коли Molly заблоковано! + Швидка відповідь недоступна, коли Molly заблоковано! Проблема під час надсилання повідомлення! @@ -3060,12 +3071,12 @@ Видалити - Неприпустимий ярлик + Неправильний ярлик Molly Нове повідомлення - Запит на листування + Запит на повідомлення Ви %1$s • Історія @@ -3096,10 +3107,10 @@ - %1$d Елемент - %1$d Елемент - %1$d Елементи - %1$d Елементи + %1$d файл + %1$d файли + %1$d файлів + %1$d файлу Обробка… @@ -3128,8 +3139,8 @@ Щоб прийняти відеовиклик, надайте Molly доступ до мікрофона і камери. Для здійснення та приймання викликів Molly потребує доступу до мікрофона й камери, але його не надано. Перейдіть у налаштування застосунку, відкрийте «Дозволи» та виберіть мікрофон і камеру. - Розмову прийнято на прив\'язаному пристрої. - Відхилений на прив\'язаному пристрої. + Ви відповіли на зв\'язаному пристрої. + Ви відхилили виклик на зв\'язаному пристрої. Зайнято на зв\'язаному пристрої. Тепер камера перемикається тут. Торкніться свого відео, щоб спробувати @@ -3149,9 +3160,9 @@ - Аудіо вивід + Виведення звуку - Телефонний динамік + Слухавка Динамік @@ -3167,9 +3178,9 @@ Відхилити виклик - Стара фраза-пароль - Нова фраза-пароль - Повторіть нову фразу-пароль + Старий пароль + Новий пароль + Введіть новий пароль ще раз Запросити в Molly @@ -3186,9 +3197,9 @@ Більше - Стерти введений текст + Видалити введений текст Показати клавіатуру - Показати клавіатуру набору номеру + Показати цифрову клавіатуру Контактів немає. @@ -3198,15 +3209,15 @@ Фото контакту - Molly потребує дозволів \"Контакти\", щоб показати контакти, але наразі доступу немає. Будь ласка, перейдіть до налаштувань додатку, оберіть \"Дозволи\", та увімкніть \"Контакти\". - Не вдалося отримати список контактів, перевірте з\'єднання + Molly потребує доступу до «Контактів», щоб показувати ваші контакти, але його не надано. Перейдіть у налаштування застосунку, відкрийте «Дозволи», та виберіть «Контакти». + Не вдалось отримати список контактів, перевірте з\'єднання з мережею Ім\'я користувача не знайдено "%1$s — не користувач Signal. Перевірте правильність імені користувача й повторіть пошук." Вам не потрібно додавати себе в групу Досягнуто максимального розміру групи - У групах Signal можуть перебувати максимум %1$d учасників. - Досягнуто ліміт на рекомендовану кількість користувачів у групі - Групи Signal працюють найкраще з %1$d учасників або менше. Додавання більшої кількості учасників призведе до затримок при відправці і отриманні повідомлень. + Кількість учасників групи в Signal не може перевищувати %1$d. + Досягнуто рекомендованої максимальної кількості учасників + Групи в Signal найкраще працюють, коли кількість їхніх учасників не перевищує %1$d. Якщо додати більше учасників, надсилання й отримання повідомлень займатиме більше часу. %1$d учасник %1$d учасники @@ -3229,7 +3240,7 @@ Надайте доступ до контактів. Ваші контакти зашифровано й приховано від служби Signal. - Molly потребує дозволів \"Контакти\", щоб показати контакти. + Molly потребує доступу до «Контактів», щоб їх показувати. Показати контакти @@ -3249,18 +3260,18 @@ Повідомлення Signal - Незахищене SMS - Незахищене MMS + Незахищене SMS-повідомлення + Незахищене MMS-повідомлення SIM %1$d Надіслати Написання повідомлення Відрити клавіатуру емоджі Мініатюра вкладення - Увімк/вимк скриньку вкладень камери - Записати та надіслати аудіо вкладення + Перемикач швидкого прикріплення з камери + Записати та надіслати голосове повідомлення - Заблокувати запис аудіо вкладення + Утримувати кнопку запису голосового повідомлення Не вдалося надіслати повідомлення. Перевірте з\'єднання з інтернетом і надішліть повідомлення ще раз. @@ -3272,7 +3283,7 @@ Захищене повідомлення - Не вдалося відправити + Не вдалося надіслати Очікує підтвердження Доставлено Повідомлення прочитано @@ -3283,7 +3294,7 @@ Завантаження - Дізнатися більше + Докладніше Приєднатися до виклику Передзвонити @@ -3296,7 +3307,7 @@ Заблокувати запит Спільних груп немає. Уважно перевіряйте, від кого надходять запити. У цій групі немає контактів. Уважно перевіряйте, від кого надходять запити. - Детальніше + Переглянути Таймер цього тимчасового повідомлення буде встановлено на %1$s, коли ви його відправите. Задонатити @@ -3320,10 +3331,10 @@ Відео Фото GIF - Одноразове медіа + Одноразовий медіафайл Стікер Ви - Оригінальне повідомлення не знайдено + Початкове повідомлення не знайдено %1$s · Історія @@ -3334,7 +3345,7 @@ Донат за друга - Прокрутить до самого низу + Гортайте униз @@ -3352,7 +3363,7 @@ Продовжити виклик Покинути виклик Можливо, ці люди перевстановили застосунок або замінили пристрої. Перевірте коди безпеки для чатів з ними, щоб упевнитись у конфіденційності спілкування. - Детальніше + Переглянути Раніше було позначено як перевірений @@ -3360,7 +3371,7 @@ Сповіщення про виклики ввімкнено. Увімкнути сповіщення про виклики Увімкніть фонову активність - Тепер все добре! + Тепер усе добре! Щоб отримувати сповіщення про виклики, натисніть тут і ввімкніть «Показувати сповіщення». Щоб отримувати сповіщення про виклики, натисніть тут і ввімкніть сповіщення, а також перевірте, чи ввімкнено звук і спливні сповіщення. @@ -3371,9 +3382,9 @@ Щоб отримувати сповіщення про виклики, перейдіть у налаштування й дозвольте фонову активність в налаштуваннях акумулятора. - Завантаження країн… + Завантаження списку країн… Пошук - Немає відповідних країн + Таких країн не знайдено Зіскануйте QR-код на пристрої, щоб зв\'язати його @@ -3382,7 +3393,7 @@ Зв\'язати пристрій - Немає зв\'язаних пристроїв + Зв\'язаних пристроїв немає Зв\'язати новий пристрій @@ -3413,7 +3424,7 @@ %1$d  години - %1$d год + %1$dгод %1$d день @@ -3448,14 +3459,14 @@ Ваші коди безпеки для чатів з %1$s, %2$s і з %3$s щойно змінилися. - %1$d інший - %1$d інших - %1$d інших - %1$d інших + Ще %1$d + Ще %1$d + Ще %1$d + Ще %1$d - Пошук GIF-файлів + Пошук GIF-зображень Нічого не знайдено @@ -3477,12 +3488,12 @@ - %1$s приєднується до групи. - %1$s приєдналися до групи. - %1$s приєдналися до групи. - %1$s приєдналися до групи. + %1$s користувач приєднався до групи. + %1$s користувачі приєдналися до групи. + %1$s користувачів приєдналися до групи. + %1$s користувача приєдналися до групи. - Назва групи тепер «%1$s». + Тепер група називається «%1$s». Розблокувати @@ -3492,7 +3503,7 @@ Щоб мати можливість відправляти MMS-повідомлення, введіть інформацію про APN нижче. Потрібні значення для вашого оператора можна знайти в інтернеті за запитом \'оператор APN\' або в його службі підтримки. Це потрібно зробити тільки один раз. - Проблема з доставленням + Проблеми з доставлянням Не вдалося доставити вам повідомлення, стікер, реакцію або відмітку про читання від користувача %1$s. Користувач намагався надіслати це безпосередньо вам або в груповий чат. Не вдалося доставити вам повідомлення, стікер, реакцію або відмітку про читання від користувача %1$s. @@ -3500,8 +3511,8 @@ Ім\'я (обов\'язково) Прізвище (необов\'язково) Далі - Імена та фото MMS-груп будуть видні тільки вам. - Опис групи побачать учасники цієї групи та запрошені особи. + Власні назви й фото MMS-груп буде видно тільки вам. + Опис групи буде видно її учасникам і запрошеним користувачам. Про себе @@ -3516,7 +3527,7 @@ Працюю над чимось новим - Редагувати групу + Редагувати інформацію Назва групи Опис групи @@ -3538,7 +3549,7 @@ Ім\'я Прізвище (необов\'язково) Зберегти - Не вдалось зберегти через мережеву помилку. Спробуйте пізніше. + Не вдалося зберегти через мережеву помилку. Спробуйте пізніше. Надіслані медіафайли @@ -3548,7 +3559,7 @@ Щоб перевірити наявність наскрізного шифрування з користувачем %1$s, порівняйте наведені вище цифри із цифрами на пристрої цього співрозмовника. Також можна зісканувати код з пристрою користувача. - Натисніть, щоб сканувати + Торкніться, щоб сканувати Коди збігаються Не вдалося перевірити код безпеки Завантаження… @@ -3556,11 +3567,11 @@ Позначити як неперевірений - Відскануйте QR-код на пристрої вашого контакту. + Зіскануйте QR-код на пристрої іншого користувача. - Потягніть вгору для відповіді - Потягніть вниз для відхилення + Потягніть вгору, щоб відповісти + Потягніть вниз, щоб відхилити Є деякі проблеми, що потребують вашої уваги. @@ -3727,7 +3738,7 @@ Тричі П\'ять разів Десять разів - Вібрувати + Вібрація Зелений Червоний Синій @@ -3808,7 +3819,7 @@ Індикатор набору тексту Якщо індикатор набору тексту вимкнено, його не буде видно, коли інший користувач набиратиме повідомлення. Вимкнути персоналізоване навчання клавіатури. - Це налаштування спрацьовує не у всіх випадках. Ваша клавіатура може його ігнорувати. + Це налаштування спрацьовує не в усіх випадках. Ваша клавіатура може його ігнорувати. Через мобільний інтернет Через Wi-Fi @@ -3840,10 +3851,12 @@ Усю історію повідомлень буде остаточно видалено з усіх пристроїв. Ви не зможете її відновити. Видалити усе негайно + Назавжди 1 рік 6 місяців 30 днів + Без обмежень %1$s повідомлення @@ -3870,6 +3883,7 @@ Показувати Мелодія дзвінка Розмір шрифту повідомлень + Пріоритет Усунення неполадок зі сповіщеннями @@ -3890,7 +3904,7 @@ Дозволити від будь-кого Отримувати повідомлення від захищених відправників, які не з вашого списку контактів, або з якими ви не поділилися профілем. Проксі-сервер - Використовувати проксі-сервер + Проксі-сервер Вимк. Увімк. Адреса проксі-сервера @@ -4098,6 +4112,7 @@ Скануйте QR-код адреси одержувача платежу. + Запит Переказати Доступний баланс: %1$s @@ -4231,6 +4246,7 @@ Ви можете прикріпити тільки до %1$d чатів + Зображення контакту Архівовано @@ -4239,6 +4255,10 @@ Новий чат Відкрити Камеру Чатів поки що немає.\n Напишіть щось друзям. + + Чатів немає + + Налаштування папок @@ -4487,6 +4507,7 @@ Резервні копії чатів Перенести акаунт Перенесіть акаунт на новий пристрій з ОС Android + Введіть фразу-пароль Відновити Імпорт резервних копій з нових версій Signal неможливий @@ -4694,6 +4715,7 @@ Не вдалося відкрити настройки Wi-Fi. Будь-ласка, включіть Wi-Fi вручну. + Надати доступ до місцеположення Увімкнути геодані Увімкнути Wi-Fi @@ -4961,6 +4983,7 @@ Поділитися + Відправити , %1$s @@ -5266,6 +5289,125 @@ Клавіатура Надсилати кнопкою Enter + + Папки для чатів + + Додати папку для чатів + + + + Упорядкуйте чати в папки, щоб швидко перемикатися між потрібними розмовами. + + Папки + + Створити папку + + Усі чати + + Зразки папок + + Непрочитані + + Непрочитані повідомлення з усіх чатів + + Особисті чати + + Тільки повідомлення з особистих чатів + + Групи + + Тільки повідомлення з групових чатів + + Додати + + Додано папку «%1$s». + + Змінити вміст папки + + Видалити папку + + Додати нову папку + + Вимкнути всі сповіщення + + Змінити порядок папок + + Позначити всі як прочитані + + + %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$s»? + + Створити папку + + Змінити вміст папки + + Зберегти + + Зберегти зміни? + + Бажаєте зберегти свої зміни в цій папці для чатів? + + Зберегти зміни + + Відхилити + + Видалити папку + + Видалити цю папку для чатів? + + + + Типи чатів + + Готово Повідомлення @@ -5315,7 +5457,7 @@ - Показати значок статусу + Показувати значок статусу Показувати піктограму в деталях повідомлення, доставлених за допомогою захищеного відправника. @@ -5352,6 +5494,7 @@ Якість медіафайлів + Якість медіафайлів, які ви надсилаєте Надсилання медіафайлів високої якості споживатиме більше трафіку. @@ -5436,7 +5579,7 @@ Пошук емоджі Повернутися до емоджі Очистити пошук введених даних - Пошук GIF-файлів + Пошук на GIPHY Пошук стікерів @@ -5649,7 +5792,7 @@ Надіслати Одноразовий медіафайл Один або більше елементів були завеликими - Один або кілька елементів були недійсними + Принаймні один елемент був неприпустимий Обрано забагато елементів Відео буде показано один раз @@ -5723,7 +5866,7 @@ - Вибрати значок + Оберіть значок Ви маєте обрати значок Не вдалось оновити профіль @@ -7121,7 +7264,7 @@ Пропущено під час увімкненого профілю сповіщень - Приєднатись + Приєднатися Повернутись @@ -7244,7 +7387,7 @@ Створити посилання на виклик - Поділіться посиланням на виклик у Signal + Виклик у Signal Ось посилання, за яким можна приєднатися до виклику в Signal: %1$s @@ -7264,7 +7407,7 @@ Виклик у Signal - Приєднатись + Приєднатися Додати назву виклику @@ -7272,7 +7415,7 @@ Адміністратор затверджує учасників - Поділитися посиланням через Signal + Надіслати посилання в Signal Копіювати посилання @@ -7369,7 +7512,7 @@ Сканувати - Проскануйте QR-код на пристрої вашого контакту. + Зіскануйте QR-код на пристрої іншого користувача. Колір @@ -7389,7 +7532,7 @@ Ваші QR-код і посилання було скинуто. Натомість було створено нові. - Проскануйте цей QR-код телефоном, щоб написати мені в Signal. + Зіскануйте цей QR-код телефоном, щоб написати мені в Signal. QR-код не знайдено @@ -7544,13 +7687,13 @@ - Your backups subscription expired + Скінчилася передплата на резервне копіювання - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Ваша передплата на резервне копіювання скінчилася, тому що її не вдалося продовжити з використанням поточного платіжного засобу. Медіафайли з вашої резервної копії буде видалено через %1$d день. + Ваша передплата на резервне копіювання скінчилася, тому що її не вдалося продовжити з використанням поточного платіжного засобу. Медіафайли з вашої резервної копії буде видалено через %1$d дні. + Ваша передплата на резервне копіювання скінчилася, тому що її не вдалося продовжити з використанням поточного платіжного засобу. Медіафайли з вашої резервної копії буде видалено через %1$d днів. + Ваша передплата на резервне копіювання скінчилася, тому що її не вдалося продовжити з використанням поточного платіжного засобу. Медіафайли з вашої резервної копії буде видалено через %1$d дня. Ви можете поновити оплату в будь-який момент, щоб знову здійснювати резервне копіювання медіафайлів. @@ -7570,9 +7713,9 @@ Якщо вибрати «Пропустити», медіафайли з резервної копії буде видалено через %1$d дня. - Your backups subscription failed to renew + Не вдалося продовжити передплату на резервне копіювання - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Перевірте дійсність вашого платіжного засобу. Натисніть «Керувати передплатою» і виберіть «Оновити» у «Платіжних засобах». Резервне копіювання не завершено @@ -7582,9 +7725,9 @@ Пропустити - Керувати підпискою + Керувати передплатою - Subscribe for %1$s/month + Передплатити за %1$s/місяць Завантажити медіафайли @@ -7619,6 +7762,17 @@ %1$s з %2$s + + + Скасувати завантаження + + Завантаження: %1$s з %2$s (%3$s%%) + + Для резервної копії недостатньо місця. Щоб продовжити, звільніть %1$s. + + Не завантажувати + + "Не вдалося завершити створення останньої резервної копії. Перевірте з\'єднання телефона з Wi-Fi і натисніть «Створити копію зараз»." @@ -7672,20 +7826,20 @@ Оптимізація пам\'яті доступна тим, хто користується платним резервним копіюванням Signal. Оформте передплату, щоб використовувати цю функцію. - Subscribe for %1$s/month + Передплатити за %1$s/місяць - This media is no longer available + Цей медіафайл більше не доступний - Your current Signal backup plan includes your most recent %1$d day of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Згідно з поточним планом, резервна копія включає медіафайли за минулий %1$d день. Щоб створювати резервну копію всіх медіафайлів, змініть передплату. + Згідно з поточним планом, резервна копія включає медіафайли за минулі %1$d дні. Щоб створювати резервну копію всіх медіафайлів, змініть передплату. + Згідно з поточним планом, резервна копія включає медіафайли за минулі %1$d днів. Щоб створювати резервну копію всіх медіафайлів, змініть передплату. + Згідно з поточним планом, резервна копія включає медіафайли за минулі %1$d дня. Щоб створювати резервну копію всіх медіафайлів, змініть передплату. - Subscribe for %1$s/month + Передплатити за %1$s/місяць Тепер видалення синхронізується на всіх ваших пристроях @@ -7733,6 +7887,8 @@ Завантаження завершено Резервну копію буде створено вночі. + + Передплата неактивна План резервного копіювання @@ -7741,8 +7897,12 @@ %1$s/місяць Безплатно - + Наступний платіж %1$s + + Закінчується %1$s + + Закінчилася %1$s Зберігайте історію повідомлень і не втрачайте дані в разі зміни телефона або перевстановлення Molly. @@ -7787,6 +7947,10 @@ Створювати вручну Уведіть PIN-код пристрою, пароль або графічний ключ. + + Увімкнути знову + + Резервне копіювання вимкнено, а ваші дані видалено із захищеного сховища даних Signal. diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index f4b64c4c68..b0c757f81b 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -365,6 +365,8 @@ چیٹس میسجز + + چیٹ کی اقسام پیغام %1$s @@ -1966,6 +1968,7 @@ +%1$d کو مدعو کیا گیا +%1$d کو مدعو کیا گیا + %1$dاضافی گروپ %1$dاضافی گروپس @@ -1992,6 +1995,7 @@ کوئی ڈیوائس نہیں ملی۔ نیٹ ورک کی خرابی۔ QR کوڈ غلط ہے۔ + معذرت سے، پہلے سے بہت زیادہ ڈیوائسز منسلک ہیں، کچھ ختم کرنے کی کوشش کریں معذرت سے، ڈیوائس لنک QR کوڈ غلط ہے۔ Signal ڈیوائس منسلک کریں؟ @@ -2014,11 +2018,13 @@ پاسفریز جمع کریں غلط پاسفریز! Molly ان لاک کریں + Molly Android - لاک اسکرین نقشہ + ڈراپ پن ایڈریس قبول کریں @@ -2522,6 +2528,7 @@ Signal پیغام + مزید @@ -2553,6 +2560,7 @@ اسٹیکر نصب نہیں ہوئے آنے والے پیغامات سے اسٹیکرز یہاں ظاہر ہونگے عنوان کے بغیر + نامعلوم @@ -2774,6 +2782,7 @@ میڈیا اب دستیاب نہیں ہے۔ میڈیا پلے کرنے سے قاصر ہے۔ + میسج تلاش کرنے میں نقص پیش آیا۔ کوئی ایپ اس میڈیا کو شیئر کرنے کے قابل نہیں پاسکتی ہے۔ بند کریں @@ -2845,6 +2854,7 @@ پیغامات کالز + ناکامیاں بیک اپس اسٹیٹس لاک کریں @@ -2854,6 +2864,7 @@ نامعلوم آڈیو نوٹز رابطہ Signal میں شامل ہو گیا + نوٹیفکیشن چینل کی ترتیبات کو کھولنے کے لئے کوئی سرگرمی دستیاب نہیں ہے۔ پس منظر کا کنکشن @@ -3638,10 +3649,12 @@ میسج کی تمام ہسٹری تمام ڈیوائسز سے مستقل طور پر ہٹا دی جائے گی۔ یہ ایکشن کالعدم نہیں کیا جا سکتا۔ اب سب کو حذف کریں + ہمیشہ کے لئے 1 سال 6 ماہ 30 دن + کوئی نہیں %1$s پيغام @@ -3666,6 +3679,7 @@ دکھائیں رنگ ٹون پیغام فونٹ سائز + ترجیح دینا اطلاعات کی نقص ازالہ کاری کریں @@ -3894,6 +3908,7 @@ وصول کنندہ کا پتہ QR کوڈ اسکین کریں + درخواست ادا کرنا دستیاب بیلنس: %1$s @@ -4025,6 +4040,7 @@ آپ صرف %1$d چیٹس تک پِن کر سکتے ہیں + رابطہ تصویر امیج محفوظ شدہ دستاویزات @@ -4033,6 +4049,10 @@ نئی چیٹ کیمرہ کھولیں ابھی کوئی چیٹس نہیں ہیں۔\nکسی دوست کو میسج کر کے آغاز کریں۔ + + ڈسپلے کرنے کے لیے کوئی چیٹس نہیں ہیں + + فولڈر کی سیٹنگز @@ -4265,6 +4285,7 @@ چیٹ کے بیک اپس اکاؤنٹ منتقل کریں اکاؤنٹ کو کسی نئے Android ڈیوائس میں منتقل کریں + بیک اپ فاسفریز داخل کریں بحال کریں Signal کے تازہ ترین ورژنز سے بیک اپس درآمد کرنے سے قاصر @@ -4472,6 +4493,7 @@ Wi-Fi ترتیبات کو کھولنے سے قاصر ہے۔ براہ کرم دستی طور پر Wi-Fi آن کریں۔ + \'Location\' تک رسائی فراہم کریں مقام کی خدمات کو آن کریں Wi-Fi آن کریں @@ -4725,6 +4747,7 @@ اشتراک کریں + بھیجیں , %1$s @@ -5028,6 +5051,119 @@ کی بورڈ انٹر دبا کر بھیجیں + + چیٹ فولڈرز + + چیٹ فولڈر شامل کریں + + + + اپنی چیٹس کو فولڈرز میں ترتیب دیں اور اپنی چیٹ کی فہرست میں ان کے درمیان فوری طور پر سوئچ کریں۔ + + فولڈرز + + فولڈر تخلیق کریں + + تمام چیٹس + + تجویز کردہ فولڈرز + + بغیر پڑھے ہوئے میسجز + + تمام چیٹس سے بغیر پڑھے ہوئے میسجز + + 1:1 چیٹس + + صرف براہ راست چیٹس کے میسجز + + گروپس + + صرف گروپ چیٹس کے میسجز + + شامل کریں + + %1$s کا فولڈر شامل کیا گیا۔ + + فولڈر میں ترمیم کریں + + فولڈر حذف کریں + + نیا فولڈر شامل کریں + + تمام کو خاموش کریں + + فولڈرز کو دوبارہ ترتیب دیں + + تمام پڑھنے پر نشان لگائیں + + + %1$d چیٹ کی قسم + %1$d چیٹ کی اقسام + + + + %1$d چیٹس + %1$d چیٹس + + + + %1$d چیٹ کو نکال دیا گیا + %1$d چیٹس کو نکال دیا گیا + + + + + فولڈر تخلیق کریں + + فولڈر کا نام (درکار ہے) + + شامل کردہ چیٹس + + چیٹس شامل کریں + + ان چیٹس کا انتخاب کریں جو آپ اس فولڈر میں ظاہر کرنا چاہتے۔ + + استثنات + + چیٹس نکال دیں + + ان چیٹس کا انتخاب کریں جو آپ اس فولڈر میں ظاہر نہیں کرنا چاہتے۔ + + صرف بغیر پڑھی ہوئی چیٹس ظاہر کرتا ہے + + فعال کرنے پر، اس فولڈر میں صرف بغیر پڑھے ہوئے میسجز کی حامل چیٹس کو ظاہر کیا جائے گا۔ + + خاموش کردہ چیٹس شامل کریں + + بنائیں + + فولڈر تخلیق کریں؟ + + کیا آپ چیٹ فولڈر \"%1$s\" تخلیق کرنا چاہتے ہیں؟ + + فولڈر تخلیق کریں + + فولڈر میں ترمیم کریں + + محفوظ کریں + + تبدیلیوں کو محفوظ کریں؟ + + کیا آپ ان تبدیلیوں کو محفوظ کرنا چاہتے ہیں جو آپ نے اس چیٹ فولڈر میں کی ہیں؟ + + تبدیلیوں کو محفوظ کریں + + مسترد کیجئے + + فولڈر حذف کریں + + اس چیٹ فولڈر کو حذف کریں؟ + + + + چیٹ کی اقسام + + ہو گیا پیغامات @@ -5112,6 +5248,7 @@ میڈیا کوالٹی + بھیجے گئے میڈیا کی کوالٹی اعلیٰ کوالٹی کے میڈیا کو بھیجنے میں مزید ڈیٹا استعمال ہو گا۔ @@ -7303,6 +7440,17 @@ %1$sکا%2$s + + + ڈاؤن لوڈ منسوخ کریں + + ڈاؤن لوڈ ہو رہا ہے: %2$s کا %1$s (%3$s%%) + + آپ کے بیک اپ کو ڈاؤن لوڈ کرنے کے لیے جگہ ناکافی ہے۔ جاری رکھنے کے لیے %1$s جگہ خالی کریں۔ + + ڈاؤن لوڈ چھوڑ دیں + + "آپ کا آخری بیک اپ مکمل نہیں ہو سکا۔ یقینی بنائیں کہ آپ کا فون Wi-Fi سے منسلک ہے اور دوبارہ کوشش کرنے کے لیے ابھی بیک اپ کریں پر ٹیپ کریں۔" @@ -7415,6 +7563,8 @@ ڈاؤن لوڈ مکمل ہو گئی بیک اپ رات تیار کیا جائے گا۔ + + سبسکرپشن غیر فعال ہے بیک اپ پلان @@ -7423,8 +7573,12 @@ %1$s/ماہ آپ کا بیک اپ پلان مفت ہے - + %1$s کی تجدید کرتا ہے + + %1$s کو زائد المیعاد ہوتی ہے + + %1$s کو زائد المیعاد ہو گئی تھی اپنی میسج ہسٹری کا بیک اپ کریں تاکہ جب بھی آپ کوئی نیا فون لیں یا Molly کو دوبارہ انسٹال کریں تو اس صورت میں آپ کا ڈیٹا کبھی بھی ضائع نہ ہو۔ @@ -7469,6 +7623,10 @@ دستی طور پر بیک اپ کریں براہ کرم اپنی ڈیوائس کی پِن، پاس ورڈ یا پیٹرن درج کریں۔ + + بیک اپس کو دوبارہ فعال کریں + + بیک اپس کو آف کر دیا گیا ہے اور آپ کا ڈیٹا Signal کی محفوظ اسٹوریج سروس سے حذف کر دیا گیا ہے۔ diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 89824d155a..2b53bedfcc 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -362,6 +362,8 @@ Trò chuyện Tin nhắn + + Loại cuộc trò chuyện Tin nhắn %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + Mọi thứ đã sẵn sàng. Bắt đầu sao lưu ngay. Tùy thuộc vào kích thước của bản sao lưu, quá trình này có thể mất một khoảng thời gian dài. Bạn có thể sử dụng điện thoại như bình thường khi quá trình sao lưu đang diễn ra. @@ -1905,6 +1907,7 @@ +%1$d được mời + %1$d nhóm khác @@ -1930,6 +1933,7 @@ Không tìm thấy thiết bị nào. Lỗi mạng. Mã QR không đúng. + Xin lỗi, bạn có quá nhiều thiết bị liên kết, hãy thử gỡ một vài thiết bị Xin lỗi, đây không phải mã QR liên kết thiết bị chính xác. Liên kết một thiết bị dùng Signal? @@ -1951,11 +1955,13 @@ Gửi mật khẩu Mật khẩu không đúng! Mở khóa Molly + Molly Android - Màn hình Khoá Bản đồ + Thả ghim Chấp nhận địa chỉ @@ -2437,6 +2443,7 @@ Tin nhắn Signal + Thêm @@ -2468,6 +2475,7 @@ Chưa có nhãn dán nào được cài Nhãn dán từ tin nhắn sẽ được hiển thị ở đây Chưa đặt tên + Không rõ @@ -2688,6 +2696,7 @@ Tệp đa phương tiện không còn khả dụng. Không thể phát tập tin đa phương tiện. + Có lỗi khi tìm tin nhắn. Không thể tìm được ứng dụng có thể chia sẻ tệp đa phương tiện này. Đóng @@ -2757,6 +2766,7 @@ Tin nhắn Cuộc gọi + Thất bại Sao lưu Tình trạng khoá @@ -2766,6 +2776,7 @@ Vô danh Ghi chú Âm thanh Liên hệ bắt đầu dùng Signal + Không có hoạt động này để mở cài đặt kênh thông báo. Kết nối chạy nền @@ -3537,10 +3548,12 @@ Tất cả lịch sử tin nhắn sẽ được xóa vĩnh viễn trên tất cả thiết bị. Hành động này không thể hoàn tác. Xóa tất cả + Vĩnh viễn 1 năm 6 tháng 30 ngày + Không %1$s tin nhắn @@ -3564,6 +3577,7 @@ Hiện Nhạc chuông Cỡ chữ tin nhắn + Mức ưu tiên Khắc phục sự cố thông báo @@ -3792,6 +3806,7 @@ Quét mã QR địa chỉ của người được thanh toán + Yêu cầu Thanh toán Số dư có sẵn: %1$s @@ -3922,6 +3937,7 @@ Bạn chỉ có thể ghim tối đa %1$d cuộc trò chuyện + Ảnh Chân Dung Liên Hệ Đã lưu trữ @@ -3930,6 +3946,10 @@ Cuộc trò chuyện mới Mở Camera Chưa có tin nhắn.\nBắt đầu bằng việc nhắn tin cho một người bạn. + + Không có cuộc trò chuyện + + Cài đặt thư mục @@ -4154,6 +4174,7 @@ Sao lưu tin nhắn Chuyển tài khoản Chuyển tài khoản sang một thiết bị Android mới + Điền mật khẩu sao lưu Khôi phục Không thể nhập bản sao lưu tạo từ bản Signal mới hơn @@ -4361,6 +4382,7 @@ Không thể mở Cài đặt Wi-Fi. Vui lòng bật Wi-Fi thủ công. + Cấp quyền truy cập vị trí Bật dịch vụ Vị trí Bật Wi-Fi @@ -4607,6 +4629,7 @@ Chia sẻ + Gửi , %1$s @@ -4909,6 +4932,116 @@ Bàn phím Gửi với nút enter + + Thư mục trò chuyện + + Thêm thư mục trò chuyện + + + + Sắp xếp và nhanh chóng chuyển giữa các cuộc trò chuyện trong danh sách. + + Thư mục + + Tạo thư mục + + Tất cả cuộc trò chuyện + + Thư mục đề xuất + + Chưa đọc + + Tin nhắn chưa đọc từ tất cả cuộc trò chuyện + + Cuộc trò chuyện 1:1 + + Chỉ có tin nhắn từ cuộc trò chuyện trực tiếp + + Nhóm + + Chỉ có tin nhắn từ cuộc trò chuyện nhóm + + Thêm + + Đã thêm %1$s thư mục. + + Chỉnh sửa thư mục + + Xóa thư mục + + Thêm thư mục mới + + Tắt tiếng tất cả + + Sắp xếp thư mục + + Đánh dấu tất cả đã đọc + + + %1$d loại cuộc trò chuyện + + + + %1$d cuộc trò chuyện + + + + %1$d cuộc trò chuyện được loại trừ + + + + + Tạo thư mục + + Tên thư mục (bắt buộc) + + Cuộc trò chuyện được bao gồm + + Thêm cuộc trò chuyện + + Chọn cuộc trò chuyện bạn muốn xuất hiện trong thư mục này. + + Ngoại trừ + + Loại trừ cuộc trò chuyện + + Chọn cuộc trò chuyện bạn không muốn xuất hiện trong thư mục này. + + Chỉ hiển thị cuộc trò chuyện chưa đọc + + Khi kích hoạt, chỉ các cuộc trò chuyện có tin nhắn chưa đọc sẽ hiển thị trong thư mục này. + + Bao gồm cuộc trò chuyện đã tắt tiếng + + Tạo + + Tạo thư mục? + + Bạn muốn tạo thư mục trò chuyện \"%1$s\"? + + Tạo thư mục + + Chỉnh sửa thư mục + + Lưu + + Lưu thay đổi? + + Bạn có muốn lưu các thay đổi cho thư mục trò chuyện này? + + Lưu thay đổi + + Bỏ + + Xóa thư mục + + Xóa thư mục trò chuyện này? + + + + Loại cuộc trò chuyện + + Xong Tin nhắn @@ -4992,6 +5125,7 @@ Chất lượng tập tin đa phương tiện + Chất lượng tập tin đa phương tiện đã gửi Việc gửi tập tin đa phương tiện chất lượng cao sẽ tốn nhiều lưu lượng hơn. @@ -7076,10 +7210,10 @@ - Your backups subscription expired + Gói đăng ký sao lưu của bạn đã hết hạn - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + Gói đăng ký sao lưu của bạn đã hết hạn vì gói không thể được gia hạn với phương thức thanh toán hiện tại của bạn. Sau %1$d ngày, tập tin đa phương tiện trong bản sao lưu của bạn sẽ bị xóa. Bạn có thể thanh toán cho gói sao lưu bất kỳ lúc nào để tiếp tục sao lưu tất cả tập tin đa phương tiện của mình. @@ -7096,9 +7230,9 @@ Nếu chọn \"Bỏ qua\", tập tin đa phương tiện trong bản sao lưu của bạn sẽ được xóa trong %1$d ngày. - Your backups subscription failed to renew + Gia hạn không thành công gói đăng ký sao lưu của bạn - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + Kiểm tra để đảm bảo rằng phương thức thanh toán của bạn đã được cập nhật thông tin mới nhất. Nhấn Quản lý gói đăng ký, tìm mục Phương thức thanh toán và nhấn Cập nhật. Không thể hoàn tất sao lưu @@ -7110,7 +7244,7 @@ Quản lý Gói Ủng hộ - Subscribe for %1$s/month + Đăng ký gói với giá %1$s/tháng Tải tập tin đa phương tiện ngay @@ -7145,6 +7279,17 @@ %1$s trên tổng số %2$s + + + Hủy tải xuống + + Đang tải: %1$s trên tổng số %2$s (%3$s%%) + + Không đủ dung lượng để tải Bản sao lưu của bạn. Để tiếp tục, giải phóng %1$s dung lượng. + + Bỏ qua không tải + + "Quá trình sao lưu gần nhất của bạn không thể hoàn tất. Đảm bảo điện thoại của bạn đã kết nối Wi-Fi và nhấn Sao lưu ngay để thử lại." @@ -7198,17 +7343,17 @@ Tối ưu hóa lưu trữ là tính năng của gói trả phí Sao lưu Signal. Nâng cấp gói sao lưu để bắt đầu sử dụng tính năng này. - Subscribe for %1$s/month + Đăng ký gói với giá %1$s/tháng - This media is no longer available + Tập tin đa phương tiện không còn khả dụng - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + Gói sao lưu Signal hiện tại của bạn bao gồm tập tin đa phương tiện trong %1$d ngày gần nhất. Để bắt đầu sao lưu tất cả tập tin đa phương tiện, nâng cấp ngay. - Subscribe for %1$s/month + Đăng ký gói với giá %1$s/tháng Việc xóa nay được đồng bộ trên tất cả thiết bị của bạn @@ -7251,11 +7396,13 @@ Loại bản sao lưu đã thay đổi và gói đăng ký đã được hủy - Quyên góp đã bị hủy bỏ + Gói đăng ký đã được hủy Tải xuống hoàn tất Bản sao lưu sẽ được tạo trong đêm. + + Gói đăng ký không hoạt động Gói sao lưu @@ -7264,8 +7411,12 @@ %1$s/tháng Bạn đang sử dụng gói miễn phí - + Gia hạn %1$s + + Hết hạn vào %1$s + + Đã hết hạn vào %1$s Sao lưu lịch sử tin nhắn để không bao giờ mất dữ liệu khi bạn có điện thoại mới hoặc cài lại Molly. @@ -7310,6 +7461,10 @@ Sao lưu thủ công Vui lòng nhập mã PIN, mật khẩu hoặc mã khóa dạng vẽ hình của thiết bị. + + Kích hoạt lại sao lưu + + Đã tắt sao lưu và dữ liệu của bạn đã được xóa khỏi dịch vụ lưu trữ bảo mật của Signal. diff --git a/app/src/main/res/values-yue/strings.xml b/app/src/main/res/values-yue/strings.xml index 796dfa1645..fd9cafa9df 100644 --- a/app/src/main/res/values-yue/strings.xml +++ b/app/src/main/res/values-yue/strings.xml @@ -362,6 +362,8 @@ 聊天 訊息 + + 聊天類型 寫個訊息畀 %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + 搞掂晒。你可以即刻開始備份喇。 視乎備份嘅大細而定,成個過程可能要好耐。備份嗰陣,你可以好似平時咁用手機。 @@ -1905,6 +1907,7 @@ +%1$d 位獲邀 + 其餘 %1$d 個谷 @@ -1930,6 +1933,7 @@ 乜嘢機都搵唔到。 網絡問題。 二維碼無效。 + 抱歉,您已經連結咗太多部機喇,您剷咁啲先啦 抱歉,呢個唔係有效嘅裝置連結二維碼。 係咪要連結一部 Signal 嘅機? @@ -1951,11 +1955,13 @@ 提交密碼 密碼無效! 解鎖 Molly + Molly Android - 鎖定畫面 地圖 + 指出位置 係呢個地址嘞 @@ -2437,6 +2443,7 @@ Signal 訊息 + 更多 @@ -2468,6 +2475,7 @@ 未裝任何貼圖 人哋畀您嘅訊息入面嘅貼圖會擺喺呢度 無題 + 未知 @@ -2688,6 +2696,7 @@ 多媒體檔案已經冇咗。 播放唔到媒體。 + 尋找訊息嗰陣發生錯誤。 搵唔到一個可以分享呢個媒體檔案嘅 app。 關閉 @@ -2757,6 +2766,7 @@ 訊息 通話 + 唔掂檔 備份 上鎖狀態 @@ -2766,6 +2776,7 @@ 未知 語音筆記 聯絡人開咗 Signal + 無可用嘅活動去開啟通知類別設定。 背景連線 @@ -3537,10 +3548,12 @@ 所有訊息紀錄就會喺所有裝置上面永久刪除㗎喇。剷走咗就冇得返轉頭㗎喇。 立即全部刪除 + 永久 1 年 6 個月 30 日 + %1$s 個訊息 @@ -3564,6 +3577,7 @@ 顯示 鈴聲 訊息字體大細 + 優次 通知疑難排解 @@ -3792,6 +3806,7 @@ 掃描收款人嘅位址二維碼 + 請求 支付 可用餘額:%1$s @@ -3922,6 +3937,7 @@ 您淨係可以將最多 %1$d 個傾偈置頂 + 聯絡人張相嘅樣 已封印 @@ -3930,6 +3946,10 @@ 新聊天 開啟相機 身在獨家村。\n發個訊息畀好友撩下佢傾偈啦。 + + 無聊天可以展示 + + 資料夾設定 @@ -4154,6 +4174,7 @@ 傾偈備份 過帳戶落新機 將帳戶轉移去一部新嘅 Android 機度 + 輸入備份密碼 還原 冇辦法由較新嘅 Signal 版本匯入備份 @@ -4361,6 +4382,7 @@ 開啟唔到 Wi-Fi 設定。麻煩您自己開啟 Wi-Fi。 + 畀「位置」權限 開啟定位服務 開啟 Wi-Fi @@ -4607,6 +4629,7 @@ 分享 + 傳送 、%1$s @@ -4909,6 +4932,116 @@ 鍵盤 㩒「Enter」掣傳送 + + 聊天資料夾 + + 加聊天資料夾 + + + + 將你嘅聊天整理成資料夾,然後响聊天清單上面快脆咁轉換。 + + 資料夾 + + 建立資料夾 + + 全部聊天 + + 建議嘅資料夾 + + 未睇 + + 所有聊天入面嘅未睇訊息 + + 1 對 1 聊天 + + 只係得 1 對 1 聊天嘅訊息 + + + + 只係得群組聊天嘅訊息 + + 加入去 + + 加咗「 %1$s 」資料夾。 + + 編輯資料夾 + + 刪除資料夾 + + 加新嘅資料夾 + + 全部靜音 + + 重新排列資料夾 + + 全部剔低話睇咗 + + + %1$d 種聊天類型 + + + + %1$d 個聊天 + + + + 剔除咗 %1$d 個聊天 + + + + + 建立資料夾 + + 資料夾名堂(必填) + + 包含嘅聊天 + + 加聊天 + + 揀你想顯示喺呢個資料夾入面嘅聊天。 + + 例外情況 + + 剔除聊天 + + 揀你唔想顯示喺呢個資料夾入面嘅聊天。 + + 只顯示未睇嘅聊天 + + 啟用咗之後,呢個資料夾只會顯示有未睇訊息嘅聊天。 + + 包埋已靜音嘅聊天 + + 建立 + + 係咪要建立資料夾? + + 你係咪想建立聊天資料夾「%1$s」呀? + + 建立資料夾 + + 編輯資料夾 + + 儲存 + + 係咪要儲存變更? + + 你係咪想儲存對呢個聊天谷嘅更改? + + 儲存變更 + + 掉咗佢 + + 刪除資料夾 + + 係咪要刪除呢個聊天資料夾呀? + + + + 聊天類型 + + 完成 訊息 @@ -4992,6 +5125,7 @@ 多媒體檔案嘅畫質 + 發送多媒體檔案嘅畫質 發送高畫質嘅多媒體檔案會用多啲數據。 @@ -7076,10 +7210,10 @@ - Your backups subscription expired + 你嘅備份課金計劃已經過咗期 - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + 你嘅備份計劃用唔到而家嘅付款方式續期,所以已經過咗期。%1$d 日之後,系統就會刪除備份入面嘅媒體。 你可以隨時再開始支付備份費用,咁就可以繼續備份所有媒體。 @@ -7096,9 +7230,9 @@ 如果你選擇「跳過」,備份入面嘅媒體會喺 %1$d 日之後刪除。 - Your backups subscription failed to renew + 你嘅備份課金計劃續唔到期 - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + 請確定你嘅付款方式仍然有效。㩒一吓「管理課金計劃」,然後喺付款方式下面㩒「更新」。 完成唔到備份 @@ -7110,7 +7244,7 @@ 管理課金計劃 - Subscribe for %1$s/month + 每月課金 %1$s 即刻下載媒體 @@ -7145,6 +7279,17 @@ %1$s / %2$s + + + 取消下載 + + 下載緊 %1$s / %2$s (%3$s%%) + + 唔夠空間下載你嘅備份。要繼續,請你搵多 %1$s 空間。 + + 跳過下載 + + "完成唔到你上次嘅備份。請確保你部手機已經連咗 Wi-Fi,然後㩒「即刻備份」再試。" @@ -7198,17 +7343,17 @@ 淨係得有課金用 Signal 備份嘅帳戶先用到「優化儲存空間」功能。如果想用呢個功能,就升級備份計劃啦。 - Subscribe for %1$s/month + 每月課金 %1$s - This media is no longer available + 呢個媒體已經冇咗 - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + 你而家嘅 Signal 備份計劃包括最近 %1$d 日嘅媒體。如果要開始備份所有媒體,請即刻升級。 - Subscribe for %1$s/month + 每月課金 %1$s 你所有裝置會同步進行刪除 @@ -7256,6 +7401,8 @@ 下載完成 備份將會通宵建立。 + + 未有課金計劃 備份計劃 @@ -7264,8 +7411,12 @@ 每月 %1$s 你嘅備份計劃係免費嘅 - + %1$s 續期 + + %1$s 到期 + + %1$s 到期 備份你嘅訊息紀錄,當你換新手機或者重新安裝 Molly 嗰陣,就唔會冇咗啲資料啦。 @@ -7310,6 +7461,10 @@ 手動備份 請輸入你嘅裝置 PIN 碼、密碼或者圖案。 + + 重新啟用備份 + + 備份已經閂咗,同埋你嘅資料已經喺 Signal 嘅安全儲存服務入面刪除。 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 638d1afbd6..71334292c6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -362,6 +362,8 @@ 聊天 消息 + + 聊天类型 消息 %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + 您已完成操作。现在开始备份吧。 根据备份的大小,这可能需要很长时间。在备份过程中,您可以正常使用手机。 @@ -1905,6 +1907,7 @@ 已邀请 %1$d 人 + 更多%1$d个群组 @@ -1930,6 +1933,7 @@ 未找到设备。 网络错误。 无效二维码。 + 很抱歉,关联设备过多,请先移除一些。 抱歉,设备关联二维码无效。 关联 Signal 设备? @@ -1951,11 +1955,13 @@ 提交密码 无效密码! 解锁 Molly + Molly Android - 锁定屏幕 地图 + 标注 接受地址 @@ -2437,6 +2443,7 @@ Signal 消息 + 更多 @@ -2468,6 +2475,7 @@ 未安装表情 此处将显示传入消息中的表情 未命名 + 未知 @@ -2688,6 +2696,7 @@ 媒体已失效。 无法播放媒体。 + 查找消息时出错。 未找到可分享此媒体的应用。 关闭 @@ -2757,6 +2766,7 @@ 消息 通话 + 失败 备份 锁定状态 @@ -2766,6 +2776,7 @@ 未知 语音笔记 联系人加入 Signal + 无可用活动以打开通知渠道设置。 后台连接 @@ -3537,10 +3548,12 @@ 所有设备上的所有消息历史记录将会被永久删除。此操作无法撤销。 马上删除所有 + 永久 1 年 6 个月 30 天 + %1$s 条消息 @@ -3564,6 +3577,7 @@ 显示 铃声 消息字体大小 + 优先级 针对通知延迟的疑难解答 @@ -3792,6 +3806,7 @@ 扫描收款人的地址二维码 + 入群请求 付款 可用余额:%1$s @@ -3922,6 +3937,7 @@ 您最多只能置顶%1$d个对话。 + 联系人图片 已存档 @@ -3930,6 +3946,10 @@ 新聊天 打开相机 还没有聊天记录。\n开始使用,给朋友发个消息吧。 + + 没有可显示的聊天 + + 文件夹设置 @@ -4154,6 +4174,7 @@ 聊天备份 转移帐户 转移帐户至新的 Android 设备 + 输入备份密码 还原 无法从较新版本的 Signal 导入备份 @@ -4361,6 +4382,7 @@ 无法打开 Wi-Fi 设置,请手动开启 Wi-Fi。 + 授予位置权限 开启位置服务 开启 Wi-Fi @@ -4607,6 +4629,7 @@ 分享 + 发送 ,%1$s @@ -4909,6 +4932,116 @@ 键盘 按输入键发送 + + 聊天文件夹 + + 添加聊天文件夹 + + + + 您可以将聊天整理到文件夹中,并在聊天列表中快速切换。 + + 文件夹 + + 创建文件夹 + + 所有聊天 + + 建议的文件夹 + + 未读 + + 所有聊天中的未读消息 + + 私聊 + + 仅包含私聊消息 + + 群聊 + + 仅包含群聊消息 + + 添加 + + 已添加%1$s文件夹。 + + 编辑文件夹 + + 删除文件夹 + + 添加新文件夹 + + 全部静音 + + 文件夹重新排序 + + 全部已读 + + + %1$d 个聊天类型 + + + + %1$d 个聊天 + + + + 已排除 %1$d 个聊天 + + + + + 创建文件夹 + + 文件夹名称(必填) + + 包含的聊天 + + 添加聊天 + + 选择您想要显示在此文件夹中的聊天。 + + 例外情况 + + 排除聊天 + + 选择您不想要显示在此文件夹中的聊天。 + + 仅显示未读聊天 + + 启用后,只有含未读消息的聊天才会显示在此文件夹中。 + + 包含静音聊天 + + 创建 + + 要创建文件夹? + + 您是否要创建“%1$s”聊天文件夹? + + 创建文件夹 + + 编辑文件夹 + + 保存 + + 要保存更改吗? + + 您是否要保存对此聊天文件夹所做的更改? + + 保存更改 + + 放弃 + + 删除文件夹 + + 要删除此聊天文件夹吗? + + + + 聊天类型 + + 完成 消息 @@ -4992,6 +5125,7 @@ 媒体质量 + 已发送媒体质量 发送高质量媒体将会使用更多数据。 @@ -7076,10 +7210,10 @@ - Your backups subscription expired + 您的备份套餐已过期 - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + 您的备份套餐已过期,因为套餐无法通过您当前的付款方式续期。%1$d 天后,您的备份中的媒体将会被删除。 您可以随时重新开始支付备份费用,以继续备份您的所有媒体。 @@ -7096,9 +7230,9 @@ 如果您选择“跳过”,备份中的媒体将会在 %1$d 天后删除。 - Your backups subscription failed to renew + 您的备份套餐无法续期 - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + 请确保您使用的是最新的付款方式。您可以点击“管理套餐”,在“付款方式”下方点击“更新”。 无法完成备份 @@ -7110,7 +7244,7 @@ 管理定期捐款 - Subscribe for %1$s/month + 按 %1$s/月订阅 立即下载媒体 @@ -7145,6 +7279,17 @@ %1$s / %2$s 匹配 + + + 取消下载 + + 正在下载:%1$s/%2$s(%3$s%%) + + 没有足够的空间来下载您的备份。请继续释放 %1$s 的空间。 + + 跳过下载 + + "您的上次备份无法完成。请确保您的手机已连接到 Wi-Fi,然后点击“立即备份”以重试。" @@ -7198,17 +7343,17 @@ 储存优化功能仅在 Signal 备份付费套餐中可用。欢迎升级您的备份套餐以开始使用该功能。 - Subscribe for %1$s/month + 按 %1$s/月订阅 - This media is no longer available + 此媒体已不可用 - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + 您当前的 Signal 备份套餐包含最近 %1$d 天的媒体。如要开始备份所有媒体,请立即更新套餐。 - Subscribe for %1$s/month + 按 %1$s/月订阅 删除操作现可在所有设备上同步进行 @@ -7256,6 +7401,8 @@ 下载完成 备份将在夜间创建。 + + 备份套餐未激活 备份套餐 @@ -7264,8 +7411,12 @@ %1$s/月 您使用的是免费备份套餐 - + 到 %1$s 续期 + + %1$s到期 + + %1$s已到期 备份消息记录可以确保您在更换手机或重装 Molly 时不会丢失数据。 @@ -7310,6 +7461,10 @@ 手动备份 请输入您的设备 Pin 码、密码或解锁图案。 + + 重新启用备份 + + 备份已关闭,您的数据已从 Signal 的安全存储服务器中删除。 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 7e0a2f2cdd..d815f24b9f 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -362,6 +362,8 @@ 聊天 訊息 + + 聊天類型 傳送訊息給 %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + 一切準備就緒。立即開始你的備份。 視備份的大小而定,這可能需要一段較長的時間。備份期間,你可以如常使用手機。 @@ -1905,6 +1907,7 @@ +%1$d 個邀請 + 另 %1$d 個群組 @@ -1930,6 +1933,7 @@ 找不到裝置。 網絡錯誤。 二維碼無效。 + 抱歉,您已連結太多裝置,請試試先移除部分 抱歉,這並非有效的裝置連結二維碼。 要連結 Signal 裝置嗎? @@ -1951,11 +1955,13 @@ 提交密碼 密碼無效! 解除鎖定 Molly + Molly Android - 鎖定畫面 地圖 + 放置圖釘 接受地址 @@ -2437,6 +2443,7 @@ Signal 訊息 + 更多 @@ -2468,6 +2475,7 @@ 無已安裝的貼圖 來自傳入訊息的貼圖將在此出現 無題 + 未知 @@ -2688,6 +2696,7 @@ 媒體不再可用。 無法播放多媒體。 + 查找訊息時發生錯誤。 找不到能夠分享此媒體的應用程式。 關閉 @@ -2757,6 +2766,7 @@ 訊息 通話 + 失敗狀況 備份 鎖定狀態 @@ -2766,6 +2776,7 @@ 未知 語音備忘 聯絡人已加入 Signal + 無可用的活動以開啟通知通道設定。 背景連線 @@ -3537,10 +3548,12 @@ 所有訊息紀錄將會從所有裝置中永久移除。此動作無法復原。 立即全部刪除 + 永久 1 年 6 個月 30 天 + %1$s 則訊息 @@ -3564,6 +3577,7 @@ 顯示 鈴聲 訊息字型大小 + 優先順序 疑難排解通知 @@ -3792,6 +3806,7 @@ 掃描收款人的位址二維碼 + 請求 支付 可用餘額:%1$s @@ -3922,6 +3937,7 @@ 您僅可釘選最多 %1$d 個聊天 + 聯絡人照片影像 已封存 @@ -3930,6 +3946,10 @@ 新聊天 開啟相機 未有任何聊天。\n找個好友傳訊以開始使用。 + + 無聊天可顯示 + + 資料夾設定 @@ -4154,6 +4174,7 @@ 聊天備份 轉移帳戶 轉移帳戶至新的 Android 裝置 + 輸入備份密碼 還原 未能從 Signal 較新版本匯入備份 @@ -4361,6 +4382,7 @@ 無法開啟 Wi-Fi 設定。請手動開啟 Wi-Fi。 + 授予位置權限 開啟定位服務 開啟 Wi-Fi @@ -4607,6 +4629,7 @@ 分享 + 傳送 、%1$s @@ -4909,6 +4932,116 @@ 鍵盤 按輸入發送 + + 聊天資料夾 + + 新增聊天資料夾 + + + + 將你的聊天整理到資料夾中,然後在聊天清單上快速切換。 + + 資料夾 + + 建立資料夾 + + 所有聊天 + + 建議的資料夾 + + 未讀 + + 所有聊天中的未讀訊息 + + 1 對 1 聊天 + + 只有直接聊天的訊息 + + 群組 + + 只有群組聊天的訊息 + + 新增 + + 新增了 %1$s 資料夾。 + + 編輯資料夾 + + 刪除資料夾 + + 新增新資料夾 + + 全部靜音 + + 重新排列資料夾 + + 全部標記為已讀 + + + %1$d 聊天類型 + + + + %1$d 個聊天 + + + + 排除 %1$d 聊天 + + + + + 建立資料夾 + + 資料夾名稱(必填) + + 包含的聊天 + + 新增聊天 + + 選擇要顯示在此資料夾中的聊天。 + + 例外 + + 排除聊天 + + 選擇你不想顯示在此資料夾中的聊天。 + + 僅顯示未讀的聊天 + + 啟用後,此資料夾只會顯示含有未讀訊息的聊天。 + + 包括靜音聊天 + + 建立 + + 要建立資料夾嗎? + + 你要建立聊天資料夾「%1$s」嗎? + + 建立資料夾 + + 編輯資料夾 + + 儲存 + + 要儲存變更嗎? + + 你要儲存對此聊天資料夾所作的變更嗎? + + 儲存變更 + + 捨棄 + + 刪除資料夾 + + 要刪除此聊天資料夾嗎? + + + + 聊天類型 + + 完成 訊息 @@ -4992,6 +5125,7 @@ 媒體的品質 + 送出媒體的品質 傳送高品質的媒體將會使用較多數據。 @@ -7076,10 +7210,10 @@ - Your backups subscription expired + 你的備份定期贊助已過期 - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + 因為無法使用你目前的付款方式續訂,你的備份計畫現已過期。%1$d 天後,你備份中的媒體將被刪除。 你可以隨時重新開始支付備份費用,以繼續備份所有媒體。 @@ -7096,9 +7230,9 @@ 如果你選擇「跳過」,備份內的媒體將在 %1$d 天後刪除。 - Your backups subscription failed to renew + 你的備份定期贊助無法續訂 - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + 請檢查以確定你的付款方式仍然有效。點按管理定期贊助,然後在付款方式下點按更新。 無法完成備份 @@ -7110,7 +7244,7 @@ 管理定期贊助 - Subscribe for %1$s/month + 以每月 %1$s 定期贊助 立即下載媒體 @@ -7145,6 +7279,17 @@ 第 %1$s 個,共 %2$s 個 + + + 取消下載 + + 正在下載 %2$s 中的 %1$s (%3$s%%) + + 空間不足,無法下載你的備份。如要繼續,請釋放 %1$s 空間。 + + 跳過下載 + + "無法完成你上次的備份。確保你的手機已連接到 Wi-Fi,然後點按「立即備份」以再試一次。" @@ -7198,17 +7343,17 @@ 儲存最佳化只可供 Signal Backups 付費級別使用。升級你的備份計畫以開始使用此功能。 - Subscribe for %1$s/month + 以每月 %1$s 定期贊助 - This media is no longer available + 此媒體不再適用 - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + 你目前的 Signal 備份計畫包括最近 %1$d 天的媒體。若要開始備份所有媒體,請立即升級。 - Subscribe for %1$s/month + 以每月 %1$s 定期贊助 現已在你所有裝置上同步刪除 @@ -7251,11 +7396,13 @@ 備份類型已變更且定期贊助已取消 - 訂閱已取消 + 備份定期贊助已取消 下載完成 備份將會通宵建立。 + + 備份定期贊助未啟用 備份計畫 @@ -7264,8 +7411,12 @@ %1$s/月 你的備份計畫是免費的 - + %1$s 續期 + + 到期日為 %1$s + + 到期日為 %1$s 備份你的訊息紀錄,讓你在使用新手機或重新安裝 Molly 時,絕不會遺失資料。 @@ -7310,6 +7461,10 @@ 手動備份 請輸入你的裝置 PIN 碼、密碼或圖案。 + + 重新啟用備份 + + 備份已關閉,而且你的資料已從 Signal 的安全儲存服務中刪除。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8c5bf9635e..bd222b2b76 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -362,6 +362,8 @@ 聊天 訊息 + + 聊天類型 傳送訊息給 %1$s @@ -793,7 +795,7 @@ - You\'re all set. Start your backup now. + 一切準備就緒。立即開始你的備份。 視備份的大小而定,這可能需要一段較長的時間。備份期間,你可以如常使用手機。 @@ -1905,6 +1907,7 @@ +%1$d 已邀請 + 另外 %1$d 個群組 @@ -1930,6 +1933,7 @@ 未找到裝置。 網路錯誤。 QR 碼無效。 + 抱歉,您已連結太多裝置,請試試先移除部分 抱歉,這不是有效的裝置連結 QR 碼。 連結 Signal 裝置? @@ -1951,11 +1955,13 @@ 送出密碼 無效的密碼! 解鎖 Molly + Molly Android-螢幕鎖定 地圖 + 標註地圖 接受地址 @@ -2437,6 +2443,7 @@ Signal 訊息 + 更多 @@ -2468,6 +2475,7 @@ 沒有貼圖被安裝 你收到的貼圖訊息將顯示在這裡 無標題 + 未知 @@ -2688,6 +2696,7 @@ 媒體已不存在。 無法播放多媒體。 + 查找訊息時發生錯誤。 找不到能夠分享此媒體檔案的應用程式。 關閉 @@ -2757,6 +2766,7 @@ 訊息 通話 + 失敗 備份 鎖定狀態 @@ -2766,6 +2776,7 @@ 未知 語音筆記 聯絡人上線 Signal 通知 + 無可用的活動以開啟通知類別設定。 背景連線 @@ -3537,10 +3548,12 @@ 所有訊息紀錄將會從所有裝置中永久移除。此動作無法復原。 立即刪除全部 + 永久 1年 6個月 30天 + %1$s 則訊息 @@ -3564,6 +3577,7 @@ 顯示 鈴聲 訊息字體大小 + 優先順序 疑難排解通知 @@ -3792,6 +3806,7 @@ 掃描收款人的位址的QR碼 + 要求 支付 可用餘額:%1$s @@ -3922,6 +3937,7 @@ 你最多只能釘選 %1$d 個聊天 + 聯絡人相片 存檔 @@ -3930,6 +3946,10 @@ 新聊天 開啟相機 尚無聊天。\n透過與朋友聊天開始。 + + 無聊天可顯示 + + 資料夾設定 @@ -4154,6 +4174,7 @@ 聊天備份 轉移帳號 將帳號轉移到新的Android裝置 + 輸入備份密碼 還原 無法從較新版本的 Signal 匯入備份檔 @@ -4361,6 +4382,7 @@ 無法開啟“ Wifi設定”。 請手動開啟Wifi。 + 給予位置權限 開啟定位服務 開啟Wifi @@ -4607,6 +4629,7 @@ 分享 + 傳送 、%1$s @@ -4909,6 +4932,116 @@ 鍵盤 按輸入發送 + + 聊天資料夾 + + 新增聊天資料夾 + + + + 將你的聊天整理到資料夾中,然後在聊天清單上快速切換。 + + 資料夾 + + 建立資料夾 + + 所有聊天 + + 建議的資料夾 + + 未讀 + + 所有聊天中的未讀訊息 + + 1:1 聊天 + + 只有直接聊天的訊息 + + 群組 + + 只有群組聊天的訊息 + + 新增 + + 新增了 %1$s 資料夾。 + + 編輯資料夾 + + 刪除資料夾 + + 新增新資料夾 + + 全部靜音 + + 重新排列資料夾 + + 全部標示為已讀 + + + %1$d 聊天類型 + + + + %1$d 個聊天 + + + + 排除 %1$d 聊天 + + + + + 建立資料夾 + + 資料夾名稱(必填) + + 包含的聊天 + + 新增聊天 + + 選擇要顯示在此資料夾中的聊天。 + + 例外 + + 排除聊天 + + 選擇你不想顯示在此資料夾中的聊天。 + + 僅顯示未讀的聊天 + + 啟用後,此資料夾只會顯示含有未讀訊息的聊天。 + + 包括靜音聊天 + + 建立 + + 要建立資料夾嗎? + + 你要建立聊天資料夾「%1$s」嗎? + + 建立資料夾 + + 編輯資料夾 + + 儲存 + + 要儲存變更嗎? + + 你要儲存對此聊天資料夾所作的變更嗎? + + 儲存變更 + + 放棄 + + 刪除資料夾 + + 要刪除此聊天資料夾嗎? + + + + 聊天類型 + + 完成 訊息 @@ -4992,6 +5125,7 @@ 媒體檔品質 + 已傳送媒體檔品質 傳送高畫質的媒體檔將會使用較多數據。 @@ -7076,10 +7210,10 @@ - Your backups subscription expired + 你的備份定期贊助已過期 - Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted. + 因為無法使用你目前的付款方式續訂,你的備份計畫現已過期。%1$d 天後,你備份中的媒體將被刪除。 你可以隨時重新開始支付備份費用,以繼續備份所有媒體。 @@ -7096,9 +7230,9 @@ 如果你選擇「跳過」,備份內的媒體將在 %1$d 天後刪除。 - Your backups subscription failed to renew + 你的備份定期贊助無法續訂 - Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update. + 請檢查以確定你的付款方式仍然有效。點按管理定期贊助,然後在付款方式下點按更新。 無法完成備份 @@ -7110,7 +7244,7 @@ 管理定期贊助 - Subscribe for %1$s/month + 以每月 %1$s 定期贊助 立即下載媒體 @@ -7145,6 +7279,17 @@ 第 %1$s 個,共 %2$s 個 + + + 取消下載 + + 正在下載 %2$s 中的 %1$s (%3$s%%) + + 空間不足,無法下載你的備份。要繼續,請釋放 %1$s 空間。 + + 跳過下載 + + "無法完成你上次的備份。確保你的手機已連接到 Wi-Fi,然後點按「立即備份」以再試一次。" @@ -7198,17 +7343,17 @@ 儲存最佳化只可供 Signal Backups 付費級別使用。升級你的備份計畫以開始使用此功能。 - Subscribe for %1$s/month + 以每月 %1$s 定期贊助 - This media is no longer available + 此媒體不再適用 - Your current Signal backup plan includes your most recent %1$d days of media. To start backing up all your media, upgrade now. + 你目前的 Signal 備份計畫包括最近 %1$d 天的媒體。若要開始備份所有媒體,請立即升級。 - Subscribe for %1$s/month + 以每月 %1$s 定期贊助 現已在你所有裝置上同步刪除 @@ -7251,11 +7396,13 @@ 備份類型已變更且定期贊助已取消 - 定期贊助已取消 + 備份定期贊助已取消 下載完成 備份將會通宵建立。 + + 備份定期贊助未啟用 備份計畫 @@ -7264,8 +7411,12 @@ %1$s/月 你的備份計畫是免費的 - + 續約 %1$s + + 到期日為 %1$s + + 到期日為 %1$s 備份你的訊息紀錄,讓你在使用新手機或重新安裝 Molly 時,絕不會遺失資料。 @@ -7310,6 +7461,10 @@ 手動備份 請輸入你的裝置 PIN 碼、密碼或圖案。 + + 重新啟用備份 + + 備份已關閉,而且你的資料已從 Signal 的安全儲存服務中刪除。 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 2183662261..ca8b8b936e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -248,4 +248,6 @@ 4dp 0dp + 64dp + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91c5c090c4..3d2027837b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -367,6 +367,8 @@ Chats Messages + + Chat types Message %s @@ -1967,6 +1969,7 @@ +%1$d invited +%1$d invited + %d additional group %d additional groups @@ -1994,6 +1997,7 @@ No device found. Network error. Invalid QR code. + Sorry, you have too many devices linked already, try removing some Sorry, this is not a valid device link QR code. Link a Signal device? @@ -2016,11 +2020,13 @@ Submit passphrase Invalid passphrase! Unlock Molly + Molly Android - Lock Screen Map + Drop pin Accept address @@ -2526,6 +2532,7 @@ Signal Message + More @@ -2557,6 +2564,7 @@ No stickers installed Stickers from incoming messages will appear here Untitled + Unknown @@ -2778,6 +2786,7 @@ Media no longer available. Unable to play media. + Error finding message. Can\'t find an app able to share this media. Close @@ -2849,6 +2858,7 @@ Messages Calls + Failures Backups Lock status @@ -2858,6 +2868,7 @@ Unknown Voice Notes Contact joined Signal + No activity available to open notification channel settings. Background connection @@ -3640,10 +3651,12 @@ All message history will be permanently removed from all devices. This action cannot be undone. Delete all now + Forever 1 year 6 months 30 days + None %1$s message @@ -3668,6 +3681,7 @@ Show Ringtone Message font size + Priority Troubleshoot notifications @@ -3896,6 +3910,7 @@ Scan the address QR code of the payee + Request Pay Available balance: %1$s @@ -4027,6 +4042,7 @@ You can only pin up to %1$d chats + Contact Photo Image Archived @@ -4035,6 +4051,10 @@ New chat Open Camera No chats yet.\nGet started by messaging a friend. + + No chats to display + + Folder settings @@ -4267,6 +4287,7 @@ Chat backups Transfer account Transfer account to a new Android device + Enter backup passphrase Restore Cannot import backups from newer versions of Signal @@ -4474,6 +4495,7 @@ Unable to open Wi-Fi Settings. Please turn on Wi-Fi manually. + Grant location permission Turn on location services Turn on Wi-Fi @@ -4727,6 +4749,7 @@ Share + Send , %1$s @@ -5030,6 +5053,119 @@ Keyboard Send with enter + + Chat folders + + Add a chat folder + + + + Organize your chats into folders and quickly switch between them on your chat list. + + Folders + + Create a folder + + All chats + + Suggested folders + + Unreads + + Unread messages from all chats + + 1:1 chats + + Only messages from direct chats + + Groups + + Only message from group chats + + Add + + %1$s folder added. + + Edit folder + + Delete folder + + Add new folder + + Mute all + + Reorder folders + + Mark all read + + + %1$d chat type + %1$d chat types + + + + %1$d chat + %1$d chats + + + + %1$d chat excluded + %1$d chats excluded + + + + + Create a folder + + Folder name (required) + + Included chats + + Add chats + + Choose chats that you want to appear in this folder. + + Exceptions + + Exclude chats + + Choose chats that you do not want to appear in this folder. + + Only show unread chats + + When enabled, only chats with unread messages will be shown in this folder. + + Include muted chats + + Create + + Create folder? + + Do you want to create the chat folder \"%1$s\"? + + Create folder + + Edit folder + + Save + + Save changes? + + Do you want to save the changes you\'ve made to this chat folder? + + Save changes + + Discard + + Delete folder + + Delete this chat folder? + + + + Chat types + + Done Messages @@ -5114,6 +5250,7 @@ Media quality + Sent media quality Sending high quality media will use more data. @@ -7305,6 +7442,17 @@ %1$s of %2$s + + + Cancel download + + Downloading: %1$s of %2$s (%3$s%%) + + Not enough space to download your Backup. To continue free up %1$s of space. + + Skip download + + Your last backup couldn\'t be completed. Make sure your phone is connected to Wi-F and tap "Back up now" to try again. @@ -7412,11 +7560,13 @@ Backup type changed and subscription cancelled - Subscription cancelled + Subscription canceled Download complete Backup will be created overnight. + + Subscription inactive Backup plan @@ -7425,8 +7575,12 @@ %1$s/month Your backup plan is free - + Renews %1$s + + Expires on %1$s + + Expired on %1$s Back up your message history so you never lose data when you get a new phone or reinstall Molly. @@ -7471,6 +7625,10 @@ Manually back up Please enter your device pin, password or pattern. + + Re-enable backups + + Backups have been turned off and your data has been deleted from Signal\'s secure storage service. diff --git a/app/src/main/res/values/strings2.xml b/app/src/main/res/values/strings2.xml index 760f700110..051c299b35 100644 --- a/app/src/main/res/values/strings2.xml +++ b/app/src/main/res/values/strings2.xml @@ -125,6 +125,8 @@ For Android devices: Visit %s to install Molly. "Unable to register with Play Services Switch to an alternative push service in Settings > Notifications or fix the issue with Play Services. + An error occurred while registering for push notifications. %s + Please check if Google Play Services is installed and enabled, or switch to an alternative push service. Push notifications Select your preferred service for push notifications. If unavailable, the app will automatically use WebSocket to ensure notifications are delivered. Delivery service diff --git a/app/src/test/java/org/thoughtcrime/securesms/conversationlist/UnarchivedConversationListDataSourceTest.java b/app/src/test/java/org/thoughtcrime/securesms/conversationlist/UnarchivedConversationListDataSourceTest.java index 6530c5ffd1..01cd1aa65f 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/conversationlist/UnarchivedConversationListDataSourceTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/conversationlist/UnarchivedConversationListDataSourceTest.java @@ -13,13 +13,17 @@ import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; +import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord; import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter; import org.thoughtcrime.securesms.conversationlist.model.ConversationReader; import org.thoughtcrime.securesms.database.DatabaseObserver; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.ThreadTable; import org.thoughtcrime.securesms.dependencies.AppDependencies; +import org.thoughtcrime.securesms.util.RemoteConfig; +import java.util.ArrayList; +import java.util.HashSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -43,8 +47,13 @@ public class UnarchivedConversationListDataSourceTest { @Mock private MockedStatic signalDatabaseMockedStatic; + @Mock + private MockedStatic remoteConfigMockedStatic; + private ConversationListDataSource.UnarchivedConversationListDataSource testSubject; + private ChatFolderRecord allChatsFolder; + private ThreadTable threadTable; @Before @@ -53,10 +62,13 @@ public void setUp() { when(SignalDatabase.threads()).thenReturn(threadTable); when(AppDependencies.getDatabaseObserver()).thenReturn(mock(DatabaseObserver.class)); + when(RemoteConfig.getShowChatFolders()).thenReturn(true); - testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(ConversationFilter.OFF, false); + allChatsFolder = setupAllChatsFolder(); + testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(allChatsFolder, ConversationFilter.OFF, false); } + @Test public void givenNoConversations_whenIGetTotalCount_thenIExpectZero() { // WHEN @@ -64,9 +76,6 @@ public void givenNoConversations_whenIGetTotalCount_thenIExpectZero() { // THEN assertEquals(0, result); - assertEquals(0, testSubject.getHeaderOffset()); - assertFalse(testSubject.hasPinnedHeader()); - assertFalse(testSubject.hasUnpinnedHeader()); assertFalse(testSubject.hasConversationFilterFooter()); assertFalse(testSubject.hasArchivedFooter()); } @@ -81,28 +90,22 @@ public void givenArchivedConversations_whenIGetTotalCount_thenIExpectOne() { // THEN assertEquals(1, result); - assertEquals(0, testSubject.getHeaderOffset()); - assertFalse(testSubject.hasPinnedHeader()); - assertFalse(testSubject.hasUnpinnedHeader()); assertFalse(testSubject.hasConversationFilterFooter()); assertTrue(testSubject.hasArchivedFooter()); } @Test - public void givenSinglePinnedAndArchivedConversations_whenIGetTotalCount_thenIExpectThree() { + public void givenSinglePinnedAndArchivedConversations_whenIGetTotalCount_thenIExpectTwo() { // GIVEN - when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1); + when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); when(threadTable.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12); // WHEN int result = testSubject.getTotalCount(); // THEN - assertEquals(3, result); - assertEquals(1, testSubject.getHeaderOffset()); - assertTrue(testSubject.hasPinnedHeader()); - assertFalse(testSubject.hasUnpinnedHeader()); + assertEquals(2, result); assertFalse(testSubject.hasConversationFilterFooter()); assertTrue(testSubject.hasArchivedFooter()); } @@ -110,7 +113,7 @@ public void givenSinglePinnedAndArchivedConversations_whenIGetTotalCount_thenIEx @Test public void givenSingleUnpinnedAndArchivedConversations_whenIGetTotalCount_thenIExpectTwo() { // GIVEN - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); when(threadTable.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12); // WHEN @@ -118,27 +121,21 @@ public void givenSingleUnpinnedAndArchivedConversations_whenIGetTotalCount_thenI // THEN assertEquals(2, result); - assertEquals(0, testSubject.getHeaderOffset()); - assertFalse(testSubject.hasPinnedHeader()); - assertFalse(testSubject.hasUnpinnedHeader()); assertFalse(testSubject.hasConversationFilterFooter()); assertTrue(testSubject.hasArchivedFooter()); } @Test - public void givenSinglePinnedAndSingleUnpinned_whenIGetTotalCount_thenIExpectFour() { + public void givenSinglePinnedAndSingleUnpinned_whenIGetTotalCount_thenIExpectTwo() { // GIVEN - when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(2); + when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(2); // WHEN int result = testSubject.getTotalCount(); // THEN - assertEquals(4, result); - assertEquals(2, testSubject.getHeaderOffset()); - assertTrue(testSubject.hasPinnedHeader()); - assertTrue(testSubject.hasUnpinnedHeader()); + assertEquals(2, result); assertFalse(testSubject.hasConversationFilterFooter()); assertFalse(testSubject.hasArchivedFooter()); } @@ -152,8 +149,8 @@ public void givenNoConversations_whenIGetCursor_thenIExpectAnEmptyCursor() { Cursor cursor = testSubject.getCursor(0, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100, allChatsFolder); assertEquals(0, cursor.getCount()); } @@ -168,17 +165,17 @@ public void givenArchivedConversations_whenIGetCursor_thenIExpectOne() { Cursor cursor = testSubject.getCursor(0, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100, allChatsFolder); assertEquals(1, cursor.getCount()); } @Test - public void givenSinglePinnedAndArchivedConversations_whenIGetCursor_thenIExpectThree() { + public void givenSinglePinnedAndArchivedConversations_whenIGetCursor_thenIExpectTwo() { // GIVEN setupThreadDatabaseCursors(1, 0); - when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1); + when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); when(threadTable.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12); testSubject.getTotalCount(); @@ -186,16 +183,16 @@ public void givenSinglePinnedAndArchivedConversations_whenIGetCursor_thenIExpect Cursor cursor = testSubject.getCursor(0, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 99); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 98); - assertEquals(3, cursor.getCount()); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 99, allChatsFolder); + assertEquals(2, cursor.getCount()); } @Test public void givenSingleUnpinnedAndArchivedConversations_whenIGetCursor_thenIExpectTwo() { // GIVEN setupThreadDatabaseCursors(0, 1); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); when(threadTable.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12); testSubject.getTotalCount(); @@ -203,42 +200,42 @@ public void givenSingleUnpinnedAndArchivedConversations_whenIGetCursor_thenIExpe Cursor cursor = testSubject.getCursor(0, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100, allChatsFolder); assertEquals(2, cursor.getCount()); } @Test - public void givenSinglePinnedAndSingleUnpinned_whenIGetCursor_thenIExpectFour() { + public void givenSinglePinnedAndSingleUnpinned_whenIGetCursor_thenIExpectTwo() { // GIVEN setupThreadDatabaseCursors(1, 1); - when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(2); + when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(1); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(2); testSubject.getTotalCount(); // WHEN Cursor cursor = testSubject.getCursor(0, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 99); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 97); - assertEquals(4, cursor.getCount()); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 99, allChatsFolder); + assertEquals(2, cursor.getCount()); } @Test public void givenLoadingSecondPage_whenIGetCursor_thenIExpectProperOffsetAndCursorCount() { // GIVEN setupThreadDatabaseCursors(0, 100); - when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(4); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(104); + when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(4); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(104); testSubject.getTotalCount(); // WHEN Cursor cursor = testSubject.getCursor(50, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 50, 100); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 44, 100); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 50, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 46, 100, allChatsFolder); assertEquals(100, cursor.getCount()); } @@ -246,8 +243,8 @@ public void givenLoadingSecondPage_whenIGetCursor_thenIExpectProperOffsetAndCurs public void givenHasArchivedAndLoadingLastPage_whenIGetCursor_thenIExpectProperOffsetAndCursorCount() { // GIVEN setupThreadDatabaseCursors(0, 99); - when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(4); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(103); + when(threadTable.getPinnedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(4); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF, allChatsFolder)).thenReturn(103); when(threadTable.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12); testSubject.getTotalCount(); @@ -255,8 +252,8 @@ public void givenHasArchivedAndLoadingLastPage_whenIGetCursor_thenIExpectProperO Cursor cursor = testSubject.getCursor(50, 100); // THEN - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 50, 100); - verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 44, 100); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, true, 50, 100, allChatsFolder); + verify(threadTable).getUnarchivedConversationList(ConversationFilter.OFF, false, 46, 100, allChatsFolder); assertEquals(100, cursor.getCount()); cursor.moveToLast(); @@ -266,10 +263,10 @@ public void givenHasArchivedAndLoadingLastPage_whenIGetCursor_thenIExpectProperO @Test public void givenHasNoArchivedAndIsFiltered_whenIGetCursor_thenIExpectConversationFilterFooter() { // GIVEN - ConversationListDataSource.UnarchivedConversationListDataSource testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(ConversationFilter.UNREAD, false); + ConversationListDataSource.UnarchivedConversationListDataSource testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(allChatsFolder, ConversationFilter.UNREAD, false); setupThreadDatabaseCursors(0, 3); - when(threadTable.getPinnedConversationListCount(ConversationFilter.UNREAD)).thenReturn(0); - when(threadTable.getUnarchivedConversationListCount(ConversationFilter.UNREAD)).thenReturn(3); + when(threadTable.getPinnedConversationListCount(ConversationFilter.UNREAD, allChatsFolder)).thenReturn(0); + when(threadTable.getUnarchivedConversationListCount(ConversationFilter.UNREAD, allChatsFolder)).thenReturn(3); when(threadTable.getArchivedConversationListCount(ConversationFilter.UNREAD)).thenReturn(0); testSubject.getTotalCount(); @@ -292,7 +289,26 @@ private void setupThreadDatabaseCursors(int pinned, int unpinned) { Cursor unpinnedCursor = mock(Cursor.class); when(unpinnedCursor.getCount()).thenReturn(unpinned); - when(threadTable.getUnarchivedConversationList(any(), eq(true), anyLong(), anyLong())).thenReturn(pinnedCursor); - when(threadTable.getUnarchivedConversationList(any(), eq(false), anyLong(), anyLong())).thenReturn(unpinnedCursor); + when(threadTable.getUnarchivedConversationList(any(), eq(true), anyLong(), anyLong(), any())).thenReturn(pinnedCursor); + when(threadTable.getUnarchivedConversationList(any(), eq(false), anyLong(), anyLong(), any())).thenReturn(unpinnedCursor); + } + + private ChatFolderRecord setupAllChatsFolder() { + return new ChatFolderRecord( + 1, + "", + -1, + new ArrayList<>(), + new ArrayList<>(), + new HashSet<>(), + new HashSet<>(), + false, + false, + false, + false, + false, + ChatFolderRecord.FolderType.ALL, + 0 + ); } } \ No newline at end of file diff --git a/app/src/test/java/org/thoughtcrime/securesms/storage/CallLinkRecordProcessorTest.kt b/app/src/test/java/org/thoughtcrime/securesms/storage/CallLinkRecordProcessorTest.kt index 7de669e1cb..06823d3479 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/storage/CallLinkRecordProcessorTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/storage/CallLinkRecordProcessorTest.kt @@ -8,7 +8,6 @@ package org.thoughtcrime.securesms.storage import okio.ByteString.Companion.EMPTY import okio.ByteString.Companion.toByteString import org.junit.Assert.assertFalse -import org.junit.Assert.assertThrows import org.junit.BeforeClass import org.junit.Test import org.signal.core.util.logging.Log @@ -74,20 +73,6 @@ class CallLinkRecordProcessorTest { assertFalse(result) } - @Test - fun `Given a proto with both an admin pass key and a deletion timestamp, assert invalid`() { - // GIVEN - val proto = CallLinkRecord.Builder().apply { - rootKey = mockCredentials.linkKeyBytes.toByteString() - adminPasskey = mockCredentials.adminPassBytes!!.toByteString() - deletedAtTimestampMs = System.currentTimeMillis() - }.build() - - assertThrows(IllegalStateException::class.java) { - SignalCallLinkRecord(STORAGE_ID, proto) - } - } - @Test fun `Given a proto with neither an admin pass key nor a deletion timestamp, assert valid`() { // GIVEN diff --git a/core-ui/src/main/java/org/signal/core/ui/Dialogs.kt b/core-ui/src/main/java/org/signal/core/ui/Dialogs.kt index b0050b5b39..ce5ac68cce 100644 --- a/core-ui/src/main/java/org/signal/core/ui/Dialogs.kt +++ b/core-ui/src/main/java/org/signal/core/ui/Dialogs.kt @@ -75,6 +75,7 @@ object Dialogs { confirm: String, onConfirm: () -> Unit, onDismiss: () -> Unit, + onDismissRequest: () -> Unit = onDismiss, modifier: Modifier = Modifier, dismiss: String = NoDismiss, confirmColor: Color = Color.Unspecified, @@ -82,8 +83,14 @@ object Dialogs { properties: DialogProperties = DialogProperties() ) { androidx.compose.material3.AlertDialog( - onDismissRequest = onDismiss, - title = { Text(text = title) }, + onDismissRequest = onDismissRequest, + title = if (title.isNotEmpty()) { + { + Text(text = title) + } + } else { + null + }, text = { Text(text = body) }, confirmButton = { TextButton(onClick = { diff --git a/core-ui/src/main/java/org/signal/core/ui/ModifierExtensions.kt b/core-ui/src/main/java/org/signal/core/ui/ModifierExtensions.kt new file mode 100644 index 0000000000..507ede5cf2 --- /dev/null +++ b/core-ui/src/main/java/org/signal/core/ui/ModifierExtensions.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.ui + +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.unit.Dp + +/** + * Applies sensible horizontal padding to the given component. + */ +@Composable +fun Modifier.horizontalGutters( + gutterSize: Dp = dimensionResource(R.dimen.core_ui__gutter) +): Modifier { + return padding(horizontal = gutterSize) +} diff --git a/core-ui/src/main/java/org/signal/core/ui/copied/androidx/compose/DragAndDrop.kt b/core-ui/src/main/java/org/signal/core/ui/copied/androidx/compose/DragAndDrop.kt new file mode 100644 index 0000000000..053fd0ff9c --- /dev/null +++ b/core-ui/src/main/java/org/signal/core/ui/copied/androidx/compose/DragAndDrop.kt @@ -0,0 +1,185 @@ +package org.signal.core.ui.copied.androidx.compose + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.spring +import androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress +import androidx.compose.foundation.gestures.scrollBy +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.lazy.LazyItemScope +import androidx.compose.foundation.lazy.LazyListItemInfo +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.zIndex +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.launch + +/** + * From AndroidX Compose demo + * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt + * + * Allows for dragging and dropping to reorder within lazy columns + */ +@Composable +fun rememberDragDropState(lazyListState: LazyListState, onMove: (Int, Int) -> Unit): DragDropState { + val scope = rememberCoroutineScope() + val state = + remember(lazyListState) { + DragDropState(state = lazyListState, onMove = onMove, scope = scope) + } + LaunchedEffect(state) { + while (true) { + val diff = state.scrollChannel.receive() + lazyListState.scrollBy(diff) + } + } + return state +} + +class DragDropState +internal constructor( + private val state: LazyListState, + private val scope: CoroutineScope, + private val onMove: (Int, Int) -> Unit +) { + var draggingItemIndex by mutableStateOf(null) + private set + + internal val scrollChannel = Channel() + + private var draggingItemDraggedDelta by mutableFloatStateOf(0f) + private var draggingItemInitialOffset by mutableIntStateOf(0) + internal val draggingItemOffset: Float + get() = + draggingItemLayoutInfo?.let { item -> + draggingItemInitialOffset + draggingItemDraggedDelta - item.offset + } ?: 0f + + private val draggingItemLayoutInfo: LazyListItemInfo? + get() = state.layoutInfo.visibleItemsInfo.firstOrNull { it.index == draggingItemIndex } + + internal var previousIndexOfDraggedItem by mutableStateOf(null) + private set + + internal var previousItemOffset = Animatable(0f) + private set + + internal fun onDragStart(offset: Offset) { + state.layoutInfo.visibleItemsInfo + .firstOrNull { item -> offset.y.toInt() in item.offset..(item.offset + item.size) } + ?.also { + draggingItemIndex = it.index + draggingItemInitialOffset = it.offset + } + } + + internal fun onDragInterrupted() { + if (draggingItemIndex != null) { + previousIndexOfDraggedItem = draggingItemIndex + val startOffset = draggingItemOffset + scope.launch { + previousItemOffset.snapTo(startOffset) + previousItemOffset.animateTo( + 0f, + spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = 1f) + ) + previousIndexOfDraggedItem = null + } + } + draggingItemDraggedDelta = 0f + draggingItemIndex = null + draggingItemInitialOffset = 0 + } + + internal fun onDrag(offset: Offset) { + draggingItemDraggedDelta += offset.y + + val draggingItem = draggingItemLayoutInfo ?: return + val startOffset = draggingItem.offset + draggingItemOffset + val endOffset = startOffset + draggingItem.size + val middleOffset = startOffset + (endOffset - startOffset) / 2f + + val targetItem = + state.layoutInfo.visibleItemsInfo.find { item -> + middleOffset.toInt() in item.offset..item.offsetEnd && + draggingItem.index != item.index + } + if (targetItem != null) { + if ( + draggingItem.index == state.firstVisibleItemIndex || + targetItem.index == state.firstVisibleItemIndex + ) { + state.requestScrollToItem( + state.firstVisibleItemIndex, + state.firstVisibleItemScrollOffset + ) + } + onMove.invoke(draggingItem.index, targetItem.index) + draggingItemIndex = targetItem.index + } else { + val overscroll = + when { + draggingItemDraggedDelta > 0 -> + (endOffset - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f) + draggingItemDraggedDelta < 0 -> + (startOffset - state.layoutInfo.viewportStartOffset).coerceAtMost(0f) + else -> 0f + } + if (overscroll != 0f) { + scrollChannel.trySend(overscroll) + } + } + } + + private val LazyListItemInfo.offsetEnd: Int + get() = this.offset + this.size +} + +fun Modifier.dragContainer(dragDropState: DragDropState): Modifier { + return pointerInput(dragDropState) { + detectDragGesturesAfterLongPress( + onDrag = { change, offset -> + change.consume() + dragDropState.onDrag(offset = offset) + }, + onDragStart = { offset -> dragDropState.onDragStart(offset) }, + onDragEnd = { dragDropState.onDragInterrupted() }, + onDragCancel = { dragDropState.onDragInterrupted() } + ) + } +} + +@Composable +fun LazyItemScope.DraggableItem( + dragDropState: DragDropState, + index: Int, + modifier: Modifier = Modifier, + content: @Composable ColumnScope.(isDragging: Boolean) -> Unit +) { + val dragging = index == dragDropState.draggingItemIndex + val draggingModifier = + if (dragging) { + Modifier.zIndex(1f).graphicsLayer { translationY = dragDropState.draggingItemOffset } + } else if (index == dragDropState.previousIndexOfDraggedItem) { + Modifier.zIndex(1f).graphicsLayer { + translationY = dragDropState.previousItemOffset.value + } + } else { + Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null) + } + Column(modifier = modifier.then(draggingModifier)) { content(dragging) } +} diff --git a/core-util-jvm/src/main/java/org/signal/core/util/ProtoExtensions.kt b/core-util-jvm/src/main/java/org/signal/core/util/ProtoExtensions.kt index 2bd6cf61d1..5f8b6e3bae 100644 --- a/core-util-jvm/src/main/java/org/signal/core/util/ProtoExtensions.kt +++ b/core-util-jvm/src/main/java/org/signal/core/util/ProtoExtensions.kt @@ -20,6 +20,10 @@ import java.util.LinkedList private const val TAG = "ProtoExtension" +fun ByteString?.isEmpty(): Boolean { + return this == null || this.size == 0 +} + fun ByteString?.isNotEmpty(): Boolean { return this != null && this.size > 0 } diff --git a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt index 7d53d6c0b0..a68afc5d12 100644 --- a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt +++ b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt @@ -6,6 +6,12 @@ import android.database.sqlite.SQLiteDatabase import androidx.core.content.contentValuesOf import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteQueryBuilder +import org.signal.core.util.SqlUtil.ForeignKeyViolation +import org.signal.core.util.logging.Log +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +private val TAG = "SQLiteDatabaseExtensions" /** * Begins a transaction on the `this` database, runs the provided [block] providing the `this` value as it's argument @@ -46,7 +52,11 @@ fun SupportSQLiteDatabase.getAllTables(): List { * Returns a list of objects that represent the table definitions in the database. Basically the table name and then the SQL that was used to create it. */ fun SupportSQLiteDatabase.getAllTableDefinitions(): List { - return this.query("SELECT name, sql FROM sqlite_schema WHERE type = 'table' AND sql NOT NULL AND name != 'sqlite_sequence'") + return this + .select("name", "sql") + .from("sqlite_schema") + .where("type = ? AND sql NOT NULL AND name != ?", "table", "sqlite_sequence") + .run() .readToList { cursor -> CreateStatement( name = cursor.requireNonNullString("name"), @@ -61,7 +71,11 @@ fun SupportSQLiteDatabase.getAllTableDefinitions(): List { * Returns a list of objects that represent the index definitions in the database. Basically the index name and then the SQL that was used to create it. */ fun SupportSQLiteDatabase.getAllIndexDefinitions(): List { - return this.query("SELECT name, sql FROM sqlite_schema WHERE type = 'index' AND sql NOT NULL") + return this + .select("name", "sql") + .from("sqlite_schema") + .where("type = ? AND sql NOT NULL", "index") + .run() .readToList { cursor -> CreateStatement( name = cursor.requireNonNullString("name"), @@ -71,6 +85,24 @@ fun SupportSQLiteDatabase.getAllIndexDefinitions(): List { .sortedBy { it.name } } +/** + * Retrieves the names of all triggers, sorted alphabetically. + */ +fun SupportSQLiteDatabase.getAllTriggerDefinitions(): List { + return this + .select("name", "sql") + .from("sqlite_schema") + .where("type = ? AND sql NOT NULL", "trigger") + .run() + .readToList { + CreateStatement( + name = it.requireNonNullString("name"), + statement = it.requireNonNullString("sql") + ) + } + .sortedBy { it.name } +} + fun SupportSQLiteDatabase.getForeignKeys(): List { return SqlUtil.getAllTables(this) .map { table -> @@ -93,6 +125,24 @@ fun SupportSQLiteDatabase.areForeignKeyConstraintsEnabled(): Boolean { } } +/** + * Provides a list of all foreign key violations present. + * If a [targetTable] is specified, results will be limited to that table specifically. + * Otherwise, the check will be performed across all tables. + */ +@JvmOverloads +fun SupportSQLiteDatabase.getForeignKeyViolations(targetTable: String? = null): List { + return SqlUtil.getForeignKeyViolations(this, targetTable) +} + +/** + * For tables that have an autoincrementing primary key, this will reset the key to start back at 1. + * IMPORTANT: This is quite dangerous! Only do this if you're effectively resetting the entire database. + */ +fun SupportSQLiteDatabase.resetAutoIncrementValue(targetTable: String) { + SqlUtil.resetAutoIncrementValue(this, targetTable) +} + /** * Does a full WAL checkpoint (TRUNCATE mode, where the log is for sure flushed and the log is zero'd out). * Will try up to [maxAttempts] times. Can technically fail if the database is too active and the checkpoint @@ -132,6 +182,22 @@ fun SupportSQLiteDatabase.getIndexes(): List { } } +fun SupportSQLiteDatabase.forceForeignKeyConstraintsEnabled(enabled: Boolean, timeout: Duration = 10.seconds) { + val startTime = System.currentTimeMillis() + while (true) { + try { + this.setForeignKeyConstraintsEnabled(enabled) + break + } catch (e: IllegalStateException) { + if (System.currentTimeMillis() - startTime > timeout.inWholeMilliseconds) { + throw IllegalStateException("Failed to force foreign keys to '$enabled' within the timeout of $timeout", e) + } + Log.w(TAG, "Failed to set foreign keys because we're in a transaction. Waiting 100ms then trying again.") + ThreadUtil.sleep(100) + } + } +} + /** * Checks if a row exists that matches the query. */ diff --git a/dependencies.gradle.kts b/dependencies.gradle.kts index 4d75ceff97..3826aa01bc 100644 --- a/dependencies.gradle.kts +++ b/dependencies.gradle.kts @@ -127,7 +127,7 @@ dependencyResolutionManagement { library("libsignal-client", "org.signal", "libsignal-client").versionRef("libsignal-client") library("libsignal-android", "org.signal", "libsignal-android").versionRef("libsignal-client") library("signal-aesgcmprovider", "org.signal:aesgcmprovider:0.0.3") - library("molly-ringrtc", "im.molly:ringrtc-android:2.48.0-1") + library("molly-ringrtc", "im.molly:ringrtc-android:2.48.1-1") library("signal-android-database-sqlcipher", "org.signal:sqlcipher-android:4.6.0-S1") // MOLLY diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 8363628740..8eec38ac9d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6936,6 +6936,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 7789205fa4..d7bfced9fa 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -210,11 +210,6 @@ public void setGcmId(Optional gcmRegistrationId) throws IOException { } } - public Single> checkBackupAuthCredentials(@Nonnull String e164, @Nonnull List usernamePasswords) { - - return pushServiceSocket.checkSvr2AuthCredentials(new BackupAuthCheckRequest(e164, usernamePasswords), DefaultResponseMapper.getDefault(BackupV2AuthCheckResponse.class)); - } - /** * Request a push challenge. A number will be pushed to the GCM (FCM) id. This can then be used * during SMS/call requests to bypass the CAPTCHA. @@ -227,109 +222,6 @@ public void requestRegistrationPushChallenge(String sessionId, String gcmRegistr pushServiceSocket.requestPushChallenge(sessionId, gcmRegistrationId); } - public ServiceResponse createRegistrationSession(@Nullable String fcmToken, @Nullable String mcc, @Nullable String mnc) { - try { - final RegistrationSessionMetadataResponse response = pushServiceSocket.createVerificationSession(fcmToken, mcc, mnc); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - public ServiceResponse getRegistrationSession(String sessionId) { - try { - final RegistrationSessionMetadataResponse response = pushServiceSocket.getSessionStatus(sessionId); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - public ServiceResponse submitPushChallengeToken(String sessionId, String pushChallengeToken) { - try { - final RegistrationSessionMetadataResponse response = pushServiceSocket.patchVerificationSession(sessionId, null, null, null, null, pushChallengeToken); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - public ServiceResponse submitCaptchaToken(String sessionId, @Nullable String captchaToken) { - try { - final RegistrationSessionMetadataResponse response = pushServiceSocket.patchVerificationSession(sessionId, null, null, null, captchaToken, null); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - /** - * Request an SMS verification code. On success, the server will send - * an SMS verification code to this Signal user. - * - * @param androidSmsRetrieverSupported - */ - public ServiceResponse requestSmsVerificationCode(String sessionId, Locale locale, boolean androidSmsRetrieverSupported) { - try { - final RegistrationSessionMetadataResponse response = pushServiceSocket.requestVerificationCode(sessionId, locale, androidSmsRetrieverSupported, PushServiceSocket.VerificationCodeTransport.SMS); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - /** - * Request a Voice verification code. On success, the server will - * make a voice call to this Signal user. - * - * @param locale - */ - public ServiceResponse requestVoiceVerificationCode(String sessionId, Locale locale, boolean androidSmsRetrieverSupported) { - try { - final RegistrationSessionMetadataResponse response = pushServiceSocket.requestVerificationCode(sessionId, locale, androidSmsRetrieverSupported, PushServiceSocket.VerificationCodeTransport.VOICE); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - /** - * Verify a Signal Service account with a received SMS or voice verification code. - * - * @param verificationCode The verification code received via SMS or Voice - * (see {@link #requestSmsVerificationCode} and - * {@link #requestVoiceVerificationCode}). - * @param sessionId The ID of the current registration session. - * @return The UUID of the user that was registered. - * @throws IOException for various HTTP and networking errors - */ - public ServiceResponse verifyAccount(@Nonnull String verificationCode, @Nonnull String sessionId) { - try { - RegistrationSessionMetadataResponse response = pushServiceSocket.submitVerificationCode(sessionId, verificationCode); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - public @Nonnull ServiceResponse registerAccount(@Nullable String sessionId, @Nullable String recoveryPassword, AccountAttributes attributes, PreKeyCollection aciPreKeys, PreKeyCollection pniPreKeys, String fcmToken, boolean skipDeviceTransfer) { - try { - VerifyAccountResponse response = pushServiceSocket.submitRegistrationRequest(sessionId, recoveryPassword, attributes, aciPreKeys, pniPreKeys, fcmToken, skipDeviceTransfer); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - - public @Nonnull ServiceResponse changeNumber(@Nonnull ChangePhoneNumberRequest changePhoneNumberRequest) { - try { - VerifyAccountResponse response = this.pushServiceSocket.changeNumber(changePhoneNumberRequest); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - /** * Refresh account attributes with server. * @@ -772,15 +664,6 @@ public void addDevice(String deviceIdentifier, this.pushServiceSocket.sendProvisioningMessage(deviceIdentifier, ciphertext); } - public ServiceResponse distributePniKeys(PniKeyDistributionRequest request) { - try { - VerifyAccountResponse response = this.pushServiceSocket.distributePniKeys(request); - return ServiceResponse.forResult(response, 200, null); - } catch (IOException e) { - return ServiceResponse.forUnknownError(e); - } - } - public List getDevices() throws IOException { return this.pushServiceSocket.getDevices(); } @@ -947,19 +830,6 @@ public void cancelInFlightRequests() { this.pushServiceSocket.cancelInFlightRequests(); } - private String createDirectoryServerToken(String e164number, boolean urlSafe) { - try { - MessageDigest digest = MessageDigest.getInstance("SHA1"); - byte[] token = Util.trim(digest.digest(e164number.getBytes()), 10); - String encoded = Base64.encodeWithoutPadding(token); - - if (urlSafe) return encoded.replace('+', '-').replace('/', '_'); - else return encoded; - } catch (NoSuchAlgorithmException e) { - throw new AssertionError(e); - } - } - /** * Helper class for holding the returns of getNewDeviceRegistration() */ diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java index 5833d512c7..8e9f9737fc 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collections; import java.util.List; public class TurnServerInfo { @@ -22,6 +23,9 @@ public class TurnServerInfo { @JsonProperty private List urlsWithIps; + @JsonProperty + private List iceServers; + public String getUsername() { return username; } @@ -42,4 +46,8 @@ public List getUrls() { public List getUrlsWithIps() { return urlsWithIps; } + + public List getIceServers() { + return (iceServers != null) ? iceServers : Collections.emptyList(); + } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/storage/SignalCallLinkRecord.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/storage/SignalCallLinkRecord.kt index f937a6798e..07668e6968 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/storage/SignalCallLinkRecord.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/storage/SignalCallLinkRecord.kt @@ -19,12 +19,6 @@ class SignalCallLinkRecord(private val id: StorageId, private val proto: CallLin val adminPassKey: ByteArray = proto.adminPasskey.toByteArray() val deletionTimestamp: Long = proto.deletedAtTimestampMs - init { - if (deletionTimestamp != 0L && adminPassKey.isNotEmpty()) { - throw IllegalStateException("Cannot have nonzero deletion timestamp ($deletionTimestamp) and admin passkey!") - } - } - fun toProto(): CallLinkRecord { return proto } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 5eceb27783..c5b06540a9 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -727,7 +727,8 @@ public void removeDevice(long deviceId) throws IOException { } public void sendProvisioningMessage(String destination, byte[] body) throws IOException { - makeServiceRequest(String.format(PROVISIONING_MESSAGE_PATH, destination), "PUT", + //noinspection CharsetObjectCanBeUsed + makeServiceRequest(String.format(PROVISIONING_MESSAGE_PATH, URLEncoder.encode(destination, StandardCharsets.UTF_8.name())), "PUT", JsonUtil.toJson(new ProvisioningMessage(Base64.encodeWithPadding(body)))); }