diff --git a/app/build.gradle b/app/build.gradle
index 6a6c53a5e4..7f537a9990 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,8 +15,8 @@ configurations.configureEach {
exclude module: "commons-logging"
}
-def canonicalVersionCode = 382
-def canonicalVersionName = "1.20.0"
+def canonicalVersionCode = 383
+def canonicalVersionName = "1.20.1"
def postFixSize = 10
def abiPostFix = ['armeabi-v7a' : 1,
@@ -59,7 +59,7 @@ android {
splits {
abi {
- enable true
+ enable !project.hasProperty('huawei') // huawei builds do not need the split variants
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk true
@@ -122,6 +122,25 @@ android {
}
}
+ signingConfigs {
+ play {
+ if (project.hasProperty('SESSION_STORE_FILE')) {
+ storeFile file(SESSION_STORE_FILE)
+ storePassword SESSION_STORE_PASSWORD
+ keyAlias SESSION_KEY_ALIAS
+ keyPassword SESSION_KEY_PASSWORD
+ }
+ }
+ huawei {
+ if (project.hasProperty('SESSION_HUAWEI_STORE_FILE')) {
+ storeFile file(SESSION_HUAWEI_STORE_FILE)
+ storePassword SESSION_HUAWEI_STORE_PASSWORD
+ keyAlias SESSION_HUAWEI_KEY_ALIAS
+ keyPassword SESSION_HUAWEI_KEY_PASSWORD
+ }
+ }
+ }
+
flavorDimensions "distribution"
productFlavors {
play {
@@ -133,6 +152,7 @@ android {
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.ANDROID"
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"\"'
+ signingConfig signingConfigs.play
}
huawei {
@@ -142,6 +162,7 @@ android {
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.HUAWEI"
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"_HUAWEI\"'
+ signingConfig signingConfigs.huawei
}
website {
@@ -159,8 +180,10 @@ android {
def abiName = output.getFilter("ABI") ?: 'universal'
def postFix = abiPostFix.get(abiName, 0)
+ def flavour = (variant.flavorName == 'huawei') ? "-huawei" : ""
+
if (postFix >= postFixSize) throw new AssertionError("postFix is too large")
- output.outputFileName = output.outputFileName = "session-${variant.versionName}-${abiName}.apk"
+ output.outputFileName = output.outputFileName = "session-${variant.versionName}-${abiName}${flavour}.apk"
output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/SessionDialogBuilder.kt b/app/src/main/java/org/thoughtcrime/securesms/SessionDialogBuilder.kt
index 9c6e23c3e0..e948f9da3c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/SessionDialogBuilder.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/SessionDialogBuilder.kt
@@ -62,7 +62,10 @@ class SessionDialogBuilder(val context: Context) {
// Main title entry point
fun title(text: String?) {
- text(text, R.style.TextAppearance_Session_Dialog_Title) { setPadding(dp20, 0, dp20, 0) }
+ text(
+ text = text,
+ qaTag = context.getString(R.string.AccessibilityId_modalTitle),
+ style = R.style.TextAppearance_Session_Dialog_Title) { setPadding(dp20, 0, dp20, 0) }
}
// Convenience assessor for title that takes a string resource
@@ -74,18 +77,24 @@ class SessionDialogBuilder(val context: Context) {
fun text(@StringRes id: Int, style: Int? = null) = text(context.getString(id), style)
fun text(text: CharSequence?, @StyleRes style: Int? = null) {
- text(text, style) {
+ text(text = text, style = style) {
layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
.apply { updateMargins(dp40, 0, dp40, 0) }
}
}
- private fun text(text: CharSequence?, @StyleRes style: Int? = null, modify: TextView.() -> Unit) {
+ private fun text(
+ text: CharSequence?,
+ qaTag: String = context.getString(R.string.AccessibilityId_modalMessage),
+ @StyleRes style: Int? = null,
+ modify: TextView.() -> Unit
+ ) {
text ?: return
TextView(context, null, 0, style ?: R.style.TextAppearance_Session_Dialog_Message)
.apply {
setText(text)
textAlignment = View.TEXT_ALIGNMENT_CENTER
+ contentDescription = qaTag
modify()
}.let(topView::addView)
@@ -166,7 +175,7 @@ class SessionDialogBuilder(val context: Context) {
textColor?.let{
setTextColor(it)
}
- contentDescription = resources.getString(contentDescriptionRes)
+ contentDescription = resources.getString(text) // QA now wants the qa tag to mtch the button's text
layoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, dp60, 1f)
setOnClickListener {
listener.invoke()
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt
index 8b3d0b8c3e..fa0aede9e7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt
@@ -38,7 +38,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.content.ContextCompat
-import androidx.core.view.drawToBitmap
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
@@ -60,6 +59,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
@@ -192,6 +192,7 @@ import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.NetworkUtils
import org.thoughtcrime.securesms.util.SaveAttachmentTask
+import org.thoughtcrime.securesms.util.drawToBitmap
import org.thoughtcrime.securesms.util.isScrolledToBottom
import org.thoughtcrime.securesms.util.isScrolledToWithin30dpOfBottom
import org.thoughtcrime.securesms.util.push
@@ -750,9 +751,10 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
private fun restoreDraftIfNeeded() {
val mediaURI = intent.data
val mediaType = AttachmentManager.MediaType.from(intent.type)
+ val mimeType = MediaUtil.getMimeType(this, mediaURI)
if (mediaURI != null && mediaType != null) {
- if (AttachmentManager.MediaType.IMAGE == mediaType || AttachmentManager.MediaType.GIF == mediaType || AttachmentManager.MediaType.VIDEO == mediaType) {
- val media = Media(mediaURI, MediaUtil.getMimeType(this, mediaURI)!!, 0, 0, 0, 0, Optional.absent(), Optional.absent())
+ if (mimeType != null && (AttachmentManager.MediaType.IMAGE == mediaType || AttachmentManager.MediaType.GIF == mediaType || AttachmentManager.MediaType.VIDEO == mediaType)) {
+ val media = Media(mediaURI, mimeType, 0, 0, 0, 0, Optional.absent(), Optional.absent())
startActivityForResult(MediaSendActivity.buildEditorIntent(this, listOf( media ), viewModel.recipient!!, ""), PICK_FROM_LIBRARY)
return
} else {
@@ -829,7 +831,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
if (shouldShowLegacy) {
val txt = Phrase.from(applicationContext, R.string.disappearingMessagesLegacy)
- .put(NAME_KEY, legacyRecipient!!.name)
+ .put(NAME_KEY, legacyRecipient!!.toShortString())
.format()
binding.outdatedBannerTextView.text = txt
}
@@ -1248,7 +1250,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
val name = if (recipient.isClosedGroupV2Recipient && invitingAdmin != null) {
invitingAdmin.getSearchName()
} else {
- recipient.name
+ recipient.toShortString()
}
showSessionDialog {
@@ -1314,7 +1316,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
title(R.string.blockUnblock)
text(
Phrase.from(context, R.string.blockUnblockName)
- .put(NAME_KEY, recipient.name)
+ .put(NAME_KEY, recipient.toShortString())
.format()
)
dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) { viewModel.unblock() }
@@ -1793,10 +1795,19 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
binding.inputBar.text = ""
binding.inputBar.cancelQuoteDraft()
binding.inputBar.cancelLinkPreviewDraft()
- // Put the message in the database
- message.id = smsDb.insertMessageOutbox(viewModel.threadId, outgoingTextMessage, false, message.sentTimestamp!!, null, true)
- // Send it
- MessageSender.send(message, recipient.address)
+ lifecycleScope.launch(Dispatchers.Default) {
+ // Put the message in the database
+ message.id = smsDb.insertMessageOutbox(
+ viewModel.threadId,
+ outgoingTextMessage,
+ false,
+ message.sentTimestamp!!,
+ null,
+ true
+ )
+ // Send it
+ MessageSender.send(message, recipient.address)
+ }
// Send a typing stopped message
ApplicationContext.getInstance(this).typingStatusSender.onTypingStopped(viewModel.threadId)
return Pair(recipient.address, sentTimestamp)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java
index 7a82a34ebb..7601a7ef89 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java
@@ -151,14 +151,17 @@ public class ThreadRecord extends DisplayRecord {
.format().toString();
} else if (MmsSmsColumns.Types.isMessageRequestResponse(type)) {
- if (lastMessage.getRecipient().getAddress().serialize().equals(
- TextSecurePreferences.getLocalNumber(context))) {
- return UtilKt.getSubbedCharSequence(
- context,
- R.string.messageRequestYouHaveAccepted,
- new Pair<>(NAME_KEY, getName())
- );
+ try {
+ if (lastMessage.getRecipient().getAddress().serialize().equals(
+ TextSecurePreferences.getLocalNumber(context))) {
+ return UtilKt.getSubbedCharSequence(
+ context,
+ R.string.messageRequestYouHaveAccepted,
+ new Pair<>(NAME_KEY, getName())
+ );
+ }
}
+ catch (Exception e){} // the above can throw a null exception
return context.getString(R.string.messageRequestsAccepted);
} else if (getCount() == 0) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt
index 38a01a9db4..3ae656fa60 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt
@@ -74,12 +74,10 @@ fun DebugMenu(
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.cancel),
- contentDescription = GetString(R.string.cancel),
onClick = { sendCommand(HideEnvironmentWarningDialog) }
),
DialogButtonModel(
text = GetString(R.string.ok),
- contentDescription = GetString(R.string.ok),
onClick = { sendCommand(ChangeEnvironment) }
)
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt
index f48bc02174..3978e22f28 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt
@@ -66,6 +66,10 @@ import org.thoughtcrime.securesms.home.search.GlobalSearchInputLayout
import org.thoughtcrime.securesms.home.search.GlobalSearchResult
import org.thoughtcrime.securesms.home.search.GlobalSearchViewModel
import org.thoughtcrime.securesms.messagerequests.MessageRequestsActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.RequestManager
+import org.session.libsession.utilities.truncateIdForDisplay
+import org.thoughtcrime.securesms.notifications.PushRegistry
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.preferences.SettingsActivity
import org.thoughtcrime.securesms.recoverypassword.RecoveryPasswordActivity
@@ -498,7 +502,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
showSessionDialog {
title(R.string.block)
text(Phrase.from(context, R.string.blockDescription)
- .put(NAME_KEY, thread.recipient.name)
+ .put(NAME_KEY, thread.recipient.toShortString())
.format())
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
lifecycleScope.launch(Dispatchers.Default) {
@@ -509,7 +513,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
}
}
// Block confirmation toast added as per SS-64
- val txt = Phrase.from(context, R.string.blockBlockedUser).put(NAME_KEY, thread.recipient.name).format().toString()
+ val txt = Phrase.from(context, R.string.blockBlockedUser).put(NAME_KEY, thread.recipient.toShortString()).format().toString()
Toast.makeText(context, txt, Toast.LENGTH_LONG).show()
}
cancelButton()
@@ -519,7 +523,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
private fun unblockConversation(thread: ThreadRecord) {
showSessionDialog {
title(R.string.blockUnblock)
- text(Phrase.from(context, R.string.blockUnblockName).put(NAME_KEY, thread.recipient.name).format())
+ text(Phrase.from(context, R.string.blockUnblockName).put(NAME_KEY, thread.recipient.toShortString()).format())
dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) {
lifecycleScope.launch(Dispatchers.Default) {
storage.setBlocked(listOf(thread.recipient), false)
@@ -597,28 +601,40 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
var positiveButtonId: Int = R.string.yes
var negativeButtonId: Int = R.string.no
- if (recipient.isCommunityRecipient) {
- title =
- if (recipient.isCommunityRecipient) getString(R.string.communityLeave) else getString(
- R.string.groupLeave
- )
- message = Phrase.from(this.applicationContext, R.string.groupLeaveDescription)
- .put(GROUP_NAME_KEY, recipient.name.orEmpty())
- .format()
- }
- // If this is a 1-on-1 conversation
- else if (recipient.name != null) {
- title = getString(R.string.conversationsDelete)
- message = Phrase.from(this.applicationContext, R.string.conversationsDeleteDescription)
- .put(NAME_KEY, recipient.name)
- .format()
- }
- else {
- // If not group-related and we don't have a recipient name then this must be our Note to Self conversation
- title = getString(R.string.clearMessages)
- message = getString(R.string.clearMessagesNoteToSelfDescription)
- positiveButtonId = R.string.clear
+ if (recipient.isGroupRecipient) {
+ val group = groupDatabase.getGroup(recipient.address.toString()).orNull()
+
+ // If you are an admin of this group you can delete it
+ if (group != null && group.admins.map { it.toString() }.contains(textSecurePreferences.getLocalNumber())) {
+ title = getString(R.string.groupLeave)
+ message = Phrase.from(this.applicationContext, R.string.groupDeleteDescription)
+ .put(GROUP_NAME_KEY, group.title)
+ .format()
+ } else {
+ // Otherwise this is either a community, or it's a group you're not an admin of
+ title = if (recipient.isCommunityRecipient) getString(R.string.communityLeave) else getString(R.string.groupLeave)
+ message = Phrase.from(this.applicationContext, R.string.groupLeaveDescription)
+ .put(GROUP_NAME_KEY, group.title)
+ .format()
+ }
+
+ positiveButtonId = R.string.leave
negativeButtonId = R.string.cancel
+ } else {
+ // If this is a 1-on-1 conversation
+ if (recipient.name != null) {
+ title = getString(R.string.conversationsDelete)
+ message = Phrase.from(this.applicationContext, R.string.conversationsDeleteDescription)
+ .put(NAME_KEY, recipient.toShortString())
+ .format()
+ }
+ else {
+ // If not group-related and we don't have a recipient name then this must be our Note to Self conversation
+ title = getString(R.string.clearMessages)
+ message = getString(R.string.clearMessagesNoteToSelfDescription)
+ positiveButtonId = R.string.clear
+ negativeButtonId = R.string.cancel
+ }
}
showSessionDialog {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchViewModel.kt
index 4a25556a42..3e99134506 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchViewModel.kt
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.home.search
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.channels.BufferOverflow
@@ -13,11 +14,13 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.launch
import kotlinx.coroutines.plus
+import kotlinx.coroutines.withContext
import org.thoughtcrime.securesms.search.SearchRepository
import org.thoughtcrime.securesms.search.model.SearchResult
import javax.inject.Inject
@@ -38,9 +41,14 @@ class GlobalSearchViewModel @Inject constructor(
.buffer(onBufferOverflow = BufferOverflow.DROP_OLDEST)
.mapLatest { query ->
if (query.trim().isEmpty()) {
- // searching for 05 as contactDb#getAllContacts was not returning contacts
- // without a nickname/name who haven't approved us.
- GlobalSearchResult(query.toString(), searchRepository.queryContacts("05").first.toList())
+ withContext(Dispatchers.Default) {
+ // searching for 05 as contactDb#getAllContacts was not returning contacts
+ // without a nickname/name who haven't approved us.
+ GlobalSearchResult(
+ query.toString(),
+ searchRepository.queryContacts("05").first.toList()
+ )
+ }
} else {
// User input delay in case we get a new query within a few hundred ms this
// coroutine will be cancelled and the expensive query will not be run.
diff --git a/app/src/main/java/org/thoughtcrime/securesms/media/MediaOverviewScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/media/MediaOverviewScreen.kt
index 34ccc1c1c6..c6c6ca2e41 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/media/MediaOverviewScreen.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/media/MediaOverviewScreen.kt
@@ -231,8 +231,8 @@ private fun SaveAttachmentWarningDialog(
title = context.getString(R.string.warning),
text = context.resources.getString(R.string.attachmentsWarning),
buttons = listOf(
- DialogButtonModel(GetString(R.string.save), GetString(R.string.AccessibilityId_saveAttachment), color = LocalColors.current.danger, onClick = onAccepted),
- DialogButtonModel(GetString(android.R.string.cancel), GetString(R.string.AccessibilityId_cancel), dismissOnClick = true)
+ DialogButtonModel(GetString(R.string.save), color = LocalColors.current.danger, onClick = onAccepted),
+ DialogButtonModel(GetString(android.R.string.cancel), dismissOnClick = true)
)
)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsActivity.kt
index 279b06d387..9f1360815a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsActivity.kt
@@ -92,7 +92,7 @@ class MessageRequestsActivity : PassphraseRequiredActionBarActivity(), Conversat
showSessionDialog {
title(R.string.block)
text(Phrase.from(context, R.string.blockDescription)
- .put(NAME_KEY, thread.recipient.name)
+ .put(NAME_KEY, thread.recipient.toShortString())
.format())
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
doBlock()
diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/landing/Landing.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/landing/Landing.kt
index aab1421185..14eb2dbe06 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/landing/Landing.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/landing/Landing.kt
@@ -85,12 +85,10 @@ internal fun LandingScreen(
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.onboardingTos),
- contentDescription = GetString(R.string.AccessibilityId_onboardingTos),
onClick = openTerms
),
DialogButtonModel(
text = GetString(R.string.onboardingPrivacy),
- contentDescription = GetString(R.string.AccessibilityId_onboardingPrivacy),
onClick = openPrivacyPolicy
)
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt
index b03857ed95..7aff840b0a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt
@@ -566,13 +566,11 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.save),
- contentDescription = GetString(R.string.AccessibilityId_save),
enabled = state is TempAvatar,
onClick = saveAvatar
),
DialogButtonModel(
text = GetString(R.string.remove),
- contentDescription = GetString(R.string.AccessibilityId_remove),
color = LocalColors.current.danger,
enabled = state is UserAvatar || // can remove is the user has an avatar set
(state is TempAvatar && state.hasAvatar),
diff --git a/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPassword.kt b/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPassword.kt
index 4bc2724d6d..56ca84efee 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPassword.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPassword.kt
@@ -26,7 +26,10 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import network.loki.messenger.R
+import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.Cell
+import org.thoughtcrime.securesms.ui.DialogButtonModel
+import org.thoughtcrime.securesms.ui.GetString
import org.thoughtcrime.securesms.ui.SessionShieldIcon
import org.thoughtcrime.securesms.ui.components.QrImage
import org.thoughtcrime.securesms.ui.components.SlimOutlineButton
@@ -45,8 +48,8 @@ import org.thoughtcrime.securesms.ui.theme.monospace
internal fun RecoveryPasswordScreen(
mnemonic: String,
seed: String? = null,
- copyMnemonic:() -> Unit = {},
- onHide:() -> Unit = {}
+ confirmHideRecovery: () -> Unit,
+ copyMnemonic:() -> Unit = {}
) {
Column(
verticalArrangement = Arrangement.spacedBy(LocalDimensions.current.smallSpacing),
@@ -57,7 +60,7 @@ internal fun RecoveryPasswordScreen(
.padding(horizontal = LocalDimensions.current.spacing)
) {
RecoveryPasswordCell(mnemonic, seed, copyMnemonic)
- HideRecoveryPasswordCell(onHide)
+ HideRecoveryPasswordCell(confirmHideRecovery = confirmHideRecovery)
}
}
@@ -151,7 +154,12 @@ private fun RecoveryPassword(mnemonic: String) {
}
@Composable
-private fun HideRecoveryPasswordCell(onHide: () -> Unit = {}) {
+private fun HideRecoveryPasswordCell(
+ confirmHideRecovery:() -> Unit
+) {
+ var showHideRecoveryDialog by remember { mutableStateOf(false) }
+ var showHideRecoveryConfirmationDialog by remember { mutableStateOf(false) }
+
Cell {
Row(
modifier = Modifier.padding(LocalDimensions.current.smallSpacing)
@@ -176,10 +184,44 @@ private fun HideRecoveryPasswordCell(onHide: () -> Unit = {}) {
.align(Alignment.CenterVertically)
.contentDescription(R.string.AccessibilityId_recoveryPasswordHideRecoveryPassword),
color = LocalColors.current.danger,
- onClick = onHide
+ onClick = { showHideRecoveryDialog = true }
)
}
}
+
+ // recovery hide dialog
+ if(showHideRecoveryDialog) {
+ AlertDialog(
+ onDismissRequest = { showHideRecoveryDialog = false },
+ title = stringResource(R.string.recoveryPasswordHidePermanently),
+ text = stringResource(R.string.recoveryPasswordHidePermanentlyDescription1),
+ buttons = listOf(
+ DialogButtonModel(
+ GetString(R.string.theContinue),
+ color = LocalColors.current.danger,
+ onClick = { showHideRecoveryConfirmationDialog = true }
+ ),
+ DialogButtonModel(GetString(android.R.string.cancel))
+ )
+ )
+ }
+
+ // recovery hide confirmation dialog
+ if(showHideRecoveryConfirmationDialog) {
+ AlertDialog(
+ onDismissRequest = { showHideRecoveryConfirmationDialog = false },
+ title = stringResource(R.string.recoveryPasswordHidePermanently),
+ text = stringResource(R.string.recoveryPasswordHidePermanentlyDescription2),
+ buttons = listOf(
+ DialogButtonModel(
+ GetString(R.string.yes),
+ color = LocalColors.current.danger,
+ onClick = confirmHideRecovery
+ ),
+ DialogButtonModel(GetString(android.R.string.cancel))
+ )
+ )
+ }
}
@Preview
@@ -188,6 +230,9 @@ private fun PreviewRecoveryPasswordScreen(
@PreviewParameter(SessionColorsParameterProvider::class) colors: ThemeColors
) {
PreviewTheme(colors) {
- RecoveryPasswordScreen(mnemonic = "voyage urban toyed maverick peculiar tuxedo penguin tree grass building listen speak withdraw terminal plane")
+ RecoveryPasswordScreen(
+ mnemonic = "voyage urban toyed maverick peculiar tuxedo penguin tree grass building listen speak withdraw terminal plane",
+ confirmHideRecovery = {}
+ )
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPasswordActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPasswordActivity.kt
index 7cb7eb9dac..a6d38c13a0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPasswordActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/recoverypassword/RecoveryPasswordActivity.kt
@@ -24,33 +24,12 @@ class RecoveryPasswordActivity : BaseActionBarActivity() {
RecoveryPasswordScreen(
mnemonic = mnemonic,
seed = seed,
- copyMnemonic = viewModel::copyMnemonic,
- onHide = ::onHide
+ confirmHideRecovery = {
+ viewModel.permanentlyHidePassword()
+ finish()
+ },
+ copyMnemonic = viewModel::copyMnemonic
)
}
}
-
- private fun onHide() {
- showSessionDialog {
- title(R.string.recoveryPasswordHidePermanently)
- text(R.string.recoveryPasswordHidePermanentlyDescription1)
- dangerButton(R.string.theContinue, R.string.AccessibilityId_theContinue) { onHideConfirm() }
- cancelButton()
- }
- }
-
- private fun onHideConfirm() {
- showSessionDialog {
- title(R.string.recoveryPasswordHidePermanently)
- text(R.string.recoveryPasswordHidePermanentlyDescription2)
- cancelButton()
- dangerButton(
- R.string.yes,
- contentDescriptionRes = R.string.AccessibilityId_recoveryPasswordHidePermanentlyConfirm
- ) {
- viewModel.permanentlyHidePassword()
- finish()
- }
- }
- }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/AlertDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/AlertDialog.kt
index c4770f2110..988220960e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/ui/AlertDialog.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/ui/AlertDialog.kt
@@ -55,7 +55,6 @@ import org.thoughtcrime.securesms.ui.theme.bold
class DialogButtonModel(
val text: GetString,
- val contentDescription: GetString = text,
val color: Color = Color.Unspecified,
val dismissOnClick: Boolean = true,
val enabled: Boolean = true,
@@ -130,6 +129,7 @@ fun AlertDialog(
textAlign = TextAlign.Center,
style = LocalType.current.h7,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing)
+ .qaTag(stringResource(R.string.AccessibilityId_modalTitle))
)
}
text?.let {
@@ -152,6 +152,7 @@ fun AlertDialog(
textAlign = TextAlign.Center,
style = textStyle,
modifier = textModifier
+ .qaTag(stringResource(R.string.AccessibilityId_modalMessage))
)
}
content()
@@ -163,7 +164,7 @@ fun AlertDialog(
text = it.text(),
modifier = Modifier
.fillMaxHeight()
- .contentDescription(it.contentDescription())
+ .qaTag(it.text.string())
.weight(1f),
color = it.color,
enabled = it.enabled
@@ -201,13 +202,11 @@ fun OpenURLAlertDialog(
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.open),
- contentDescription = GetString(R.string.AccessibilityId_urlOpenBrowser),
color = LocalColors.current.danger,
onClick = { context.openUrl(url) }
),
DialogButtonModel(
text = GetString(android.R.string.copyUrl),
- contentDescription = GetString(R.string.AccessibilityId_copy),
onClick = {
context.copyURLToClipboard(url)
Toast.makeText(context, R.string.copied, Toast.LENGTH_SHORT).show()
@@ -297,7 +296,8 @@ fun LoadingDialog(
title?.let {
Text(
it,
- modifier = Modifier.align(Alignment.CenterHorizontally),
+ modifier = Modifier.align(Alignment.CenterHorizontally)
+ .qaTag(stringResource(R.string.AccessibilityId_modalTitle)),
style = LocalType.current.large
)
}
@@ -340,12 +340,10 @@ fun PreviewXCloseDialog() {
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.onboardingTos),
- contentDescription = GetString(R.string.AccessibilityId_onboardingTos),
onClick = {}
),
DialogButtonModel(
text = GetString(R.string.onboardingPrivacy),
- contentDescription = GetString(R.string.AccessibilityId_onboardingPrivacy),
onClick = {}
)
),
diff --git a/content-descriptions/src/main/res/values/strings.xml b/content-descriptions/src/main/res/values/strings.xml
index 8428b628e9..abf6194d8a 100644
--- a/content-descriptions/src/main/res/values/strings.xml
+++ b/content-descriptions/src/main/res/values/strings.xml
@@ -130,6 +130,9 @@
Voice message
Delivered
Message request has been accepted
+
+ Modal heading
+ Modal description
Cancel deletion
Delete for everyone
diff --git a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java
index f97737342d..f20b240846 100644
--- a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java
+++ b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java
@@ -17,6 +17,8 @@
*/
package org.session.libsession.utilities.recipients;
+import static org.session.libsession.utilities.IdUtilKt.truncateIdForDisplay;
+
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
diff --git a/libsession/src/main/res/values-b+az+AZ/strings.xml b/libsession/src/main/res/values-b+az+AZ/strings.xml
index 3ef8ce5211..04281cdddc 100644
--- a/libsession/src/main/res/values-b+az+AZ/strings.xml
+++ b/libsession/src/main/res/values-b+az+AZ/strings.xml
@@ -143,6 +143,7 @@
Zəng davam edir
{name} sizə zəng edir
Gələn zəng
+ Mikrofon müraciətinə icazə vermədiyiniz üçün {name} edən zəngi buraxdınız.
Buraxılmış zəng
{name} kontaktından buraxılmış zəng
Səsli və görüntülü zənglər, cihazınızın sistem ayarlarında bildirişlərin fəallaşdırılmasını tələb edir.
@@ -202,6 +203,7 @@
İcma dəvəti
İcmaya qoşul
{community_name} icmasına qoşulmaq istədiyinizə əminsiniz?
+ İcmaya qoşulma uğursuz oldu
Ya da bunlardan birinə qoşulun...
İcmaya qoşuldu
Artıq bu icmanın üzvüsünüz.
@@ -310,6 +312,7 @@
Silmə növü
Bu ayar, bu danışıqda hər kəsə aiddir.
Bu ayar, bu danışıqda göndərdiyiniz mesajlara aiddir.
+ Bu ayar, bu danışıqdakı hər kəsə tətbiq olunur.\nYalnız qrup adminləri bu ayarı dəyişdirə bilər.
{disappearing_messages_type} olduqdan {time} sonra yox olur
Oxunduqdan sonra yox olur
Mesajlar oxunduqdan sonra silinir.
@@ -406,6 +409,7 @@
Dəvət göndərilir
Dəvət göndərildi
Qrup dəvəti uğurludur
+ İstifadəçilər dəvətləri qəbul etmək üçün ən son versiyaya sahib olmalıdırlar
Siz qrupa qoşulmağa dəvət edildiniz.
Siz və digər {count} nəfər qrupa qoşulmaq üçün dəvət edildiniz.
Siz və {other_name} qrupa qoşulmaq üçün dəvət edildiniz.
@@ -673,9 +677,11 @@
Parol təyin et
Parolunuz təyin edildi. Lütfən, onu güvəndə saxlayın.
Yapışdır
+ Fayl, musiqi və səs göndərə bilməyiniz üçün {app_name} musiqi və səslərə müraciət etməlidir, ancaq bu icazəyə birdəfəlik rədd cavabı verilib. Ayarlar → \"İcazələr\"ə toxunun və \"Musiqi və səs\"i işə salın.
{app_name} media qoşmalarını oxutmaq üçün Apple Music-i istifadə etməlidir.
Avto-güncəlləmə
Açılışda güncəlləmələri avto-yoxla
+ Foto və video göndərə bilməyiniz üçün {app_name} kameraya müraciət etməlidir, ancaq bu icazəyə birdəfəlik rədd cavabı verilib. Ayarlar → \"İcazələr\"ə toxunun və \"Kamera\"nı işə salın.
{app_name} tətbiqinin ekran kilidi özəlliyi Face ID istifadə edir.
Sistem çubuğunda tut
Pəncərəni bağladıqda {app_name} arxaplanda işləməyə davam edir
@@ -685,7 +691,9 @@
{app_name} gizlilik ayarlarında mikrofona müraciəti fəallaşdıra bilərsiniz
{app_name} zəng etmək və səsli mesajlar yazmaq üçün mikrofona müraciət etməlidir.
Mikrofona müraciətə icazə verin.
+ Fayl, musiqi və səs göndərə bilməyiniz üçün {app_name} musiqi və səslərə müraciət etməlidir.
İcazə tələb edilir
+ Foto və video göndərə bilməyiniz üçün {app_name} foto kitabxanasına müraciət etməlidir, ancaq bu icazəyə birdəfəlik rədd cavabı verilib. Ayarlar → \"İcazələr\"ə toxunun və \"Foto və videolar\"ı işə salın.
{app_name}, qoşmaları göndərə və saxlaya bilməyiniz üçün anbara müraciət etməlidir. Ayarlar → İcazələr bölməsinə gedin və \"Anbar\"ı işə salın.
{app_name} qoşmaları və medianı saxlamaq üçün anbara müraciət etməlidir.
{app_name} foto və videoları saxlamaq üçün anbara müraciət etməlidir, ancaq bu icazəyə həmişəlik rədd cavabı verilib. Lütfən tətbiq ayarlarına gedin, \"İcazələr\"i seçin və \"Anbar\" icazəsini fəallaşdırın.
diff --git a/libsession/src/main/res/values-b+be+BY/strings.xml b/libsession/src/main/res/values-b+be+BY/strings.xml
index d3a809d738..1e8c223c43 100644
--- a/libsession/src/main/res/values-b+be+BY/strings.xml
+++ b/libsession/src/main/res/values-b+be+BY/strings.xml
@@ -755,7 +755,7 @@
Некаторыя з слоў у вашым Recovery password няправільныя. Калі ласка, праверце і паспрабуйце яшчэ раз.
The Recovery Password you entered is not long enough. Please check and try again.
Няправільны Recovery Password
- Для загрузкі вашага акаўнта ўвядзіце ваш Recovery Password.
+ Для загрузкі вашага ўліковага запісу ўвядзіце Recovery Password.
Схаваць Recovery Password назусім
Без вашага Recovery password вы не зможаце загрузіць свой уліковы запіс на новыя прылады. \n\nМы настойліва рэкамендуем захаваць ваш Recovery password у надзейным і бяспечным месцы перад прадаўжэннем.
Вы ўпэўненыя, што жадаеце пастаянна схаваць ваш канчатковы пароль аднаўлення на гэтай прыладзе? Гэта немагчыма адмяніць.
diff --git a/libsession/src/main/res/values-b+cs+CZ/strings.xml b/libsession/src/main/res/values-b+cs+CZ/strings.xml
index 008189031e..d6ad67f64b 100644
--- a/libsession/src/main/res/values-b+cs+CZ/strings.xml
+++ b/libsession/src/main/res/values-b+cs+CZ/strings.xml
@@ -653,7 +653,7 @@
{message_count} nových zpráv v {conversation_count} konverzacích
Vibrace
Vypnuto
- Okay
+ OK
Zap.
Vytvořit účet
Účet vytvořen
@@ -806,7 +806,7 @@
Vyčistit data
Konverzace
Nápověda
- Pozvat přítele
+ Pozvat přátele
Žádosti o komunikaci
Upozornění
Oprávnění
@@ -816,7 +816,7 @@
Nastavit
Pro použití nových nastavení musíte restartovat {app_name}.
Sdílet
- Pozvěte svého přítele nebo přítelkyni ke komunikaci pomocí {app_name} sdílením svého ID účtu.
+ Pozvěte své přátele ke komunikaci pomocí {app_name} sdílením svého ID účtu.
Sdílejte se svými přáteli tam, kde s nimi obvykle mluvíte — a pak konverzaci přesuňte sem.
Při otevírání databáze se vyskytl problém. Prosím, restartujte aplikaci a zkuste to znovu.
Sdílet do {app_name}
diff --git a/libsession/src/main/res/values-b+de+DE/strings.xml b/libsession/src/main/res/values-b+de+DE/strings.xml
index b4ef2e65dd..9013b040bb 100644
--- a/libsession/src/main/res/values-b+de+DE/strings.xml
+++ b/libsession/src/main/res/values-b+de+DE/strings.xml
@@ -146,7 +146,7 @@
Du hast einen Anruf von {name} verpasst, weil Du keinen Mikrofonzugriff gewährt hast.
Verpasster Anruf
Verpasster Anruf von {name}
- Sprach- und Videoanrufe erfordern Benachrichtigungen, die in den Systemeinstellungen Ihres Geräts aktiviert sind.
+ Sprach- und Videoanrufe erfordern Benachrichtigungen, die in den Systemeinstellungen deines Geräts aktiviert werden können.
Anrufberechtigung erforderlich
Du kannst die Berechtigung für \"Sprach- und Videoanrufe\" in den Datenschutzeinstellungen aktivieren.
Wiederverbinden…
@@ -176,7 +176,7 @@
- Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node ID: %2$s.
- Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node IDs: %2$s.
- Ein unbekannter Fehler ist aufgetreten und deine Daten wurden nicht gelöscht. Möchtest du stattdessen Ihre Daten nur von diesem Gerät löschen?
+ Ein unbekannter Fehler ist aufgetreten, und deine Daten wurden nicht gelöscht. Möchtest du stattdessen deine Daten nur von diesem Gerät entfernen?
Gerät entfernen
Geräte- und Netzwerkdaten löschen
Bist du sicher, dass du deine Daten aus dem Netzwerk löschen möchtest? Wenn du fortfährst, kannst du deine Nachrichten oder Kontakte nicht wiederherstellen.
@@ -243,7 +243,7 @@
Gruppen
Nachrichtenkürzung
Communities kürzen
- Löschen Sie Nachrichten aus Community-Gesprächen, die älter als 6 Monate sind und bei denen es mehr als 2.000 Nachrichten gibt.
+ Lösche Nachrichten von Community-Konversationen, die älter als 6 Monate sind, und wo es über 2.000 Nachrichten gibt.
Neue Unterhaltung
Du hast noch keine Unterhaltungen
Mit Eingabetaste senden
@@ -331,7 +331,7 @@
Zeitraum
{name} hat verschwindende Nachrichten deaktiviert. Nachrichten verschwinden nicht mehr.
{name} hat verschwindende Nachrichten deaktiviert.
- Sie haben verschwindende Nachrichten deaktiviert. Nachrichten, die Sie senden, verschwinden nicht mehr.
+ Du hast verschwindende Nachrichten deaktiviert. Die von dir gesendeten Nachrichten verschwinden nicht mehr.
Du hast verschwindende Nachrichten deaktiviert.
gelesen
gesendet
@@ -478,7 +478,7 @@
Andere ausblenden
Bild
Inkognito-Tastatur
- Fordere den Inkognito-Modus an, wenn verfügbar. Dies hängt von der Tastatur ab, die du verwendest, deine Tastatur könnte diese Anfrage ignorieren.
+ Fordere den Inkognito-Modus an, wenn verfügbar. Abhängig von der Tastatur, die du verwendest, kann deine Tastatur diese Anfrage ignorieren.
Info
Ungültige Verknüpfung
Beitreten
@@ -540,7 +540,7 @@
Diese Nachricht ist leer.
Nachrichtenübermittlung gescheitert
Nachrichtenlimit erreicht
- Eine Nachricht verschlüsselt mit einer alten Version von {app_name} erhalten, die nicht mehr unterstützt wird. Bitte fragen Sie den Absender, auf die neueste Version zu aktualisieren und die Nachricht erneut zu senden.
+ Eine Nachricht wurde mit einer alten Version von {app_name} verschlüsselt, die nicht mehr unterstützt wird. Bitte den Absender, auf die neueste Version zu aktualisieren und die Nachricht erneut zu senden.
Originalnachricht nicht gefunden
Nachrichten-Info
Als gelesen markieren
@@ -556,14 +556,14 @@
- Du hast %1$d neue Nachrichten.
Antwort auf
- {name} hat Sie eingeladen, der Gruppe {group_name} beizutreten.
+ {name} hat dich eingeladen, der Gruppe {group_name} beizutreten.
Das Senden einer Nachricht an diese Gruppe bestätigt automatisch die Gruppeneinladung.
Deine Nachrichtenanfrage ist derzeit ausstehend.
Du kannst Sprachnachrichten und Anhänge senden, sobald der Empfänger diese Nachrichtenanfrage genehmigt hat.
Du hast die Nachrichtenanfrage von {name} angenommen.
Das Senden einer Nachricht an dieser Person bestätigt automatisch die Nachrichtenanfrage und gibt deine Account-ID bekannt.
Deine Nachrichtenanfrage wurde akzeptiert.
- Sind Sie sich sicher, dass Sie alle Nachrichtenanforderungen und Gruppeneinladungen löschen möchten?
+ Bist du sich sicher, dass du alle Nachrichtenanforderungen und Gruppeneinladungen löschen möchtest?
Community-Nachrichtenanfragen
Erlaube Nachrichtenanfragen von Community-Unterhaltungen.
Bist du sicher, dass du diese Nachrichtenanfrage löschen möchten?
@@ -757,7 +757,7 @@
Scannen
Bildschirmschutz
Bildschirmfoto-Benachrichtigungen
- Erhalte eine Benachrichtigung, wenn ein Kontakt ein Bildschirmfoto eines Eins-zu-eins-Chats erstellt.
+ Erhalte eine Benachrichtigung, wenn ein Kontakt ein Bildschirmfoto in einer Unterhaltung macht.
{name} hat einen Screenshot gemacht.
Suchen
Kontakte durchsuchen
diff --git a/libsession/src/main/res/values-b+hi+IN/strings.xml b/libsession/src/main/res/values-b+hi+IN/strings.xml
index 1e3416aa90..73c6f9b51a 100644
--- a/libsession/src/main/res/values-b+hi+IN/strings.xml
+++ b/libsession/src/main/res/values-b+hi+IN/strings.xml
@@ -21,7 +21,7 @@
क्या आप वाकई {name} और {count} अन्य को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।
एडमिन में पदोन्नत करें
क्या आप वाकई {name} और {other_name} को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।
- {name} को Admin बनाया गया।
+ {name} को एडमिन बनाया गया।
एडमिन पदोन्नति विफल रही
{name} को {group_name} में पदोन्नत करने में विफल
{name} और {count} अन्य को {group_name} में पदोन्नत करने में विफल
@@ -33,7 +33,7 @@
{name} को एडमिन के रूप में हटाने में विफल।
{name} और {count} अन्य को व्यवस्थापक पद से हटाने में विफल |
{name} और {other_name} व्यवस्थापक पद से हटाने में विफल |
- {name} को Admin से हटा दिया गया।
+ {name} को एडमिन से हटा दिया गया।
{name} और {count} अन्य को व्यवस्थापक पद से हटा दिया गया |
{name} and {other_name} को व्यवस्थापक पद से हटा दिया गया |
एडमिन प्रमोशन भेजा जा रहा है
@@ -295,7 +295,7 @@
सभी उपकरणों पर मिटाएँ
सभी के लिए मिटायें |
- - संदेश को हटाने में विफल रहा
+ - संदेश हटाने में विफल
- संदेशों को हटाने में विफल रहा
क्या आप वाकई इन संदेशों को मिटाना चाहते हैं?
@@ -421,7 +421,7 @@
{name} ने समूह छोड़ दिया।
{name} और {count} अन्य समूह से निकल गए।
{name} और {other_name} समूह से निकल गए।
- {name} समूह में शामिल हो गए।
+ {name} समूह में शामिल के लिए आमंत्रित किया है।
{name} को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।
{name} और {count} अन्य को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।
{name} और {other_name} को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।
@@ -527,7 +527,7 @@
खाता आईडी या ONS जोड़ें
मित्रों को आमंत्रित करें
- - आमंत्रण सेंड करें
+ - आमंत्रण भेजे
- आमंत्रण सेंड करें
क्या आप {name} के साथ समूह संदेश इतिहास साझा करना चाहेंगे?
@@ -684,7 +684,7 @@
{app_name} को फ़ोटो और वीडियो लेने के लिए कैमरा अनुमति की आवश्यकता होती है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें और \"कैमरा\" चालू करें।
{app_name} पर स्क्रीन लॉक फीचर Face ID का उपयोग करता है।
सिस्टम ट्रे में रखें
- {app_name} तब भी पृष्ठभूमि में चलता रहता है जब आप विंडो बंद करते हैं
+ जब आप विंडो बंद करते हैं तो {app_name} पृष्ठभूमि में चलता रहता है
{app_name} को जारी रखने के लिए फ़ोटो लाइब्रेरी पहुंच की आवश्यकता है। आप iOS सेटिंग्स में पहुंच सक्षम कर सकते हैं।
माइक्रोफ़ोन
{app_name} को कॉल करने और ऑडियो संदेश भेजने के लिए माइक्रोफ़ोन अनुमति की आवश्यकता है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें, और \"माइक्रोफ़ोन\" चालू करें।
@@ -812,7 +812,7 @@
अपडेट इंस्टॉल हो गया, पुनः प्रारंभ करने के लिए क्लिक करें
अपडेट डाउनलोड हो रहा है: {percent_loader}%
अद्यतन नहीं हो रहा
- {app_name} अपडेट होने में विफल. कृपया {session_download_url} पर जाएं और नए संस्करण को मैन्युअल रूप से इंस्टॉल करें, फिर इस समस्या के बारे में हमें बताने के लिए हमारे सहायता केंद्र से संपर्क करें |
+ {app_name} अपडेट होने में विफल. कृपया {session_download_url} पर जाएं और नए संस्करण को मैन्युअल रूप से इंस्टॉल करें, फिर इस समस्या के बारे में हमें हमारे सहायता केंद्र से संपर्क करें |
{app_name} का एक नया संस्करण उपलब्ध है, अपडेट करने के लिए टैप करें
{app_name} का एक नया संस्करण उपलब्ध है।
रिलीज़ नोट्स पे जाइए
diff --git a/libsession/src/main/res/values-b+hu+HU/strings.xml b/libsession/src/main/res/values-b+hu+HU/strings.xml
index a7e3379924..e3362e7000 100644
--- a/libsession/src/main/res/values-b+hu+HU/strings.xml
+++ b/libsession/src/main/res/values-b+hu+HU/strings.xml
@@ -60,7 +60,7 @@
Melléklet
Melléklet hozzáadása
Névtelen album
- Csatolmányok automatikus letöltése
+ Mellékletek automatikus letöltése
Média és fájlok automatikus letötltése ebből a beszélgetésből.
Szeretnéd automatikusan letölteni az összes fájlt a {conversation_name} beszélgetésből?
Automatikus letöltés
@@ -563,7 +563,7 @@
Elfogadtad {name} üzenetkérését.
Ha üzenetet küld ennek a felhasználónak, akkor automatikusan elfogadja az üzenetkérelmét és a Felhasználó ID megosztásra kerül.
Az üzenetkérelmedet elfogadták.
- Biztos, hogy törölni akarja az összes üzenetkérelmet és csoportmeghívót?
+ Biztos, hogy törölni szeretnéd az összes üzenetkérelmet és csoportmeghívót?
Közösségi üzenetkérelmek
A közösségi beszélgetésekből származó üzenetek engedélyezése.
Biztos, hogy törölni szeretnéd ezt az üzenetkérelmet?
diff --git a/libsession/src/main/res/values-b+it+IT/strings.xml b/libsession/src/main/res/values-b+it+IT/strings.xml
index a605f44c58..86c2ed25cb 100644
--- a/libsession/src/main/res/values-b+it+IT/strings.xml
+++ b/libsession/src/main/res/values-b+it+IT/strings.xml
@@ -143,6 +143,7 @@
Chiamata in corso
Chiamata in arrivo da {name}
Chiamata in arrivo
+ Hai perso una chiamata da {name} perché non hai concesso l\'accesso al microfono.
Chiamata persa
Chiamata persa da {name}
Le chiamate vocali e video richiedono che le notifiche siano abilitate nelle impostazioni di sistema del dispositivo.
@@ -202,6 +203,7 @@
Invito a una Comunità
Unisciti alla Comunità
Sei sicuro di voler unirti a {community_name}?
+ Impossibile unirsi alla community
Oppure unisciti a uno di questi...
Sei entrato nella Comunità
Fai già parte di questa Comunità.
@@ -407,6 +409,7 @@
Invio invito
Invito inviato
Invito al gruppo riuscito
+ Gli utenti devono disporre della versione più recente per ricevere gli inviti
Sei stata invitato a unirti al gruppo.
Tu e {count} altri vi siete uniti al gruppo.
Tu e {other_name} fate ora parte del gruppo.
diff --git a/libsession/src/main/res/values-b+ja+JP/strings.xml b/libsession/src/main/res/values-b+ja+JP/strings.xml
index c394f9bcd4..93344315ff 100644
--- a/libsession/src/main/res/values-b+ja+JP/strings.xml
+++ b/libsession/src/main/res/values-b+ja+JP/strings.xml
@@ -36,8 +36,9 @@
{name} はアドミンから削除されました
{name} と {count}名 がAdminから削除されました。
{name} と {other_name} がAdminに昇格しました。
- 管理者への昇進を送信中
+ アドミンへの昇進を送信中
アドミン設定
+ {name} と {other_name} がアドミンに昇格しました
+{count}
匿名
オートダークモード
@@ -150,7 +151,7 @@
プライバシー設定で「音声とビデオ通話」の許可を有効にできます。
再接続しています...
呼び出し中...
- {app_name} Call
+ {app_name} 電話
通話 (ベータ版)
音声とビデオ通話
音声通話とビデオ通話 (ベータ版)
@@ -236,7 +237,7 @@
{conversation_name} にはメッセージがありません。
キーを入力
会話中のEnterキーの機能
- SHIFT + ENTER 送信, ENTER 改行
+ シフト + エンター 送信、エンター 改行
エンターでメッセージを送信、シフト + エンターで改行を開始
グループ
メッセージの削減
@@ -244,10 +245,11 @@
6ヶ月以上のコミュニティと2,000以上のメッセージがあるコミュニティからメッセージを削除します。
新しい会話
まだ通知はありません
- Enter キーで送信
+ エンターキーで送信
Enterキーをタップすると、改行ではなく、メッセージが送信されます。
すべてのメディア
スペルチェック
+ メッセージを入力するときにスペルチェックを有効にします
会話を開始する
コピーしました
コピーする
@@ -316,8 +318,9 @@
送信後に消えます - {time}
設定をフォロー
送信したメッセージはもう消滅しません。消滅メッセージをオフにしてもよろしいですか?
- あなたのメッセージを{time}後に{disappearing_messages_type}消えるように設定しますか?
+ メッセージを{time}後に{disappearing_messages_type}消えるようにセットしますか?
{name}は古いクライアントを使用しています。消えるメッセージが期待通りに動作しない場合があります。
+ この設定はグループアドミンのみ変更可能です
送信済み
{name} が {time} になった後、{disappearing_messages_type}メッセージが消えるように設定しました。
You は {time} になった後、{disappearing_messages_type}メッセージが消えるように設定しました。
@@ -327,7 +330,7 @@
You は消えるメッセージをオフにしました。送信されたメッセージは消えなくなります。
あなた は消えているメッセージを オフにしました。
既読
- 送信
+ 送信済み
{admin_name}が消えるメッセージの設定を更新しました
You は消えるメッセージの設定を更新しました
キャンセル
@@ -338,7 +341,7 @@
表示名を読み込めませんでした。続行するには新しい表示名を入力してください。
新しい表示名を選択してください
表示名を選択してください
- 表示名を設定
+ 表示名をセット
ドキュメント
完了
ダウンロード
@@ -351,11 +354,15 @@
フラグ
食べ物・飲み物
オブジェクト
- スマイル & 人
+ 最近使用
+ スマイリーと人
記号
旅行&場所
すべての項目の{emoji}を削除してもよろしいですか?
- スローダウンしました。絵文字リアクターが多すぎます。しばらくしてからもう一度試してください。
+ スローダウンしてください。絵文字リアクションが多すぎます。しばらくしてからもう一度試してください。
+
+ - %1$d が %2$s をこのメッセージに反応しました
+
{name}が{emoji_name}でリアクションしました
{name}と{other_name}が{emoji_name}でリアクションしました
{name}と{count}その他が{emoji_name}で反応しました
@@ -388,7 +395,7 @@
グループエラー
グループの作成に失敗しました。インターネット接続を確認して、もう一度やり直してください。
{group_name} への参加に失敗しました
- Set Group Information
+ グループの詳細をセット
本当にこのグループ招待を削除しますか?
招待に失敗しました
{name} と他 {count} 人を {group_name} に招待できませんでした
@@ -446,13 +453,13 @@
{group_name}から削除されました。
あなた と {count}名 がグループから削除されました。
あなた と {other_name} がグループから削除されました。
- グループのアイコン画像を設定
+ グループのアイコン画像をセット
不明なグループ
グループが更新されました
よくある質問
{app_name}の翻訳にご協力ください
バグを報告
- 詳細を共有して、私たちが問題を解決するのを手伝ってください。ログをエクスポートし、{app_name}のヘルプデスクを通じてファイルをアップロードしてください。
+ 詳細を共有して問題解決にご協力ください。ログをエクスポートして、{app_name}のヘルプデスクからファイルをアップロードしてください
ログのエクスポート
ログをエクスポートし、{app_name} のヘルプデスクにてファイルをアップロードします。
デスクトップに保存
@@ -479,12 +486,12 @@
{name} と {other_name} がグループに加わりました
あなたがグループに加わりました
リンクプレビュー
- サポートされている URL のリンクプレビューを表示します。
+ サポートされている URL のリンクプレビューを表示します
リンクプレビューを有効にする
リンクプレビューを読み込めません
セキュアでないリンクのプレビューは読み込めません
送受信する URL のプレビューを表示します。これは便利ですが、{app_name} はプレビューを生成するためにリンクされた サイトにアクセスする必要があります。 {app_name} の設定でいつでもリンクのプレビューをオフにできます。
- リンクプレビューを送る
+ リンクプレビューを表示
リンクのプレビューを送信するとき、完全なメタデータ保護はありません。
リンクプレビューが無効です
{app_name}は、送受信するリンクのプレビューを生成するためにリンクされたウェブサイトに接続する必要があります。\n\n{app_name}の設定でプレビューをオンにできます。
@@ -516,8 +523,8 @@
{name}にグループメッセージ履歴を共有しますか?
{name}と{count}人にグループメッセージ履歴を共有しますか?
{name}と{other_name}にグループメッセージ履歴を共有しますか?
- Share message history
- Share new messages only
+ メッセージ履歴を共有
+ 新しいメッセージのみを共有
招待
メッセージ
このメッセージは空です。
@@ -542,7 +549,7 @@
メッセージ・リクエストは現在承認待ちです。
受信者がこのメッセージリクエストを承認すると、音声メッセージと添付ファイルを送信できます.
{name}さんのメッセージリクエストを承認しました
- このユーザーにメッセージを送信すると、自動的にメッセージリクエストが承認され、あなたのAccount IDが公開されます。
+ このユーザーにメッセージを送ると、メッセージリクエストが自動的に承認され、アカウントIDが公開されます。
メッセージ・リクエストが承認されました。
本当に全てのメッセージリクエストとグループ招待を消去しますか?
コミュニティメッセージリクエスト
@@ -568,7 +575,7 @@
{name}のニックネームを選んでください。これが1対1およびグループ会話で表示されます。
ニックネームを入力してください
ニックネームを削除
- Set Nickname
+ ニックネームをセット
いいえ
候補はありません
なし
@@ -594,6 +601,7 @@
{device}の再起動中にメッセージが届いたかもしれません
LED色
メンションのみ
+ メッセージ通知
最新の受信: {name}
ミュート
{time_large}間ミュート
@@ -630,7 +638,7 @@
{app_name}は、{app_name}の分散型ネットワークの複数のService Nodeを介してメッセージをバウンスすることにより、IPアドレスを隠します。これが現在の経路です:
目的先
エントリーノード
- Service Node
+ サービスノード
国名が不明
このONSを認識できませんでした。内容を確認して再度お試しください。
このONSを検索できませんでした。後でもう一度お試しください。
@@ -642,6 +650,7 @@
パスワードを再確認
パスワードを作成してください
現在のパスワードが間違っています。
+ {app_name} のロックを解除するにはパスワードが必要です
パスワードを入力してください
現在のパスワードを入力してください
新しいパスワードを入力してください
@@ -653,7 +662,7 @@
パスワードを削除
{app_name} のロックを解除するために必要なパスワードを削除します
パスワードを削除しました。
- パスワードを設定
+ パスワードをセット
パスワードが設定されました。安全に保管してください。
貼り付け
{app_name} は、ファイル、音楽、およびオーディオを送信するために音楽およびオーディオアクセスが必要ですが、それが恒久的に拒否されています。設定に移動して、「権限」を選択し、「音楽およびオーディオ」を有効にしてください。
@@ -685,20 +694,21 @@
プロフィール
ディスプレイの画像
表示画像の削除に失敗しました。
- ディスプレイの画像を設定
+ ディスプレイの画像をセット
小さいファイルを選んでください
プロフィールを更新できませんでした
昇格
QR コード
このQRコードにはアカウントIDが含まれていません
このQRコードにはリカバリーパスワードが含まれていません
- QRコードを読み取る
+ QRコードをスキャン
QRコードを表示
+ 友達があなたのQRコードをスキャンすることでメッセージを送信できます
{app_name} を終了
終了
既読
既読通知
- 送信したすべてのメッセージに対する既読通知を表示します。
+ 送信したすべてのメッセージに対する既読通知を表示します
受信:
オススメ
リカバリーパスワードを保存して、アカウントにアクセスできなくならないようにしてください
@@ -733,8 +743,8 @@
保存済みのメッセージ
保存中...
スキャン
- スクリーン・セキュリティ
- スクリーンショット撮影時の通知
+ スクリーンセキュリティ
+ スクリーンショット通知
連絡先が1対1チャットのスクリーンショットを撮ったときに通知を受け取ります
{name}はスクリーンショットを撮りました
検索
@@ -768,12 +778,12 @@
新しい設定を適用するために {app_name} を再起動する必要があります.
共有
友達を{app_name} に招待して、チャットを始めましょう。アカウントIDを共有して招待できます。
- いつもどこでも友達と共有してください — ここで会話を移動します。
+ いつでもどこでも友達と共有 — ここで会話を始めましょう
データベースを開く際に問題が発生しました。アプリを再起動して再度お試しください。
{app_name}に共有
表示
すべて表示
- 最小化
+ 少なく表示
ステッカー
サポートページへ
システム情報: {information}
@@ -782,7 +792,7 @@
エラー
再試行
入力中アイコン
- 入力中アイコンを表示する
+ 入力中アイコンを表示
元に戻す
不明
アプリ更新
diff --git a/libsession/src/main/res/values-b+kmr+TR/strings.xml b/libsession/src/main/res/values-b+kmr+TR/strings.xml
index 06d2c404f5..6654388716 100644
--- a/libsession/src/main/res/values-b+kmr+TR/strings.xml
+++ b/libsession/src/main/res/values-b+kmr+TR/strings.xml
@@ -143,6 +143,7 @@
Bangê Bejeziyene
Gerîna hatî ji {name}
Gerîna habe
+ Te ji telefona ji {name} hatî ma, ji ber ku te destûra gihîna mîkrofonê nedaye.
Gerîna negerîl
Gerîna nececawdayî ji {name}
Lêgerînên Dengî û Vîdeoyî div têgehin Navigationda dê system tê bikeviya nizanaran divê Troll karibe binšiyan
@@ -278,7 +279,7 @@
Bi ser neket ku komê biguherînin
Îzna te tine ye ku mesajên kesên din jê bibî
- - Peyama Jê Bibe
+ - Peyamê Jê Bibe
- Peyaman Jê Bibe
Tu piştrast î ku tu dixwazî vê peyamê jê bibî?
@@ -295,7 +296,7 @@
Ji bo tevan jê bibe
- Bi ser neket ku peyama jê derbike.
- - Bi ser neket ku peyam nebe derbike.
+ - Bi ser neket ku peyaman jê bibe.
Tu piştrast î ku tu dixwazî peyamên van jê bibî?
Tu piştrast î ku tu dixwazî vê peyaman tenê li ser cîhaza vê peyaman jê bibî?
@@ -520,7 +521,7 @@
- %1$d endam
- - %1$d endamê aktîf
+ - %1$d endamê aktîv
- %1$d endamên aktîf
Add Account ID or ONS
@@ -551,7 +552,7 @@
Bi navê hesabê hevalê xwe Account ID an ONS-ê têlepeqîne.
Bi navê hesabê hevalê xwe Account ID, ONS an scanê QR code-yê têlepeqîne.
- - Tu peyama nûyeke hatî gotandî hiştî.
+ - Peyameke te yê nû heye.
- %1$d peyama nû hîn tuneyê.
Cewab didî
@@ -763,7 +764,7 @@
Li söylek bigerrin
Kerem bike tu li ser Giphy ne girêdane - ne têketina gêrê, usbikirina tambûra têkeve
- - %1$d ji %2$d lihevhatû
+ - %1$d ji %2$d li hev tê
- %1$d li li %2$d yên din
Encam peyda nebû
diff --git a/libsession/src/main/res/values-b+lv+LV/strings.xml b/libsession/src/main/res/values-b+lv+LV/strings.xml
index 0b7a1c6a13..7e43c0cead 100644
--- a/libsession/src/main/res/values-b+lv+LV/strings.xml
+++ b/libsession/src/main/res/values-b+lv+LV/strings.xml
@@ -397,6 +397,9 @@
{name} un {count} citi atstāja grupu.
{name} un {other_name} atstāja grupu.
Grupai pievienojās {name}.
+ {name} uzaicināts pievienoties grupai un sarakstes vēsture tam pieejama.
+ {name} un {count} others uzaicināti pievienoties grupai.
+ {name} un {other_name} uzaicināti pievienoties grupai.
Tu atstāji grupu.
Grupas dalībnieki
Šajā grupā nav citu dalībnieku.
@@ -494,6 +497,11 @@
Ziņas informācija
Atzīmēt kā izlasītu
Atzīmēt kā nelasītu
+
+ - Jauna ziņa
+ - Jauna ziņa
+ - Jauna ziņa
+
Sāc jaunu sarunu, ievadot drauga Konta ID vai ONS.
Sāc jaunu sarunu, ievadot drauga Konta ID, ONS vai skenējot viņu QR kodu.
diff --git a/libsession/src/main/res/values-b+ru+RU/strings.xml b/libsession/src/main/res/values-b+ru+RU/strings.xml
index bb19b83fbd..a5d2d42e59 100644
--- a/libsession/src/main/res/values-b+ru+RU/strings.xml
+++ b/libsession/src/main/res/values-b+ru+RU/strings.xml
@@ -531,7 +531,7 @@
Максимальный
Медиа
- - %1$d участник
+ - %1$d Участник
- %1$d участника
- %1$d участников
- %1$d участников
diff --git a/libsession/src/main/res/values-b+sk+SK/strings.xml b/libsession/src/main/res/values-b+sk+SK/strings.xml
index cbf903bc60..8bd494edb4 100644
--- a/libsession/src/main/res/values-b+sk+SK/strings.xml
+++ b/libsession/src/main/res/values-b+sk+SK/strings.xml
@@ -143,6 +143,7 @@
Prebiehajúci hovor
Prichádzajúci hovor od {name}
Prichádzajúci hovor
+ Zmeškali ste hovor od {name}, pretože ste neudelili prístup k mikrofónu.
Zmeškaný hovor
Zmeškaný hovor od {name}
Hlasové a video hovory vyžadujú povolenie upozornení v systémových nastaveniach vášho zariadenia.
diff --git a/libsession/src/main/res/values-b+zh+CN/strings.xml b/libsession/src/main/res/values-b+zh+CN/strings.xml
index d1fbe64a02..ffe42da633 100644
--- a/libsession/src/main/res/values-b+zh+CN/strings.xml
+++ b/libsession/src/main/res/values-b+zh+CN/strings.xml
@@ -463,9 +463,9 @@
导出日志
导出您的日志,然后通过{app_name}的帮助服务台上传日志。
保存到桌面
- 将此文件保存到您的桌面,然后与{app_name}开发者分享。
+ 将此文件保存到您的桌面,然后与{app_name}开发者分享
支持
- 感谢您的反馈。
+ 感谢您的反馈
隐藏
切换系统菜单栏可见性
隐藏其它
diff --git a/scripts/drone-static-upload.sh b/scripts/drone-static-upload.sh
index 0e5209c942..b5c9ee83f7 100755
--- a/scripts/drone-static-upload.sh
+++ b/scripts/drone-static-upload.sh
@@ -19,7 +19,7 @@ chmod 600 ssh_key
# Define the output paths
build_dir="app/build/outputs/apk/play/debug"
-target_path="${build_dir}/$(ls ${build_dir} | grep -o 'app-[^[:space:]]*-universal-debug.apk')"
+target_path="${build_dir}/$(ls ${build_dir} | grep -o 'session-[^[:space:]]*-universal.apk')"
# Validate the paths exist
if [ ! -d $build_path ]; then