Merge branch 'master' into Snackbar

Signed-off-by: Smarshall <99678760+Smarshal21@users.noreply.github.com>
This commit is contained in:
Smarshall 2023-08-19 17:57:28 +05:30 committed by GitHub
commit 4121f538c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 613 additions and 263 deletions

View File

@ -1,53 +1,54 @@
# synced from @nextcloud/android-config
name: "Analysis" name: "Analysis"
on: on:
pull_request: pull_request:
branches: [ master, stable-* ] branches: [ "master", "main", "stable-*" ]
push: push:
branches: [ master, stable-* ] branches: [ "master", "main", "stable-*" ]
permissions: permissions:
pull-requests: write pull-requests: write
contents: write contents: write
concurrency: concurrency:
group: analysis-wrapper-${{ github.head_ref || github.run_id }} group: analysis-wrapper-${{ github.head_ref || github.run_id }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
analysis: analysis:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Setup variables - name: Setup variables
id: get-vars id: get-vars
run: | run: |
if [ -z "$GITHUB_HEAD_REF" ]; then if [ -z "$GITHUB_HEAD_REF" ]; then
# push # push
echo "branch=$GITHUB_REF_NAME" >> "$GITHUB_OUTPUT" echo "branch=$GITHUB_REF_NAME" >> "$GITHUB_OUTPUT"
echo "pr=$GITHUB_RUN_ID" >> "$GITHUB_OUTPUT" echo "pr=$GITHUB_RUN_ID" >> "$GITHUB_OUTPUT"
echo "repo=${{ github.repository }}" >> "$GITHUB_OUTPUT" echo "repo=${{ github.repository }}" >> "$GITHUB_OUTPUT"
else else
# pull request # pull request
echo "branch=$GITHUB_HEAD_REF" >> "$GITHUB_OUTPUT" echo "branch=$GITHUB_HEAD_REF" >> "$GITHUB_OUTPUT"
echo "pr=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT" echo "pr=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT"
echo "repo=${{ github.event.pull_request.head.repo.full_name }}" >> "$GITHUB_OUTPUT" echo "repo=${{ github.event.pull_request.head.repo.full_name }}" >> "$GITHUB_OUTPUT"
fi fi
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
with: with:
repository: ${{ steps.get-vars.outputs.repo }} repository: ${{ steps.get-vars.outputs.repo }}
ref: ${{ steps.get-vars.outputs.branch }} ref: ${{ steps.get-vars.outputs.branch }}
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0 uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0
with: with:
distribution: "temurin" distribution: "temurin"
java-version: 17 java-version: 17
- name: Install dependencies - name: Install dependencies
run: | run: |
python3 -m pip install defusedxml python3 -m pip install defusedxml
- name: Run analysis wrapper - name: Run analysis wrapper
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
mkdir -p $HOME/.gradle mkdir -p $HOME/.gradle
echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > $HOME/.gradle/gradle.properties echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > $HOME/.gradle/gradle.properties
scripts/analysis/analysis-wrapper.sh ${{ steps.get-vars.outputs.branch }} ${{ secrets.LOG_USERNAME }} ${{ secrets.LOG_PASSWORD }} $GITHUB_RUN_NUMBER ${{ steps.get-vars.outputs.pr }} scripts/analysis/analysis-wrapper.sh ${{ steps.get-vars.outputs.branch }} ${{ secrets.LOG_USERNAME }} ${{ secrets.LOG_PASSWORD }} $GITHUB_RUN_NUMBER ${{ steps.get-vars.outputs.pr }}

View File

@ -32,7 +32,7 @@ jobs:
with: with:
swap-size-gb: 10 swap-size-gb: 10
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@0ba4244466797eb048eb91a6cd43d5c03ca8bd05 # v2.21.2 uses: github/codeql-action/init@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
- name: Set up JDK 17 - name: Set up JDK 17
@ -46,4 +46,4 @@ jobs:
echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties" echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
./gradlew assembleDebug ./gradlew assembleDebug
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@0ba4244466797eb048eb91a6cd43d5c03ca8bd05 # v2.21.2 uses: github/codeql-action/analyze@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4

View File

@ -1,3 +1,8 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: 'Ask for feedback on PRs' name: 'Ask for feedback on PRs'
on: on:
schedule: schedule:
@ -5,7 +10,7 @@ on:
jobs: jobs:
pr-feedback: pr-feedback:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- name: The get-github-handles-from-website action - name: The get-github-handles-from-website action
uses: marcelklehr/get-github-handles-from-website-action@a739600f6b91da4957f51db0792697afbb2f143c # v1.0.0 uses: marcelklehr/get-github-handles-from-website-action@a739600f6b91da4957f51db0792697afbb2f143c # v1.0.0
@ -25,5 +30,5 @@ jobs:
Thank you for contributing to Nextcloud and we hope to hear from you soon! Thank you for contributing to Nextcloud and we hope to hear from you soon!
days-before-feedback: 14 days-before-feedback: 14
start-date: "2023-07-10" start-date: "2023-07-10"
exempt-authors: "${{ steps.scrape.outputs.users }}" exempt-authors: "${{ steps.scrape.outputs.users }},nextcloud-command,nextcloud-android-bot"
exempt-bots: true exempt-bots: true

View File

@ -37,6 +37,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard. # Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning" - name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@0ba4244466797eb048eb91a6cd43d5c03ca8bd05 # v2.21.2 uses: github/codeql-action/upload-sarif@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4
with: with:
sarif_file: results.sarif sarif_file: results.sarif

View File

@ -46,8 +46,8 @@ android {
// mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable)
// xx .xxx .xx .xx // xx .xxx .xx .xx
versionCode 170100014 versionCode 170100016
versionName "17.10.0 Alpha 14" versionName "17.10.0 Alpha 16"
flavorDimensions "default" flavorDimensions "default"
renderscriptTargetApi 19 renderscriptTargetApi 19
@ -162,7 +162,7 @@ configurations.all {
} }
dependencies { dependencies {
implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.preference:preference-ktx:1.2.1'
detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.1") detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.1")
implementation fileTree(include: ['*'], dir: 'libs') implementation fileTree(include: ['*'], dir: 'libs')

View File

@ -1083,13 +1083,11 @@ class CallActivity : CallBaseActivity() {
} }
private fun getSpotlightView(): SpotlightView? { private fun getSpotlightView(): SpotlightView? {
val primary = viewThemeUtils.getScheme(binding!!.audioOutputButton.context).primary val builder = SpotlightView.Builder(this)
return SpotlightView.Builder(this)
.introAnimationDuration(300) .introAnimationDuration(300)
.enableRevealAnimation(true) .enableRevealAnimation(true)
.performClick(false) .performClick(false)
.fadeinTextDuration(400) .fadeinTextDuration(400)
.headingTvColor(primary)
.headingTvSize(20) .headingTvSize(20)
.headingTvText(resources.getString(R.string.nc_push_to_talk)) .headingTvText(resources.getString(R.string.nc_push_to_talk))
.subHeadingTvColor(resources.getColor(R.color.bg_default, null)) .subHeadingTvColor(resources.getColor(R.color.bg_default, null))
@ -1098,11 +1096,11 @@ class CallActivity : CallBaseActivity() {
.maskColor(Color.parseColor("#dc000000")) .maskColor(Color.parseColor("#dc000000"))
.target(binding!!.microphoneButton) .target(binding!!.microphoneButton)
.lineAnimDuration(400) .lineAnimDuration(400)
.lineAndArcColor(primary)
.enableDismissAfterShown(true) .enableDismissAfterShown(true)
.dismissOnBackPress(true) .dismissOnBackPress(true)
.usageId("pushToTalk") .usageId("pushToTalk")
.show()
return viewThemeUtils.talk.themeSpotlightView(context, builder).show()
} }
private fun onCameraClick() { private fun onCameraClick() {

View File

@ -41,7 +41,6 @@ import androidx.annotation.Nullable;
import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFilterable;
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
import eu.davidea.viewholders.FlexibleViewHolder; import eu.davidea.viewholders.FlexibleViewHolder;
public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.UserItemViewHolder> implements public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.UserItemViewHolder> implements
@ -65,8 +64,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.User
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof AdvancedUserItem) { if (o instanceof AdvancedUserItem inItem) {
AdvancedUserItem inItem = (AdvancedUserItem) o;
return participant.equals(inItem.getModel()); return participant.equals(inItem.getModel());
} }
return false; return false;
@ -107,11 +105,10 @@ public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.User
public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) { public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) {
if (adapter.hasFilter()) { if (adapter.hasFilter()) {
FlexibleUtils.highlightText( viewThemeUtils.talk.themeAndHighlightText(
holder.binding.userName, holder.binding.userName,
participant.getDisplayName(), participant.getDisplayName(),
String.valueOf(adapter.getFilter(String.class)), String.valueOf(adapter.getFilter(String.class)));
viewThemeUtils.getScheme(holder.binding.userName.getContext()).getPrimary());
} else { } else {
holder.binding.userName.setText(participant.getDisplayName()); holder.binding.userName.setText(participant.getDisplayName());
} }

View File

@ -46,7 +46,6 @@ import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFilterable;
import eu.davidea.flexibleadapter.items.ISectionable; import eu.davidea.flexibleadapter.items.ISectionable;
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
import eu.davidea.viewholders.FlexibleViewHolder; import eu.davidea.viewholders.FlexibleViewHolder;
public class ContactItem extends AbstractFlexibleItem<ContactItem.ContactItemViewHolder> implements public class ContactItem extends AbstractFlexibleItem<ContactItem.ContactItemViewHolder> implements
@ -74,8 +73,7 @@ public class ContactItem extends AbstractFlexibleItem<ContactItem.ContactItemVie
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof ContactItem) { if (o instanceof ContactItem inItem) {
ContactItem inItem = (ContactItem) o;
return participant.getCalculatedActorType() == inItem.getModel().getCalculatedActorType() && return participant.getCalculatedActorType() == inItem.getModel().getCalculatedActorType() &&
participant.getCalculatedActorId().equals(inItem.getModel().getCalculatedActorId()); participant.getCalculatedActorId().equals(inItem.getModel().getCalculatedActorId());
} }
@ -135,10 +133,9 @@ public class ContactItem extends AbstractFlexibleItem<ContactItem.ContactItemVie
holder.binding.nameText.setText(participant.getDisplayName()); holder.binding.nameText.setText(participant.getDisplayName());
if (adapter.hasFilter()) { if (adapter.hasFilter()) {
FlexibleUtils.highlightText(holder.binding.nameText, viewThemeUtils.talk.themeAndHighlightText(holder.binding.nameText,
participant.getDisplayName(), participant.getDisplayName(),
String.valueOf(adapter.getFilter(String.class)), String.valueOf(adapter.getFilter(String.class)));
viewThemeUtils.getScheme(holder.binding.nameText.getContext()).getPrimary());
} }
if (TextUtils.isEmpty(participant.getDisplayName()) && if (TextUtils.isEmpty(participant.getDisplayName()) &&

View File

@ -48,7 +48,6 @@ import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFilterable;
import eu.davidea.flexibleadapter.items.IFlexible; import eu.davidea.flexibleadapter.items.IFlexible;
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
public class MentionAutocompleteItem extends AbstractFlexibleItem<ParticipantItem.ParticipantItemViewHolder> public class MentionAutocompleteItem extends AbstractFlexibleItem<ParticipantItem.ParticipantItemViewHolder>
implements IFilterable<String> { implements IFilterable<String> {
@ -103,8 +102,7 @@ public class MentionAutocompleteItem extends AbstractFlexibleItem<ParticipantIte
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof MentionAutocompleteItem) { if (o instanceof MentionAutocompleteItem inItem) {
MentionAutocompleteItem inItem = (MentionAutocompleteItem) o;
return (objectId.equals(inItem.objectId) && displayName.equals(inItem.displayName)); return (objectId.equals(inItem.objectId) && displayName.equals(inItem.displayName));
} }
@ -138,18 +136,12 @@ public class MentionAutocompleteItem extends AbstractFlexibleItem<ParticipantIte
R.color.conversation_item_header, R.color.conversation_item_header,
null)); null));
if (adapter.hasFilter()) { if (adapter.hasFilter()) {
FlexibleUtils.highlightText(holder.binding.nameText, viewThemeUtils.talk.themeAndHighlightText(holder.binding.nameText,
displayName, displayName,
String.valueOf(adapter.getFilter(String.class)), String.valueOf(adapter.getFilter(String.class)));
viewThemeUtils viewThemeUtils.talk.themeAndHighlightText(holder.binding.secondaryText,
.getScheme(holder.binding.secondaryText.getContext()) "@" + objectId,
.getPrimary()); String.valueOf(adapter.getFilter(String.class)));
FlexibleUtils.highlightText(holder.binding.secondaryText,
"@" + objectId,
String.valueOf(adapter.getFilter(String.class)),
viewThemeUtils
.getScheme(holder.binding.secondaryText.getContext())
.getPrimary());
} else { } else {
holder.binding.nameText.setText(displayName); holder.binding.nameText.setText(displayName);
holder.binding.secondaryText.setText("@" + objectId); holder.binding.secondaryText.setText("@" + objectId);

View File

@ -51,7 +51,6 @@ import androidx.core.content.res.ResourcesCompat;
import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFilterable;
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
import eu.davidea.viewholders.FlexibleViewHolder; import eu.davidea.viewholders.FlexibleViewHolder;
public class ParticipantItem extends AbstractFlexibleItem<ParticipantItem.ParticipantItemViewHolder> implements public class ParticipantItem extends AbstractFlexibleItem<ParticipantItem.ParticipantItemViewHolder> implements
@ -81,8 +80,7 @@ public class ParticipantItem extends AbstractFlexibleItem<ParticipantItem.Partic
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof ParticipantItem) { if (o instanceof ParticipantItem inItem) {
ParticipantItem inItem = (ParticipantItem) o;
return participant.getCalculatedActorType() == inItem.getModel().getCalculatedActorType() && return participant.getCalculatedActorType() == inItem.getModel().getCalculatedActorType() &&
participant.getCalculatedActorId().equals(inItem.getModel().getCalculatedActorId()); participant.getCalculatedActorId().equals(inItem.getModel().getCalculatedActorId());
} }
@ -129,9 +127,8 @@ public class ParticipantItem extends AbstractFlexibleItem<ParticipantItem.Partic
holder.binding.nameText.setText(participant.getDisplayName()); holder.binding.nameText.setText(participant.getDisplayName());
if (adapter.hasFilter()) { if (adapter.hasFilter()) {
FlexibleUtils.highlightText(holder.binding.nameText, participant.getDisplayName(), viewThemeUtils.talk.themeAndHighlightText(holder.binding.nameText, participant.getDisplayName(),
String.valueOf(adapter.getFilter(String.class)), String.valueOf(adapter.getFilter(String.class)));
viewThemeUtils.getScheme(holder.binding.nameText.getContext()).getPrimary());
} }
if (TextUtils.isEmpty(participant.getDisplayName()) && if (TextUtils.isEmpty(participant.getDisplayName()) &&

View File

@ -84,7 +84,8 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) :
var processedMessageText = messageUtils.enrichChatMessageText( var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context, binding.messageText.context,
message, message,
binding.messageText.context.resources.getColor(R.color.nc_incoming_text_default) true,
viewThemeUtils
) )
processedMessageText = messageUtils.processMessageParameters( processedMessageText = messageUtils.processMessageParameters(
@ -198,9 +199,8 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
binding.messageQuote.quotedMessage.context.resources.getColor( true,
R.color.nc_incoming_text_default viewThemeUtils
)
) )
binding.messageQuote.quotedMessageAuthor binding.messageQuote.quotedMessageAuthor

View File

@ -96,7 +96,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
itemView.isSelected = false itemView.isSelected = false
val textSize = context?.resources!!.getDimension(R.dimen.chat_text_size) val textSize = context.resources!!.getDimension(R.dimen.chat_text_size)
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
binding.messageText.text = message.text binding.messageText.text = message.text
@ -166,7 +166,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
if (!message.isDeleted && message.parentMessage != null) { if (!message.isDeleted && message.parentMessage != null) {
val parentChatMessage = message.parentMessage val parentChatMessage = message.parentMessage
parentChatMessage!!.activeUser = message.activeUser parentChatMessage!!.activeUser = message.activeUser
parentChatMessage!!.imageUrl?.let { parentChatMessage.imageUrl?.let {
binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE
binding.messageQuote.quotedMessageImage.load(it) { binding.messageQuote.quotedMessageImage.load(it) {
addHeader( addHeader(
@ -178,18 +178,17 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
binding.messageQuote.quotedMessageImage.visibility = View.GONE binding.messageQuote.quotedMessageImage.visibility = View.GONE
} }
binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
?: context!!.getText(R.string.nc_nick_guest) ?: context.getText(R.string.nc_nick_guest)
binding.messageQuote.quotedMessage.text = messageUtils binding.messageQuote.quotedMessage.text = messageUtils
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
binding.messageQuote.quotedMessage.context.resources.getColor( true,
R.color.nc_incoming_text_default viewThemeUtils
)
) )
binding.messageQuote.quotedMessageAuthor binding.messageQuote.quotedMessageAuthor
.setTextColor(context!!.resources.getColor(R.color.textColorMaxContrast, null)) .setTextColor(context.resources.getColor(R.color.textColorMaxContrast, null))
if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) { if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) {
viewThemeUtils.platform.colorViewBackground(binding.messageQuote.quoteColoredView) viewThemeUtils.platform.colorViewBackground(binding.messageQuote.quoteColoredView)
@ -217,7 +216,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
} }
} }
binding.webview.settings?.javaScriptEnabled = true binding.webview.settings.javaScriptEnabled = true
binding.webview.webViewClient = object : WebViewClient() { binding.webview.webViewClient = object : WebViewClient() {
@Deprecated("Use shouldOverrideUrlLoading(WebView view, WebResourceRequest request)") @Deprecated("Use shouldOverrideUrlLoading(WebView view, WebResourceRequest request)")
@ -234,10 +233,10 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
val urlStringBuffer = StringBuffer("file:///android_asset/leafletMapMessagePreview.html") val urlStringBuffer = StringBuffer("file:///android_asset/leafletMapMessagePreview.html")
urlStringBuffer.append( urlStringBuffer.append(
"?mapProviderUrl=" + URLEncoder.encode(context!!.getString(R.string.osm_tile_server_url)) "?mapProviderUrl=" + URLEncoder.encode(context.getString(R.string.osm_tile_server_url))
) )
urlStringBuffer.append( urlStringBuffer.append(
"&mapProviderAttribution=" + URLEncoder.encode(context!!.getString(R.string.osm_tile_server_attributation)) "&mapProviderAttribution=" + URLEncoder.encode(context.getString(R.string.osm_tile_server_attributation))
) )
urlStringBuffer.append("&locationLat=" + URLEncoder.encode(locationLat)) urlStringBuffer.append("&locationLat=" + URLEncoder.encode(locationLat))
urlStringBuffer.append("&locationLon=" + URLEncoder.encode(locationLon)) urlStringBuffer.append("&locationLon=" + URLEncoder.encode(locationLon))
@ -262,7 +261,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
val geoLinkWithMarker = addMarkerToGeoLink(locationGeoLink!!) val geoLinkWithMarker = addMarkerToGeoLink(locationGeoLink!!)
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(geoLinkWithMarker)) val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(geoLinkWithMarker))
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context!!.startActivity(browserIntent) context.startActivity(browserIntent)
} else { } else {
Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "locationGeoLink was null or empty") Log.e(TAG, "locationGeoLink was null or empty")

View File

@ -206,9 +206,8 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
binding.messageQuote.quotedMessage.context.resources.getColor( true,
R.color.nc_incoming_text_default viewThemeUtils
)
) )
binding.messageQuote.quotedMessageAuthor binding.messageQuote.quotedMessageAuthor

View File

@ -88,7 +88,8 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
var processedMessageText = messageUtils.enrichChatMessageText( var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context, binding.messageText.context,
message, message,
binding.messageText.context.resources.getColor(R.color.nc_incoming_text_default) true,
viewThemeUtils
) )
processedMessageText = messageUtils.processMessageParameters( processedMessageText = messageUtils.processMessageParameters(
@ -197,7 +198,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
binding.messageQuote.quotedMessageImage.visibility = View.GONE binding.messageQuote.quotedMessageImage.visibility = View.GONE
} }
binding.messageQuote.quotedMessageAuthor.text = if (parentChatMessage.actorDisplayName.isNullOrEmpty()) { binding.messageQuote.quotedMessageAuthor.text = if (parentChatMessage.actorDisplayName.isNullOrEmpty()) {
context!!.getText(R.string.nc_nick_guest) context.getText(R.string.nc_nick_guest)
} else { } else {
parentChatMessage.actorDisplayName parentChatMessage.actorDisplayName
} }
@ -206,7 +207,8 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
binding.messageQuote.quotedMessage.context.resources.getColor(R.color.nc_incoming_text_default) true,
viewThemeUtils
) )
if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) { if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) {
@ -217,7 +219,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
) )
} }
binding.messageQuote.quotedChatMessageView.setOnClickListener() { binding.messageQuote.quotedChatMessageView.setOnClickListener {
val chatActivity = commonMessageInterface as ChatActivity val chatActivity = commonMessageInterface as ChatActivity
chatActivity.jumpToQuotedMessage(parentChatMessage) chatActivity.jumpToQuotedMessage(parentChatMessage)
} }

View File

@ -304,9 +304,8 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
binding.messageQuote.quotedMessage.context.resources.getColor( true,
R.color.nc_incoming_text_default viewThemeUtils
)
) )
binding.messageQuote.quotedMessageAuthor binding.messageQuote.quotedMessageAuthor

View File

@ -24,11 +24,11 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.PorterDuff
import android.view.View import android.view.View
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import autodagger.AutoInjector import autodagger.AutoInjector
import coil.load import coil.load
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -78,12 +78,12 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :
super.onBind(message) super.onBind(message)
this.message = message this.message = message
sharedApplication!!.componentApplication.inject(this) sharedApplication!!.componentApplication.inject(this)
val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
binding.messageTime.setTextColor(textColor)
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
colorizeMessageBubble(message) colorizeMessageBubble(message)
var processedMessageText = messageUtils.enrichChatMessageText(binding.messageText.context, message, textColor) var processedMessageText =
messageUtils.enrichChatMessageText(binding.messageText.context, message, false, viewThemeUtils)
processedMessageText = messageUtils.processMessageParameters( processedMessageText = messageUtils.processMessageParameters(
binding.messageText.context, binding.messageText.context,
viewThemeUtils, viewThemeUtils,
@ -106,18 +106,15 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :
} }
val readStatusContentDescriptionString = when (message.readStatus) { val readStatusContentDescriptionString = when (message.readStatus) {
ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read)
ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent)
else -> null else -> null
} }
readStatusDrawableInt?.let { drawableInt -> readStatusDrawableInt?.let { drawableInt ->
AppCompatResources.getDrawable(context, drawableInt)?.let { AppCompatResources.getDrawable(context, drawableInt)?.let {
binding.checkMark.setImageDrawable(it) binding.checkMark.setImageDrawable(it)
binding.checkMark.setColorFilter( viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark)
viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant,
PorterDuff.Mode.SRC_ATOP
)
} }
} }
@ -176,7 +173,8 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant false,
viewThemeUtils
) )
viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)

View File

@ -25,7 +25,6 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.PorterDuff
import android.net.Uri import android.net.Uri
import android.util.Log import android.util.Log
import android.util.TypedValue import android.util.TypedValue
@ -84,15 +83,14 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
override fun onBind(message: ChatMessage) { override fun onBind(message: ChatMessage) {
super.onBind(message) super.onBind(message)
sharedApplication!!.componentApplication.inject(this) sharedApplication!!.componentApplication.inject(this)
val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
binding.messageTime.setTextColor(textColor)
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
realView.isSelected = false realView.isSelected = false
val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams
layoutParams.isWrapBefore = false layoutParams.isWrapBefore = false
val textSize = context!!.resources.getDimension(R.dimen.chat_text_size) val textSize = context.resources.getDimension(R.dimen.chat_text_size)
colorizeMessageBubble(message) colorizeMessageBubble(message)
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
@ -110,22 +108,19 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
} }
val readStatusContentDescriptionString = when (message.readStatus) { val readStatusContentDescriptionString = when (message.readStatus) {
ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read)
ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent)
else -> null else -> null
} }
readStatusDrawableInt?.let { drawableInt -> readStatusDrawableInt?.let { drawableInt ->
AppCompatResources.getDrawable(context!!, drawableInt)?.let { AppCompatResources.getDrawable(context, drawableInt)?.let {
binding.checkMark.setImageDrawable(it) binding.checkMark.setImageDrawable(it)
binding.checkMark.setColorFilter( viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark)
viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant,
PorterDuff.Mode.SRC_ATOP
)
} }
} }
binding.checkMark.setContentDescription(readStatusContentDescriptionString) binding.checkMark.contentDescription = readStatusContentDescriptionString
// geo-location // geo-location
setLocationDataOnMessageItem(message) setLocationDataOnMessageItem(message)
@ -163,7 +158,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
} }
} }
binding.webview.settings?.javaScriptEnabled = true binding.webview.settings.javaScriptEnabled = true
binding.webview.webViewClient = object : WebViewClient() { binding.webview.webViewClient = object : WebViewClient() {
@Deprecated("Use shouldOverrideUrlLoading(WebView view, WebResourceRequest request)") @Deprecated("Use shouldOverrideUrlLoading(WebView view, WebResourceRequest request)")
@ -180,11 +175,11 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
val urlStringBuffer = StringBuffer("file:///android_asset/leafletMapMessagePreview.html") val urlStringBuffer = StringBuffer("file:///android_asset/leafletMapMessagePreview.html")
urlStringBuffer.append( urlStringBuffer.append(
"?mapProviderUrl=" + URLEncoder.encode(context!!.getString(R.string.osm_tile_server_url)) "?mapProviderUrl=" + URLEncoder.encode(context.getString(R.string.osm_tile_server_url))
) )
urlStringBuffer.append( urlStringBuffer.append(
"&mapProviderAttribution=" + URLEncoder.encode( "&mapProviderAttribution=" + URLEncoder.encode(
context!!.getString( context.getString(
R.string R.string
.osm_tile_server_attributation .osm_tile_server_attributation
) )
@ -224,12 +219,13 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
binding.messageQuote.quotedMessageImage.visibility = View.GONE binding.messageQuote.quotedMessageImage.visibility = View.GONE
} }
binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
?: context!!.getText(R.string.nc_nick_guest) ?: context.getText(R.string.nc_nick_guest)
binding.messageQuote.quotedMessage.text = messageUtils binding.messageQuote.quotedMessage.text = messageUtils
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant false,
viewThemeUtils
) )
viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)
@ -250,7 +246,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
val geoLinkWithMarker = addMarkerToGeoLink(locationGeoLink!!) val geoLinkWithMarker = addMarkerToGeoLink(locationGeoLink!!)
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(geoLinkWithMarker)) val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(geoLinkWithMarker))
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context!!.startActivity(browserIntent) context.startActivity(browserIntent)
} else { } else {
Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "locationGeoLink was null or empty") Log.e(TAG, "locationGeoLink was null or empty")

View File

@ -23,11 +23,11 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.PorterDuff
import android.view.View import android.view.View
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import autodagger.AutoInjector import autodagger.AutoInjector
import coil.load import coil.load
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -78,8 +78,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) :
super.onBind(message) super.onBind(message)
this.message = message this.message = message
sharedApplication!!.componentApplication.inject(this) sharedApplication!!.componentApplication.inject(this)
val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
binding.messageTime.setTextColor(textColor)
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
colorizeMessageBubble(message) colorizeMessageBubble(message)
@ -96,18 +95,15 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) :
} }
val readStatusContentDescriptionString = when (message.readStatus) { val readStatusContentDescriptionString = when (message.readStatus) {
ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read)
ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent)
else -> null else -> null
} }
readStatusDrawableInt?.let { drawableInt -> readStatusDrawableInt?.let { drawableInt ->
AppCompatResources.getDrawable(context, drawableInt)?.let { AppCompatResources.getDrawable(context, drawableInt)?.let {
binding.checkMark.setImageDrawable(it) binding.checkMark.setImageDrawable(it)
binding.checkMark.setColorFilter( viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark)
viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant,
PorterDuff.Mode.SRC_ATOP
)
} }
} }
@ -191,7 +187,8 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant false,
viewThemeUtils
) )
viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)

View File

@ -24,13 +24,13 @@
package com.nextcloud.talk.adapters.messages package com.nextcloud.talk.adapters.messages
import android.content.Context import android.content.Context
import android.graphics.PorterDuff
import android.util.TypedValue import android.util.TypedValue
import android.view.View import android.view.View
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import autodagger.AutoInjector import autodagger.AutoInjector
import coil.load import coil.load
import com.google.android.flexbox.FlexboxLayout import com.google.android.flexbox.FlexboxLayout
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@ -71,11 +71,14 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
realView.isSelected = false realView.isSelected = false
val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams
layoutParams.isWrapBefore = false layoutParams.isWrapBefore = false
var textSize = context!!.resources.getDimension(R.dimen.chat_text_size) var textSize = context.resources.getDimension(R.dimen.chat_text_size)
val textColor = viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
binding.messageTime.setTextColor(textColor) var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context,
var processedMessageText = messageUtils.enrichChatMessageText(binding.messageText.context, message, textColor) message,
false,
viewThemeUtils
)
processedMessageText = messageUtils.processMessageParameters( processedMessageText = messageUtils.processMessageParameters(
binding.messageText.context, binding.messageText.context,
viewThemeUtils, viewThemeUtils,
@ -98,7 +101,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
binding.messageTime.layoutParams = layoutParams binding.messageTime.layoutParams = layoutParams
binding.messageText.setTextColor(textColor) viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT)
binding.messageText.text = processedMessageText binding.messageText.text = processedMessageText
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
@ -118,22 +121,19 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
} }
val readStatusContentDescriptionString = when (message.readStatus) { val readStatusContentDescriptionString = when (message.readStatus) {
ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read)
ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent)
else -> null else -> null
} }
readStatusDrawableInt?.let { drawableInt -> readStatusDrawableInt?.let { drawableInt ->
ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let { ResourcesCompat.getDrawable(context.resources, drawableInt, null)?.let {
binding.checkMark.setImageDrawable(it) binding.checkMark.setImageDrawable(it)
binding.checkMark.setColorFilter( viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark)
viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant,
PorterDuff.Mode.SRC_ATOP
)
} }
} }
binding.checkMark.setContentDescription(readStatusContentDescriptionString) binding.checkMark.contentDescription = readStatusContentDescriptionString
itemView.setTag(R.string.replyable_message_view_tag, message.replyable) itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
@ -158,7 +158,6 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
private fun processParentMessage(message: ChatMessage) { private fun processParentMessage(message: ChatMessage) {
val parentChatMessage = message.parentMessage val parentChatMessage = message.parentMessage
val textColor = viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant
parentChatMessage!!.activeUser = message.activeUser parentChatMessage!!.activeUser = message.activeUser
parentChatMessage.imageUrl?.let { parentChatMessage.imageUrl?.let {
binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE
@ -172,19 +171,20 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
binding.messageQuote.quotedMessageImage.visibility = View.GONE binding.messageQuote.quotedMessageImage.visibility = View.GONE
} }
binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
?: context!!.getText(R.string.nc_nick_guest) ?: context.getText(R.string.nc_nick_guest)
binding.messageQuote.quotedMessage.text = messageUtils binding.messageQuote.quotedMessage.text = messageUtils
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
textColor false,
viewThemeUtils
) )
binding.messageQuote.quotedMessageAuthor.setTextColor(textColor) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
binding.messageQuote.quotedMessage.setTextColor(textColor) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)
binding.messageQuote.quoteColoredView.setBackgroundColor(textColor) viewThemeUtils.talk.colorOutgoingQuoteBackground(binding.messageQuote.quoteColoredView)
binding.messageQuote.quotedChatMessageView.setOnClickListener() { binding.messageQuote.quotedChatMessageView.setOnClickListener {
val chatActivity = commonMessageInterface as ChatActivity val chatActivity = commonMessageInterface as ChatActivity
chatActivity.jumpToQuotedMessage(parentChatMessage) chatActivity.jumpToQuotedMessage(parentChatMessage)
} }

View File

@ -24,7 +24,6 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.PorterDuff
import android.os.Handler import android.os.Handler
import android.util.Log import android.util.Log
import android.view.View import android.view.View
@ -86,8 +85,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) :
super.onBind(message) super.onBind(message)
this.message = message this.message = message
sharedApplication!!.componentApplication.inject(this) sharedApplication!!.componentApplication.inject(this)
val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
binding.messageTime.setTextColor(textColor)
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
colorizeMessageBubble(message) colorizeMessageBubble(message)
@ -139,10 +137,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) :
readStatusDrawableInt?.let { drawableInt -> readStatusDrawableInt?.let { drawableInt ->
AppCompatResources.getDrawable(context!!, drawableInt)?.let { AppCompatResources.getDrawable(context!!, drawableInt)?.let {
binding.checkMark.setImageDrawable(it) binding.checkMark.setImageDrawable(it)
binding.checkMark.setColorFilter( viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark)
viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant,
PorterDuff.Mode.SRC_ATOP
)
} }
} }
@ -291,7 +286,8 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) :
.enrichChatReplyMessageText( .enrichChatReplyMessageText(
binding.messageQuote.quotedMessage.context, binding.messageQuote.quotedMessage.context,
parentChatMessage, parentChatMessage,
viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant false,
viewThemeUtils
) )
viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)

View File

@ -28,7 +28,6 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Handler import android.os.Handler
@ -235,17 +234,14 @@ abstract class PreviewMessageViewHolder(itemView: View?, payload: Any?) :
if (message.selectedIndividualHashMap!!.containsKey(KEY_MIMETYPE)) { if (message.selectedIndividualHashMap!!.containsKey(KEY_MIMETYPE)) {
val mimetype = message.selectedIndividualHashMap!![KEY_MIMETYPE] val mimetype = message.selectedIndividualHashMap!![KEY_MIMETYPE]
val drawableResourceId = getDrawableResourceIdForMimeType(mimetype) val drawableResourceId = getDrawableResourceIdForMimeType(mimetype)
val drawable = ContextCompat.getDrawable(context!!, drawableResourceId) var drawable = ContextCompat.getDrawable(context!!, drawableResourceId)
if (drawable != null && if (drawable != null &&
( (
drawableResourceId == R.drawable.ic_mimetype_folder || drawableResourceId == R.drawable.ic_mimetype_folder ||
drawableResourceId == R.drawable.ic_mimetype_package_x_generic drawableResourceId == R.drawable.ic_mimetype_package_x_generic
) )
) { ) {
drawable.setColorFilter( drawable = viewThemeUtils?.platform?.tintDrawable(context!!, drawable)
viewThemeUtils!!.getScheme(image.context).primary,
PorterDuff.Mode.SRC_ATOP
)
} }
placeholder = drawable placeholder = drawable
} else { } else {

View File

@ -25,8 +25,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat
import com.nextcloud.talk.R
import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding
import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ChatMessage
import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils
@ -65,7 +63,7 @@ class Reaction {
val isSelfReaction = message.reactionsSelf != null && val isSelfReaction = message.reactionsSelf != null &&
message.reactionsSelf!!.isNotEmpty() && message.reactionsSelf!!.isNotEmpty() &&
message.reactionsSelf!!.contains(emoji) message.reactionsSelf!!.contains(emoji)
val textColor = getTextColor(isOutgoingMessage, isSelfReaction, binding, viewThemeUtils) val textColor = viewThemeUtils.talk.getTextColor(isOutgoingMessage, isSelfReaction, binding)
val emojiWithAmountWrapper = getEmojiWithAmountWrapperLayout( val emojiWithAmountWrapper = getEmojiWithAmountWrapperLayout(
binding.reactionsEmojiWrapper.context, binding.reactionsEmojiWrapper.context,
emoji, emoji,
@ -112,15 +110,7 @@ class Reaction {
emojiWithAmountWrapper.layoutParams = layoutInfo.wrapperParams emojiWithAmountWrapper.layoutParams = layoutInfo.wrapperParams
if (layoutInfo.isSelfReaction) { if (layoutInfo.isSelfReaction) {
val color = if (layoutInfo.isOutgoingMessage) { layoutInfo.viewThemeUtils.talk.setCheckedBackground(emojiWithAmountWrapper, layoutInfo.isOutgoingMessage)
ContextCompat.getColor(
emojiWithAmountWrapper.context,
R.color.bg_message_list_incoming_bubble
)
} else {
layoutInfo.viewThemeUtils.getScheme(emojiWithAmountWrapper.context).primaryContainer
}
layoutInfo.viewThemeUtils.talk.setCheckedBackground(emojiWithAmountWrapper, color)
emojiWithAmountWrapper.setPaddingRelative( emojiWithAmountWrapper.setPaddingRelative(
layoutInfo.paddingSide, layoutInfo.paddingSide,
@ -176,19 +166,6 @@ class Reaction {
return amountParams return amountParams
} }
private fun getTextColor(
isOutgoingMessage: Boolean,
isSelfReaction: Boolean,
binding: ReactionsInsideMessageBinding,
viewThemeUtils: ViewThemeUtils
): Int {
var textColor = viewThemeUtils.getScheme(binding.root.context).onSurfaceVariant
if (!isOutgoingMessage || isSelfReaction) {
textColor = ContextCompat.getColor(binding.root.context, R.color.high_emphasis_text)
}
return textColor
}
private data class EmojiWithAmountWrapperLayoutInfo( private data class EmojiWithAmountWrapperLayoutInfo(
val textColor: Int, val textColor: Int,
val amountParams: LinearLayout.LayoutParams, val amountParams: LinearLayout.LayoutParams,

View File

@ -1618,9 +1618,10 @@ class ChatActivity :
currentConversation!!.status, currentConversation!!.status,
null, null,
size, size,
viewThemeUtils.platform.getScheme(binding.chatToolbar.context).surface, 0,
binding.chatToolbar.context binding.chatToolbar.context
) )
viewThemeUtils.talk.themeStatusDrawable(context, status)
binding.chatToolbar.findViewById<ImageView>(R.id.chat_toolbar_avatar) binding.chatToolbar.findViewById<ImageView>(R.id.chat_toolbar_avatar)
.setImageDrawable(BitmapDrawable(resources, bitmap)) .setImageDrawable(BitmapDrawable(resources, bitmap))
binding.chatToolbar.findViewById<ImageView>(R.id.chat_toolbar_status) binding.chatToolbar.findViewById<ImageView>(R.id.chat_toolbar_status)

View File

@ -26,7 +26,6 @@ package com.nextcloud.talk.remotefilebrowser.activities
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.Menu import android.view.Menu
@ -90,13 +89,10 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe
binding = ActivityRemoteFileBrowserBinding.inflate(layoutInflater) binding = ActivityRemoteFileBrowserBinding.inflate(layoutInflater)
setSupportActionBar(binding.remoteFileBrowserItemsToolbar) setSupportActionBar(binding.remoteFileBrowserItemsToolbar)
viewThemeUtils.material.themeToolbar(binding.remoteFileBrowserItemsToolbar) viewThemeUtils.material.themeToolbar(binding.remoteFileBrowserItemsToolbar)
val scheme = viewThemeUtils.getScheme(binding.sortListButtonGroup.context) viewThemeUtils.talk.themeSortListButtonGroup(binding.sortListButtonGroup)
binding.sortListButtonGroup.setBackgroundColor(scheme.surface) viewThemeUtils.talk.themeSortButton(binding.sortButton)
binding.sortButton.iconTint = ColorStateList.valueOf(scheme.onSurface)
binding.sortButton.setTextColor(scheme.onSurface)
viewThemeUtils.material.colorMaterialTextButton(binding.sortButton) viewThemeUtils.material.colorMaterialTextButton(binding.sortButton)
binding.pathNavigationBackButton.iconTint = ColorStateList.valueOf(scheme.onSurface) viewThemeUtils.talk.themePathNavigationButton(binding.pathNavigationBackButton)
binding.pathNavigationBackButton.setTextColor(scheme.onSurface)
viewThemeUtils.material.colorMaterialTextButton(binding.pathNavigationBackButton) viewThemeUtils.material.colorMaterialTextButton(binding.pathNavigationBackButton)
viewThemeUtils.platform.themeStatusBar(this) viewThemeUtils.platform.themeStatusBar(this)
setContentView(binding.root) setContentView(binding.root)
@ -199,7 +195,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
super.onCreateOptionsMenu(menu) super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.menu_share_files, menu) menuInflater.inflate(R.menu.menu_share_files, menu)
filesSelectionDoneMenuItem = menu?.findItem(R.id.files_selection_done) filesSelectionDoneMenuItem = menu.findItem(R.id.files_selection_done)
return true return true
} }

View File

@ -33,6 +33,7 @@ import android.text.TextUtils;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat; import androidx.core.content.res.ResourcesCompat;
@ -44,11 +45,17 @@ public class StatusDrawable extends Drawable {
private String text; private String text;
private StatusDrawableType icon = StatusDrawableType.UNDEFINED; private StatusDrawableType icon = StatusDrawableType.UNDEFINED;
private Paint textPaint; private Paint textPaint;
private final int backgroundColor; private int backgroundColor;
private final float radius; private final float radius;
private Context context; private Context context;
public StatusDrawable(String status, String statusIcon, float statusSize, int backgroundColor, Context context) { public void colorStatusDrawable(@ColorInt int color) {
backgroundColor = color;
invalidateSelf();
}
public StatusDrawable(String status, String statusIcon, float statusSize, int backgroundColor,
Context context) {
radius = statusSize; radius = statusSize;
this.backgroundColor = backgroundColor; this.backgroundColor = backgroundColor;
@ -58,19 +65,17 @@ public class StatusDrawable extends Drawable {
this.context = context; this.context = context;
} else if (TextUtils.isEmpty(statusIcon) && status != null) { } else if (TextUtils.isEmpty(statusIcon) && status != null) {
switch (status) { switch (status) {
case "online": case "online" -> {
icon = StatusDrawableType.ONLINE; icon = StatusDrawableType.ONLINE;
this.context = context; this.context = context;
break; }
case "away" -> {
case "away":
icon = StatusDrawableType.AWAY; icon = StatusDrawableType.AWAY;
this.context = context; this.context = context;
break; }
default -> {
default: }
// do not show // do not show
break;
} }
} else { } else {
text = statusIcon; text = statusIcon;

View File

@ -329,12 +329,14 @@ public class ChooseAccountDialogFragment extends DialogFragment {
private void drawStatus() { private void drawStatus() {
float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, getContext()); float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, getContext());
binding.currentAccount.ticker.setBackground(null); binding.currentAccount.ticker.setBackground(null);
binding.currentAccount.ticker.setImageDrawable(new StatusDrawable( StatusDrawable drawable = new StatusDrawable(
status.getStatus(), status.getStatus(),
status.getIcon(), status.getIcon(),
size, size,
viewThemeUtils.getScheme(binding.currentAccount.ticker.getContext()).getSurface(), 0,
getContext())); getContext());
viewThemeUtils.talk.themeStatusDrawable(binding.currentAccount.ticker.getContext(), drawable);
binding.currentAccount.ticker.setImageDrawable(drawable);
binding.currentAccount.ticker.setVisibility(View.VISIBLE); binding.currentAccount.ticker.setVisibility(View.VISIBLE);

View File

@ -26,13 +26,19 @@ import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter import android.graphics.PorterDuffColorFilter
import android.graphics.Typeface
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable import android.graphics.drawable.LayerDrawable
import android.os.Build import android.os.Build
import android.text.Spannable
import android.text.Spanned
import android.text.style.ForegroundColorSpan
import android.text.style.StyleSpan
import android.view.View import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView import android.widget.TextView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
@ -42,17 +48,23 @@ import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.materialswitch.MaterialSwitch import com.google.android.material.materialswitch.MaterialSwitch
import com.nextcloud.android.common.ui.theme.MaterialSchemes import com.nextcloud.android.common.ui.theme.MaterialSchemes
import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase
import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding
import com.nextcloud.talk.ui.MicInputCloud import com.nextcloud.talk.ui.MicInputCloud
import com.nextcloud.talk.ui.StatusDrawable
import com.nextcloud.talk.ui.WaveformSeekBar import com.nextcloud.talk.ui.WaveformSeekBar
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.DrawableUtils
import com.nextcloud.talk.utils.message.MessageUtils
import com.vanniktech.emoji.EmojiTextView import com.vanniktech.emoji.EmojiTextView
import com.wooplr.spotlight.SpotlightView
import eu.davidea.flexibleadapter.utils.FlexibleUtils
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -160,11 +172,19 @@ class TalkSpecificViewThemeUtils @Inject constructor(
} }
} }
fun setCheckedBackground(linearLayout: LinearLayout, @ColorInt backgroundColor: Int) { fun setCheckedBackground(linearLayout: LinearLayout, incoming: Boolean) {
withScheme(linearLayout) { scheme -> withScheme(linearLayout) { scheme ->
val drawable = AppCompatResources val drawable = AppCompatResources
.getDrawable(linearLayout.context, R.drawable.reaction_self_background)!! .getDrawable(linearLayout.context, R.drawable.reaction_self_background)!!
.mutate() .mutate()
val backgroundColor = if (incoming) {
scheme.primaryContainer
} else {
ContextCompat.getColor(
linearLayout.context,
R.color.bg_message_list_incoming_bubble
)
}
DrawableCompat.setTintList( DrawableCompat.setTintList(
drawable, drawable,
ColorStateList.valueOf(backgroundColor) ColorStateList.valueOf(backgroundColor)
@ -263,6 +283,111 @@ class TalkSpecificViewThemeUtils @Inject constructor(
} }
} }
fun themeForegroundColorSpan(context: Context): ForegroundColorSpan {
return withScheme(context) { scheme ->
return@withScheme ForegroundColorSpan(scheme.primary)
}
}
fun themeSpotlightView(context: Context, builder: SpotlightView.Builder): SpotlightView.Builder {
return withScheme(context) { scheme ->
return@withScheme builder.headingTvColor(scheme.primary).lineAndArcColor(scheme.primary)
}
}
fun themeAndHighlightText(
textView: TextView,
originalText: String?,
c: String?
) {
withScheme(textView) { scheme ->
var constraint = c
constraint = FlexibleUtils.toLowerCase(constraint)
var start = FlexibleUtils.toLowerCase(originalText).indexOf(constraint)
if (start != -1) {
val spanText = Spannable.Factory.getInstance().newSpannable(originalText)
do {
val end = start + constraint.length
spanText.setSpan(
ForegroundColorSpan(scheme.primary),
start,
end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spanText.setSpan(StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
start = FlexibleUtils.toLowerCase(originalText)
.indexOf(constraint, end + 1) // +1 skips the consecutive span
} while (start != -1)
textView.setText(spanText, TextView.BufferType.SPANNABLE)
} else {
textView.setText(originalText, TextView.BufferType.NORMAL)
}
}
}
fun themeSortButton(sortButton: MaterialButton) {
withScheme(sortButton) { scheme ->
sortButton.iconTint = ColorStateList.valueOf(scheme.onSurface)
sortButton.setTextColor(scheme.onSurface)
}
}
fun themePathNavigationButton(navigationBtn: MaterialButton) {
withScheme(navigationBtn) { scheme ->
navigationBtn.iconTint = ColorStateList.valueOf(scheme.onSurface)
navigationBtn.setTextColor(scheme.onSurface)
}
}
fun themeSortListButtonGroup(relativeLayout: RelativeLayout) {
withScheme(relativeLayout) { scheme ->
relativeLayout.setBackgroundColor(scheme.surface)
}
}
fun themeStatusDrawable(context: Context, statusDrawable: StatusDrawable) {
withScheme(context) { scheme ->
statusDrawable.colorStatusDrawable(scheme.surface)
}
}
fun themeMessageCheckMark(imageView: ImageView) {
withScheme(imageView) { scheme ->
imageView.setColorFilter(
scheme.onSurfaceVariant,
PorterDuff.Mode.SRC_ATOP
)
}
}
fun themeMarkdown(context: Context, message: String, incoming: Boolean): Spanned {
return withScheme(context) { scheme ->
return@withScheme if (incoming) {
MessageUtils(context).getRenderedMarkdownText(
context,
message,
context.getColor(R.color.nc_incoming_text_default)
)
} else {
MessageUtils(context).getRenderedMarkdownText(context, message, scheme.onSurfaceVariant)
}
}
}
fun getTextColor(
isOutgoingMessage: Boolean,
isSelfReaction: Boolean,
binding: ReactionsInsideMessageBinding
): Int {
return withScheme(binding.root) { scheme ->
return@withScheme if (!isOutgoingMessage || isSelfReaction) {
ContextCompat.getColor(binding.root.context, R.color.high_emphasis_text)
} else {
scheme.onSurfaceVariant
}
}
}
companion object { companion object {
private val THEMEABLE_PLACEHOLDER_IDS = listOf( private val THEMEABLE_PLACEHOLDER_IDS = listOf(
R.drawable.ic_mimetype_package_x_generic, R.drawable.ic_mimetype_package_x_generic,

View File

@ -292,7 +292,7 @@ public class DisplayUtils {
if (chipXmlRes == R.xml.chip_you) { if (chipXmlRes == R.xml.chip_you) {
spannableString.setSpan( spannableString.setSpan(
new ForegroundColorSpan(viewThemeUtils.getScheme(context).getOnPrimary()), viewThemeUtils.talk.themeForegroundColorSpan(context),
start, start,
end, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

View File

@ -40,28 +40,48 @@ import io.noties.markwon.ext.tasklist.TaskListDrawable
import io.noties.markwon.ext.tasklist.TaskListPlugin import io.noties.markwon.ext.tasklist.TaskListPlugin
class MessageUtils(val context: Context) { class MessageUtils(val context: Context) {
fun enrichChatReplyMessageText(context: Context, message: ChatMessage, textColor: Int): Spanned? { fun enrichChatReplyMessageText(
context: Context,
message: ChatMessage,
incoming: Boolean,
viewThemeUtils: ViewThemeUtils
): Spanned? {
return if (message.message == null) { return if (message.message == null) {
null null
} else if (message.renderMarkdown == false) { } else if (message.renderMarkdown == false) {
SpannableString(DisplayUtils.ellipsize(message.message!!, MAX_REPLY_LENGTH)) SpannableString(DisplayUtils.ellipsize(message.text, MAX_REPLY_LENGTH))
} else { } else {
enrichChatMessageText(context, DisplayUtils.ellipsize(message.message!!, MAX_REPLY_LENGTH), textColor) enrichChatMessageText(
context,
DisplayUtils.ellipsize(message.text, MAX_REPLY_LENGTH),
incoming,
viewThemeUtils
)
} }
} }
fun enrichChatMessageText(context: Context, message: ChatMessage, textColor: Int): Spanned? { fun enrichChatMessageText(
context: Context,
message: ChatMessage,
incoming: Boolean,
viewThemeUtils: ViewThemeUtils
): Spanned? {
return if (message.message == null) { return if (message.message == null) {
null null
} else if (message.renderMarkdown == false) { } else if (message.renderMarkdown == false) {
SpannableString(message.message) SpannableString(message.message)
} else { } else {
enrichChatMessageText(context, message.message!!, textColor) enrichChatMessageText(context, message.message!!, incoming, viewThemeUtils)
} }
} }
private fun enrichChatMessageText(context: Context, message: String, textColor: Int): Spanned { private fun enrichChatMessageText(
return getRenderedMarkdownText(context, message, textColor) context: Context,
message: String,
incoming: Boolean,
viewThemeUtils: ViewThemeUtils
): Spanned {
return viewThemeUtils.talk.themeMarkdown(context, message, incoming)
} }
fun processMessageParameters( fun processMessageParameters(
@ -131,7 +151,7 @@ class MessageUtils(val context: Context) {
return messageStringInternal return messageStringInternal
} }
private fun getRenderedMarkdownText(context: Context, markdown: String, textColor: Int): Spanned { fun getRenderedMarkdownText(context: Context, markdown: String, textColor: Int): Spanned {
val drawable = TaskListDrawable(textColor, textColor, context.getColor(R.color.bg_default)) val drawable = TaskListDrawable(textColor, textColor, context.getColor(R.color.bg_default))
val markwon = Markwon.builder(context).usePlugin(object : AbstractMarkwonPlugin() { val markwon = Markwon.builder(context).usePlugin(object : AbstractMarkwonPlugin() {
override fun configureTheme(builder: MarkwonTheme.Builder) { override fun configureTheme(builder: MarkwonTheme.Builder) {

View File

@ -10,6 +10,7 @@
<string name="avatar">Avatar</string> <string name="avatar">Avatar</string>
<string name="away">Absent</string> <string name="away">Absent</string>
<string name="call_more_actions_dialog_headline">Opcions avançades de trucada</string> <string name="call_more_actions_dialog_headline">Opcions avançades de trucada</string>
<string name="call_running_since_one_hour">La trucada porta una hora en marxa.</string>
<string name="call_without_notification">Trucada sense notificació</string> <string name="call_without_notification">Trucada sense notificació</string>
<string name="camera_permission_granted">S\'ha concedit el permís de càmera. Torneu a triar la càmera.</string> <string name="camera_permission_granted">S\'ha concedit el permís de càmera. Torneu a triar la càmera.</string>
<string name="choose_avatar_from_cloud">Trieu un avatar del núvol</string> <string name="choose_avatar_from_cloud">Trieu un avatar del núvol</string>
@ -334,6 +335,7 @@
<string name="nc_settings_theme_key">tema</string> <string name="nc_settings_theme_key">tema</string>
<string name="nc_settings_theme_light">Clar</string> <string name="nc_settings_theme_light">Clar</string>
<string name="nc_settings_theme_title">Tema</string> <string name="nc_settings_theme_title">Tema</string>
<string name="nc_settings_typing_status_desc">Comparteix el meu estat d\'escriptura i mostra l\'estat d\'escriptura dels altres</string>
<string name="nc_settings_use_credentials_title">El proxy necessita credencials</string> <string name="nc_settings_use_credentials_title">El proxy necessita credencials</string>
<string name="nc_settings_warning">Avís</string> <string name="nc_settings_warning">Avís</string>
<string name="nc_settings_wrong_account">Només el compte actual pot ser re-autoritzat</string> <string name="nc_settings_wrong_account">Només el compte actual pot ser re-autoritzat</string>
@ -455,6 +457,7 @@
<string name="title_attachments">Adjunts</string> <string name="title_attachments">Adjunts</string>
<string name="today">Avui</string> <string name="today">Avui</string>
<string name="translate">Traducció</string> <string name="translate">Traducció</string>
<string name="translation_copy_translated_text">Copia el text traduït</string>
<string name="translation_detect_language">Detectar idioma</string> <string name="translation_detect_language">Detectar idioma</string>
<string name="translation_device_settings">Paràmetres del dispositiu</string> <string name="translation_device_settings">Paràmetres del dispositiu</string>
<string name="translation_error_message">No s\'ha pogut detectar la llengua</string> <string name="translation_error_message">No s\'ha pogut detectar la llengua</string>

View File

@ -288,6 +288,7 @@
<string name="today">I dag</string> <string name="today">I dag</string>
<string name="translate">Oversæt</string> <string name="translate">Oversæt</string>
<string name="translation_device_settings">Enhedsindstillinger</string> <string name="translation_device_settings">Enhedsindstillinger</string>
<string name="translation_error_message">Kunne ikke finde sprog</string>
<string name="translation_from">Fra</string> <string name="translation_from">Fra</string>
<string name="translation_to">Til</string> <string name="translation_to">Til</string>
<string name="unread">Ulæst</string> <string name="unread">Ulæst</string>

View File

@ -10,12 +10,14 @@
<string name="avatar">Avatar</string> <string name="avatar">Avatar</string>
<string name="away">Ausente</string> <string name="away">Ausente</string>
<string name="call_more_actions_dialog_headline">Opciones avanzadas de llamada</string> <string name="call_more_actions_dialog_headline">Opciones avanzadas de llamada</string>
<string name="call_running_since_one_hour">La llamada ha estado activa por una hora.</string>
<string name="call_without_notification">Llamar sin avisar</string> <string name="call_without_notification">Llamar sin avisar</string>
<string name="camera_permission_granted">Los permisos para la cámara fueron otorgados. Por favor seleccione la cámara nuevamente.</string> <string name="camera_permission_granted">Los permisos para la cámara fueron otorgados. Por favor seleccione la cámara nuevamente.</string>
<string name="choose_avatar_from_cloud">Elegir avatar desde la nube</string> <string name="choose_avatar_from_cloud">Elegir avatar desde la nube</string>
<string name="clear_status_message">Borrar el mensaje de estado</string> <string name="clear_status_message">Borrar el mensaje de estado</string>
<string name="clear_status_message_after">Borrar el mensaje de estado después de</string> <string name="clear_status_message_after">Borrar el mensaje de estado después de</string>
<string name="close">Cerrar</string> <string name="close">Cerrar</string>
<string name="continuous_voice_message_recording">Bloquear grabación para grabación continua del mensaje de voz</string>
<string name="conversations">Conversaciones</string> <string name="conversations">Conversaciones</string>
<string name="danger_zone">Zona de peligro</string> <string name="danger_zone">Zona de peligro</string>
<string name="delete_avatar">Borrar avatar</string> <string name="delete_avatar">Borrar avatar</string>
@ -63,6 +65,7 @@
<string name="nc_allow_guests">Permitir invitados</string> <string name="nc_allow_guests">Permitir invitados</string>
<string name="nc_attendee_pin">Pin: %1$s</string> <string name="nc_attendee_pin">Pin: %1$s</string>
<string name="nc_biometric_unlock">Desbloquear %1$s</string> <string name="nc_biometric_unlock">Desbloquear %1$s</string>
<string name="nc_bluetooth_permission_hint">Para habilitar los parlantes bluetooth, por favor, otorgue el permiso \"Dispositivos cercanos\".</string>
<string name="nc_call_button_content_description_advanced">Opciones avanzadas de llamada</string> <string name="nc_call_button_content_description_advanced">Opciones avanzadas de llamada</string>
<string name="nc_call_button_content_description_answer_video_call">Contestar como videollamada</string> <string name="nc_call_button_content_description_answer_video_call">Contestar como videollamada</string>
<string name="nc_call_button_content_description_answer_voice_only">Contestar como llamada de audio solamente</string> <string name="nc_call_button_content_description_answer_voice_only">Contestar como llamada de audio solamente</string>
@ -86,6 +89,7 @@
<string name="nc_call_unknown">%s llamada</string> <string name="nc_call_unknown">%s llamada</string>
<string name="nc_call_video">%s videollamada</string> <string name="nc_call_video">%s videollamada</string>
<string name="nc_call_voice">%s llamada de voz</string> <string name="nc_call_voice">%s llamada de voz</string>
<string name="nc_camera_permission_hint">Para habilitar la comunicación por vídeo, por favor, otorgue el permiso \"Cámara\".</string>
<string name="nc_camera_permission_permanently_denied">Para permitir la comunicación de vídeo, concede el permiso de \"Cámara\" en la configuración del sistema.</string> <string name="nc_camera_permission_permanently_denied">Para permitir la comunicación de vídeo, concede el permiso de \"Cámara\" en la configuración del sistema.</string>
<string name="nc_cancel">Cancelar</string> <string name="nc_cancel">Cancelar</string>
<string name="nc_capabilities_failed">Fallo al recuperar capacidades. Abortando.</string> <string name="nc_capabilities_failed">Fallo al recuperar capacidades. Abortando.</string>
@ -207,6 +211,7 @@
<string name="nc_message_quote_cancel_reply">Cancelar respuesta</string> <string name="nc_message_quote_cancel_reply">Cancelar respuesta</string>
<string name="nc_message_read">Mensajes leídos</string> <string name="nc_message_read">Mensajes leídos</string>
<string name="nc_message_sent">Mensaje enviado</string> <string name="nc_message_sent">Mensaje enviado</string>
<string name="nc_microphone_permission_hint">Para habilitar la comunicación por voz, por favor, otorgue el permiso \"Micrófono\".</string>
<string name="nc_microphone_permission_permanently_denied">Para permitir la comunicación de voz, concede el permiso de \"Micrófono\" en la configuración del sistema.</string> <string name="nc_microphone_permission_permanently_denied">Para permitir la comunicación de voz, concede el permiso de \"Micrófono\" en la configuración del sistema.</string>
<string name="nc_missed_call">Perdiste una llamada de %s</string> <string name="nc_missed_call">Perdiste una llamada de %s</string>
<string name="nc_moderator">Moderador</string> <string name="nc_moderator">Moderador</string>
@ -240,7 +245,11 @@
<string name="nc_participants">Participantes</string> <string name="nc_participants">Participantes</string>
<string name="nc_participants_add">Añadir participantes</string> <string name="nc_participants_add">Añadir participantes</string>
<string name="nc_password">Contraseña</string> <string name="nc_password">Contraseña</string>
<string name="nc_permissions_ask">Establecer permisos</string>
<string name="nc_permissions_denied">Algunos permisos fueron denegados.</string>
<string name="nc_permissions_rationale_dialog_title">Por favor, otorgue los permisos</string>
<string name="nc_permissions_settings">Abrir configuración</string> <string name="nc_permissions_settings">Abrir configuración</string>
<string name="nc_permissions_settings_hint">Por favor, otorgue los permisos en Ajustes > Permisos</string>
<string name="nc_phone_book_integration_account_not_found">Cuenta no encontrada</string> <string name="nc_phone_book_integration_account_not_found">Cuenta no encontrada</string>
<string name="nc_phone_book_integration_chat_via">Chat a través de %s</string> <string name="nc_phone_book_integration_chat_via">Chat a través de %s</string>
<string name="nc_pip_microphone_mute">Silenciar micrófono</string> <string name="nc_pip_microphone_mute">Silenciar micrófono</string>

View File

@ -5,30 +5,50 @@
<string name="audio_output_bluetooth">بلوتوث</string> <string name="audio_output_bluetooth">بلوتوث</string>
<string name="audio_output_dialog_headline">خروجی صدا</string> <string name="audio_output_dialog_headline">خروجی صدا</string>
<string name="audio_output_phone">شماره تلفن</string> <string name="audio_output_phone">شماره تلفن</string>
<string name="audio_output_speaker">Speaker</string>
<string name="audio_output_wired_headset">Wired headset</string>
<string name="avatar">آواتار</string> <string name="avatar">آواتار</string>
<string name="away">دور</string> <string name="away">دور</string>
<string name="call_more_actions_dialog_headline">Advanced call options</string>
<string name="call_running_since_one_hour">The call has been running for one hour.</string>
<string name="call_without_notification">Call without notification</string>
<string name="camera_permission_granted">Camera permission granted. Please choose camera again.</string>
<string name="choose_avatar_from_cloud">Choose avatar from cloud</string>
<string name="clear_status_message">پیام وضعیت را پاک کن</string> <string name="clear_status_message">پیام وضعیت را پاک کن</string>
<string name="clear_status_message_after">بعد از آن پیام وضعیت را پاک کن </string> <string name="clear_status_message_after">بعد از آن پیام وضعیت را پاک کن </string>
<string name="close">بسته</string> <string name="close">بسته</string>
<string name="continuous_voice_message_recording">Lock recording for continuously recording of the voice message</string>
<string name="conversations">گفتگو</string> <string name="conversations">گفتگو</string>
<string name="danger_zone">Danger Zone</string>
<string name="delete_avatar">آواتار را پاک کن</string> <string name="delete_avatar">آواتار را پاک کن</string>
<string name="dnd">مزاحم نشوید</string> <string name="dnd">مزاحم نشوید</string>
<string name="dontClear">پاک نکن</string> <string name="dontClear">پاک نکن</string>
<string name="edit">ویرایش</string> <string name="edit">ویرایش</string>
<string name="emoji_backspace">Backspace</string>
<string name="emoji_category_recent">اخیر</string> <string name="emoji_category_recent">اخیر</string>
<string name="emoji_search">Search emoji</string>
<string name="encrypted">Encrypted</string>
<string name="error_loading_chats">There was a problem loading your chats</string>
<string name="failed_to_save">Failed to save %1$s</string>
<string name="file_list_folder">پوشه</string> <string name="file_list_folder">پوشه</string>
<string name="file_list_loading">بارگذاری …</string> <string name="file_list_loading">بارگذاری …</string>
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">۴ ساعت</string> <string name="fourHours">۴ ساعت</string>
<string name="invisible">نامرئی</string> <string name="invisible">نامرئی</string>
<string name="load_more_results">بار کردن نتیحه‌های بیش‌تر</string> <string name="load_more_results">بار کردن نتیحه‌های بیش‌تر</string>
<string name="lock_symbol">نماد قفل</string> <string name="lock_symbol">نماد قفل</string>
<string name="lower_hand">Lower hand</string>
<string name="mentioned">Mentioned</string>
<string name="menu_item_sort_by_date_newest_first">تازه‌ترین‌ها اول </string> <string name="menu_item_sort_by_date_newest_first">تازه‌ترین‌ها اول </string>
<string name="menu_item_sort_by_date_oldest_first">قدیمی‌ترین‌ها اول </string> <string name="menu_item_sort_by_date_oldest_first">قدیمی‌ترین‌ها اول </string>
<string name="menu_item_sort_by_name_a_z">الف تا ی</string> <string name="menu_item_sort_by_name_a_z">الف تا ی</string>
<string name="menu_item_sort_by_name_z_a">ی تا الف</string> <string name="menu_item_sort_by_name_z_a">ی تا الف</string>
<string name="menu_item_sort_by_size_biggest_first">بزرگترین اول</string> <string name="menu_item_sort_by_size_biggest_first">بزرگترین اول</string>
<string name="menu_item_sort_by_size_smallest_first">کوچک‌ترین اول</string> <string name="menu_item_sort_by_size_smallest_first">کوچک‌ترین اول</string>
<string name="message_poll_tap_to_open">Tap to open poll</string>
<string name="message_search_begin_empty">جستجو نتیجه‌ای نداشت</string> <string name="message_search_begin_empty">جستجو نتیجه‌ای نداشت</string>
<string name="message_search_begin_typing">Start typing to search …</string>
<string name="message_search_hint">Search …</string>
<string name="messages">پیام ها</string> <string name="messages">پیام ها</string>
<string name="nc_Server_account_imported"> حساب انتخاب‌شده اکنون وارد شده و در دسترس است .</string> <string name="nc_Server_account_imported"> حساب انتخاب‌شده اکنون وارد شده و در دسترس است .</string>
<string name="nc_about">درباره</string> <string name="nc_about">درباره</string>
@ -43,10 +63,33 @@
<string name="nc_add_to_favorites">افزودن‌ به مورد علاقه‌ها</string> <string name="nc_add_to_favorites">افزودن‌ به مورد علاقه‌ها</string>
<string name="nc_all_ok_operation">خوب ، همه انجام شد!</string> <string name="nc_all_ok_operation">خوب ، همه انجام شد!</string>
<string name="nc_allow_guests">اجازه میهمانان</string> <string name="nc_allow_guests">اجازه میهمانان</string>
<string name="nc_attendee_pin">Pin: %1$s</string>
<string name="nc_biometric_unlock">باز کردن %1$s</string> <string name="nc_biometric_unlock">باز کردن %1$s</string>
<string name="nc_bluetooth_permission_hint">To enable bluetooth speakers please grant \"Nearby devices\" permission.</string>
<string name="nc_call_button_content_description_advanced">Advanced call options</string>
<string name="nc_call_button_content_description_answer_video_call">Answer as video call</string>
<string name="nc_call_button_content_description_answer_voice_only">Answer as voice call only</string>
<string name="nc_call_button_content_description_audio_output">Change audio output</string>
<string name="nc_call_button_content_description_camera">Toggle camera</string>
<string name="nc_call_button_content_description_hangup">Hang up</string>
<string name="nc_call_button_content_description_microphone">Toggle microphone</string>
<string name="nc_call_button_content_description_pip">Open picture-in-picture mode</string>
<string name="nc_call_button_content_description_switch_to_self_vide">Switch to self video</string>
<string name="nc_call_incoming">INCOMING</string>
<string name="nc_call_name">نام مکالمه</string> <string name="nc_call_name">نام مکالمه</string>
<string name="nc_call_name_is_same">نامی که وارد کردید با نام موجود یکسان است</string> <string name="nc_call_name_is_same">نامی که وارد کردید با نام موجود یکسان است</string>
<string name="nc_call_notifications">Call notifications</string>
<string name="nc_call_raised_hand">%1$s raised the hand</string>
<string name="nc_call_reconnecting">Reconnecting …</string>
<string name="nc_call_ringing">RINGING</string>
<string name="nc_call_state_in_call">%1$s in call</string>
<string name="nc_call_state_with_phone">%1$s with phone</string>
<string name="nc_call_state_with_video">%1$s with video</string>
<string name="nc_call_timeout">در ۴۵ ثانیه پاسخی وجود نداشت ، برای آزمایش دوباره ضربه بزنید</string> <string name="nc_call_timeout">در ۴۵ ثانیه پاسخی وجود نداشت ، برای آزمایش دوباره ضربه بزنید</string>
<string name="nc_call_unknown">%s call</string>
<string name="nc_call_video">%s video call</string>
<string name="nc_call_voice">%s voice call</string>
<string name="nc_camera_permission_hint">To enable video communication please grant \"Camera\" permission.</string>
<string name="nc_camera_permission_permanently_denied">برای فعال کردن ارتباطات تصویری ، لطفاً اجازه استفاده از \"دوربین\" را در تنظیمات سیستم قرار دهید.</string> <string name="nc_camera_permission_permanently_denied">برای فعال کردن ارتباطات تصویری ، لطفاً اجازه استفاده از \"دوربین\" را در تنظیمات سیستم قرار دهید.</string>
<string name="nc_cancel">لغو</string> <string name="nc_cancel">لغو</string>
<string name="nc_capabilities_failed">دریافت قابلیت‌ها موفقیت‌آمیز نبود، درحال لغو</string> <string name="nc_capabilities_failed">دریافت قابلیت‌ها موفقیت‌آمیز نبود، درحال لغو</string>
@ -61,12 +104,16 @@
<string name="nc_clear_history_warning">آیا واقعا می‌خواهید تمام پیام‌ها را در این مکالمه حذف کنید؟</string> <string name="nc_clear_history_warning">آیا واقعا می‌خواهید تمام پیام‌ها را در این مکالمه حذف کنید؟</string>
<string name="nc_client_cert_change">تغییر گواهی مشتری</string> <string name="nc_client_cert_change">تغییر گواهی مشتری</string>
<string name="nc_client_cert_setup">گواهی مشتری تنظیم کنید</string> <string name="nc_client_cert_setup">گواهی مشتری تنظیم کنید</string>
<string name="nc_close_app">Close app</string>
<string name="nc_common_and">and</string>
<string name="nc_common_dismiss">پنهان کن</string> <string name="nc_common_dismiss">پنهان کن</string>
<string name="nc_common_error_sorry">متاسفیم؛ خطایی پیش آمد</string> <string name="nc_common_error_sorry">متاسفیم؛ خطایی پیش آمد</string>
<string name="nc_common_set">تنظیم</string> <string name="nc_common_set">تنظیم</string>
<string name="nc_common_skip">پرش</string> <string name="nc_common_skip">پرش</string>
<string name="nc_configure_cert_auth">گواهی تأیید اعتبار را انتخاب کنید</string> <string name="nc_configure_cert_auth">گواهی تأیید اعتبار را انتخاب کنید</string>
<string name="nc_connecting_call">Connecting …</string>
<string name="nc_contacts_done">انجام شد</string> <string name="nc_contacts_done">انجام شد</string>
<string name="nc_conversation_description">Conversation description</string>
<string name="nc_conversation_link">پیوند مکالمه</string> <string name="nc_conversation_link">پیوند مکالمه</string>
<string name="nc_conversation_menu_conversation_info">اطلاعات مکالمه</string> <string name="nc_conversation_menu_conversation_info">اطلاعات مکالمه</string>
<string name="nc_conversation_menu_video_call">تماس تصویری</string> <string name="nc_conversation_menu_video_call">تماس تصویری</string>
@ -75,6 +122,7 @@
<string name="nc_conversations_empty">عضو یک گفتگو شوید یا یک گفتگو جدید شروع کنید</string> <string name="nc_conversations_empty">عضو یک گفتگو شوید یا یک گفتگو جدید شروع کنید</string>
<string name="nc_conversations_empty_details">به رفقا و هم‌قطاران‌تان سلام کنید!</string> <string name="nc_conversations_empty_details">به رفقا و هم‌قطاران‌تان سلام کنید!</string>
<string name="nc_copy_message">کپی کردن</string> <string name="nc_copy_message">کپی کردن</string>
<string name="nc_create_poll">Create poll</string>
<string name="nc_date_header_today">امروز</string> <string name="nc_date_header_today">امروز</string>
<string name="nc_date_header_yesterday">دیروز</string> <string name="nc_date_header_yesterday">دیروز</string>
<string name="nc_delete">حذف</string> <string name="nc_delete">حذف</string>
@ -82,19 +130,34 @@
<string name="nc_delete_call">مکالمه را حذف کنید</string> <string name="nc_delete_call">مکالمه را حذف کنید</string>
<string name="nc_delete_conversation_more">اگر این مکالمه را حذف کنید ، برای سایر شرکت کنندگان نیز حذف خواهد شد.</string> <string name="nc_delete_conversation_more">اگر این مکالمه را حذف کنید ، برای سایر شرکت کنندگان نیز حذف خواهد شد.</string>
<string name="nc_delete_message">حذف</string> <string name="nc_delete_message">حذف</string>
<string name="nc_delete_message_leaked_to_matterbridge">Message deleted successfully, but it might have been leaked to other services</string>
<string name="nc_demote">تنزل مقام از مدیر</string> <string name="nc_demote">تنزل مقام از مدیر</string>
<string name="nc_description_record_voice">ضبط پیام صوتی</string> <string name="nc_description_record_voice">ضبط پیام صوتی</string>
<string name="nc_description_send_message_button">فرستادن پیام</string> <string name="nc_description_send_message_button">فرستادن پیام</string>
<string name="nc_dialog_invalid_password">گذرواژه نادرست</string> <string name="nc_dialog_invalid_password">گذرواژه نادرست</string>
<string name="nc_dialog_maintenance_mode">Maintenance mode</string>
<string name="nc_dialog_maintenance_mode_description">Server is currently in maintenance mode.</string>
<string name="nc_dialog_outdated_client">App is outdated</string>
<string name="nc_dialog_outdated_client_description">The app is too old and no longer supported by this server. Please update.</string>
<string name="nc_dialog_outdated_client_option_update">به‌روز رسانی</string> <string name="nc_dialog_outdated_client_option_update">به‌روز رسانی</string>
<string name="nc_dialog_reauth_or_delete">Do you want to reauthorize or delete this account?</string>
<string name="nc_display_name_not_fetched">امکان دریافت نام وجود ندارد. درحال لغو</string> <string name="nc_display_name_not_fetched">امکان دریافت نام وجود ندارد. درحال لغو</string>
<string name="nc_display_name_not_stored">"امکان ذخیره نام وجود ندارد، درحال لغو "</string> <string name="nc_display_name_not_stored">"امکان ذخیره نام وجود ندارد، درحال لغو "</string>
<string name="nc_email">رایانامه</string> <string name="nc_email">رایانامه</string>
<string name="nc_expire_message_eight_hours">8 ساعت</string>
<string name="nc_expire_message_four_weeks">4 weeks</string>
<string name="nc_expire_message_off">خاموش</string> <string name="nc_expire_message_off">خاموش</string>
<string name="nc_expire_message_one_day">1 روز</string>
<string name="nc_expire_message_one_hour">۱ ساعت</string> <string name="nc_expire_message_one_hour">۱ ساعت</string>
<string name="nc_expire_message_one_week">1 week</string>
<string name="nc_expire_messages">Expire chat messages</string>
<string name="nc_expire_messages_explanation">Chat messages can be expired after a certain time. Note: Files shared in chat will not be deleted for the owner, but will no longer be shared in the conversation.</string>
<string name="nc_external_server_failed">" دریافت تنظیمات سیگنال نا‌موفق بود"</string> <string name="nc_external_server_failed">" دریافت تنظیمات سیگنال نا‌موفق بود"</string>
<string name="nc_failed_signaling_settings">Target server does not support joining public conversations via mobile phones. You may attempt to join the conversation via web browser.</string>
<string name="nc_failed_to_perform_operation">با عرض پوزش، مشکلی پیش آمده</string> <string name="nc_failed_to_perform_operation">با عرض پوزش، مشکلی پیش آمده</string>
<string name="nc_file_browser_back">بازگشت</string> <string name="nc_file_browser_back">بازگشت</string>
<string name="nc_file_storage_permission">Permission for file access is required</string>
<string name="nc_filter">Filter Conversations</string>
<string name="nc_following_link"> کاربر پس از یک پیوند عمومی</string> <string name="nc_following_link"> کاربر پس از یک پیوند عمومی</string>
<string name="nc_formatted_message_you">شما: %1$s</string> <string name="nc_formatted_message_you">شما: %1$s</string>
<string name="nc_forward_message">ارسال کردن</string> <string name="nc_forward_message">ارسال کردن</string>
@ -104,40 +167,74 @@
<string name="nc_group">گروه</string> <string name="nc_group">گروه</string>
<string name="nc_groups">گروه ها</string> <string name="nc_groups">گروه ها</string>
<string name="nc_guest">مهمان</string> <string name="nc_guest">مهمان</string>
<string name="nc_guest_access">Guest access</string>
<string name="nc_guest_access_allow_failed">Cannot enable/disable guest access.</string>
<string name="nc_guest_access_allow_summary">Allow guests to share a public link to join this conversation.</string>
<string name="nc_guest_access_allow_title">اجازه میهمانان</string> <string name="nc_guest_access_allow_title">اجازه میهمانان</string>
<string name="nc_guest_access_password_dialog_hint">یک گذرواژه وارد کنید</string> <string name="nc_guest_access_password_dialog_hint">یک گذرواژه وارد کنید</string>
<string name="nc_guest_access_password_dialog_title">Guest access password</string>
<string name="nc_guest_access_password_failed">Error during setting/disabling the password.</string>
<string name="nc_guest_access_password_summary">Set a password to restrict who can use the public link.</string>
<string name="nc_guest_access_password_title">محافظت از رمز عبور</string> <string name="nc_guest_access_password_title">محافظت از رمز عبور</string>
<string name="nc_guest_access_password_weak_alert_title">رمز عبور ضعیف</string> <string name="nc_guest_access_password_weak_alert_title">رمز عبور ضعیف</string>
<string name="nc_guest_access_resend_invitations">Resend invitations</string>
<string name="nc_guest_access_resend_invitations_failed">Invitations were not send due to an error.</string>
<string name="nc_guest_access_resend_invitations_successful">Invitations were sent out again.</string>
<string name="nc_guest_access_share_link">Share conversation link</string>
<string name="nc_hint_enter_a_message">Enter a message …</string>
<string name="nc_important_conversation">گفتگوی مهم</string> <string name="nc_important_conversation">گفتگوی مهم</string>
<string name="nc_important_conversation_desc">Notifications in this conversation will override Do Not Disturb settings</string>
<string name="nc_join_via_link">با یک پیوند ملحق شوید</string> <string name="nc_join_via_link">با یک پیوند ملحق شوید</string>
<string name="nc_join_via_web">از طریق وب ملحق شوید</string> <string name="nc_join_via_web">از طریق وب ملحق شوید</string>
<string name="nc_last_moderator">قبل از ترک ، باید یک مدیر جدید را تعیین کنید %1$s.</string> <string name="nc_last_moderator">قبل از ترک ، باید یک مدیر جدید را تعیین کنید %1$s.</string>
<string name="nc_last_moderator_title">نمی توان مکالمه را ترک کرد</string> <string name="nc_last_moderator_title">نمی توان مکالمه را ترک کرد</string>
<string name="nc_last_modified">تغییرات %1$s | آخرین تغییرات: %2$s</string> <string name="nc_last_modified">تغییرات %1$s | آخرین تغییرات: %2$s</string>
<string name="nc_leave">ترک صحبت</string> <string name="nc_leave">ترک صحبت</string>
<string name="nc_leaving_call">Leaving call …</string>
<string name="nc_license_summary">مجوز عمومی عمومی گنو ، نسخه 3</string> <string name="nc_license_summary">مجوز عمومی عمومی گنو ، نسخه 3</string>
<string name="nc_license_title">مجوز</string> <string name="nc_license_title">مجوز</string>
<string name="nc_limit_hit">%sحد کاراکترها زده شده است</string> <string name="nc_limit_hit">%sحد کاراکترها زده شده است</string>
<string name="nc_list_open_conversations">List open conversations</string>
<string name="nc_lobby">لابی</string> <string name="nc_lobby">لابی</string>
<string name="nc_lobby_start_date">This meeting is scheduled for %1$s</string>
<string name="nc_lobby_start_soon">The meeting will start soon</string>
<string name="nc_lobby_waiting">شما در حال حاضر در لابی منتظر هستید.</string> <string name="nc_lobby_waiting">شما در حال حاضر در لابی منتظر هستید.</string>
<string name="nc_location_current_position_description">Your current location</string>
<string name="nc_location_permission_required">location permission is required</string>
<string name="nc_location_unknown">Position unknown</string>
<string name="nc_locked">Locked</string>
<string name="nc_locked_tap_to_unlock">برای باز کردن قفل ضربه بزنید</string> <string name="nc_locked_tap_to_unlock">برای باز کردن قفل ضربه بزنید</string>
<string name="nc_manual">تنظیم نشده</string> <string name="nc_manual">تنظیم نشده</string>
<string name="nc_mark_as_read">علامت به عنوان خوانده‌شده</string> <string name="nc_mark_as_read">علامت به عنوان خوانده‌شده</string>
<string name="nc_mark_as_unread">علامت به عنوان خوانده‌نشده</string> <string name="nc_mark_as_unread">علامت به عنوان خوانده‌نشده</string>
<string name="nc_message_failed_to_send">Failed to send message:</string>
<string name="nc_message_quote_cancel_reply">لغو پاسخ</string> <string name="nc_message_quote_cancel_reply">لغو پاسخ</string>
<string name="nc_message_read">Message read</string>
<string name="nc_message_sent">پیام ارسال شد</string> <string name="nc_message_sent">پیام ارسال شد</string>
<string name="nc_microphone_permission_hint">To enable voice communication please grant \"Microphone\" permission.</string>
<string name="nc_microphone_permission_permanently_denied">برای فعال کردن ارتباط صوتی ، لطفاً در \"تنظیمات سیستم\" اجازه استفاه از \"میکروفون\" را قرار دهید.</string> <string name="nc_microphone_permission_permanently_denied">برای فعال کردن ارتباط صوتی ، لطفاً در \"تنظیمات سیستم\" اجازه استفاه از \"میکروفون\" را قرار دهید.</string>
<string name="nc_missed_call">You missed a call from %s</string>
<string name="nc_moderator">مدیر</string> <string name="nc_moderator">مدیر</string>
<string name="nc_never">هرگز ملحق نشوید</string> <string name="nc_never">هرگز ملحق نشوید</string>
<string name="nc_new_conversation">مکالمه جدید</string> <string name="nc_new_conversation">مکالمه جدید</string>
<string name="nc_new_mention">Unread mentions</string>
<string name="nc_new_messages">پیام‌های خوانده نشده</string> <string name="nc_new_messages">پیام‌های خوانده نشده</string>
<string name="nc_new_password">گذرواژه جدید</string> <string name="nc_new_password">گذرواژه جدید</string>
<string name="nc_nextcloud_talk_app_not_installed">%1$s not available (not installed or restricted by admin)</string>
<string name="nc_nick_guest">مهمان</string> <string name="nc_nick_guest">مهمان</string>
<string name="nc_no">نه</string> <string name="nc_no">نه</string>
<string name="nc_no_open_conversations_headline">No open conversations</string>
<string name="nc_no_open_conversations_text">No open conversations that you can join.\nEither there are no open conversations or you already joined all of them.</string>
<string name="nc_no_proxy">پروکسی نیست</string> <string name="nc_no_proxy">پروکسی نیست</string>
<string name="nc_not_allowed_to_activate_audio">You are not allowed to activate audio!</string>
<string name="nc_not_allowed_to_activate_video">You are not allowed to activate video!</string>
<string name="nc_notification_channel">کانال اعلان %1$s روی %2$s</string> <string name="nc_notification_channel">کانال اعلان %1$s روی %2$s</string>
<string name="nc_notification_channel_calls">Calls</string>
<string name="nc_notification_channel_calls_description">Notify about incoming calls</string>
<string name="nc_notification_channel_messages">پیام ها</string> <string name="nc_notification_channel_messages">پیام ها</string>
<string name="nc_notification_channel_messages_description">Notify about incoming messages</string>
<string name="nc_notification_channel_uploads">آپلودها</string> <string name="nc_notification_channel_uploads">آپلودها</string>
<string name="nc_notification_channel_uploads_description">Notify about upload progress</string>
<string name="nc_notification_settings">تنظیمات اعلان</string> <string name="nc_notification_settings">تنظیمات اعلان</string>
<string name="nc_notify_me_always">همیشه اعلان شود</string> <string name="nc_notify_me_always">همیشه اعلان شود</string>
<string name="nc_notify_me_mention">وقتی ذکر شد اطلاع دهید</string> <string name="nc_notify_me_mention">وقتی ذکر شد اطلاع دهید</string>
@ -148,7 +245,15 @@
<string name="nc_participants">شركت كنندگان</string> <string name="nc_participants">شركت كنندگان</string>
<string name="nc_participants_add">افزودن عضو</string> <string name="nc_participants_add">افزودن عضو</string>
<string name="nc_password">گذرواژه</string> <string name="nc_password">گذرواژه</string>
<string name="nc_permissions_ask">Set permissions</string>
<string name="nc_permissions_denied">Some permissions were denied.</string>
<string name="nc_permissions_rationale_dialog_title">Please allow permissions</string>
<string name="nc_permissions_settings">تنظیمات را باز کنید</string> <string name="nc_permissions_settings">تنظیمات را باز کنید</string>
<string name="nc_permissions_settings_hint">Please grant permissions at Settings > Permissions</string>
<string name="nc_phone_book_integration_account_not_found">Account not found</string>
<string name="nc_phone_book_integration_chat_via">Chat via %s</string>
<string name="nc_pip_microphone_mute">Mute microphone</string>
<string name="nc_pip_microphone_unmute">Enable microphone</string>
<string name="nc_plain_old_messages">پیام ها</string> <string name="nc_plain_old_messages">پیام ها</string>
<string name="nc_privacy">حریم خصوصی</string> <string name="nc_privacy">حریم خصوصی</string>
<string name="nc_proceed">ادامه</string> <string name="nc_proceed">ادامه</string>
@ -159,10 +264,14 @@
<string name="nc_push_disabled">دریافت اعلانات غیرفعال است</string> <string name="nc_push_disabled">دریافت اعلانات غیرفعال است</string>
<string name="nc_push_to_talk">برای صحبت کردن فشار دهید</string> <string name="nc_push_to_talk">برای صحبت کردن فشار دهید</string>
<string name="nc_push_to_talk_desc">با غیر فعال کردن میکروفن، برای استفاده از Push-to-talk کلیک &amp; نگه‌داشتن را انجام دهید</string> <string name="nc_push_to_talk_desc">با غیر فعال کردن میکروفن، برای استفاده از Push-to-talk کلیک &amp; نگه‌داشتن را انجام دهید</string>
<string name="nc_remote_audio_off">Remote audio off</string>
<string name="nc_remove_circle_and_members">Remove circle and members</string>
<string name="nc_remove_from_favorites">حذف کردن از مورد علاقه‌ها</string> <string name="nc_remove_from_favorites">حذف کردن از مورد علاقه‌ها</string>
<string name="nc_remove_group_and_members">Remove group and members</string>
<string name="nc_remove_participant">شرکت کننده را حذف کنید</string> <string name="nc_remove_participant">شرکت کننده را حذف کنید</string>
<string name="nc_rename">تغییر نام مکالمه</string> <string name="nc_rename">تغییر نام مکالمه</string>
<string name="nc_reply">پاسخ</string> <string name="nc_reply">پاسخ</string>
<string name="nc_reply_privately">Reply privately</string>
<string name="nc_screen_lock_timeout_30">۳۰ ثانیه</string> <string name="nc_screen_lock_timeout_30">۳۰ ثانیه</string>
<string name="nc_screen_lock_timeout_300">۵ دقیقه</string> <string name="nc_screen_lock_timeout_300">۵ دقیقه</string>
<string name="nc_screen_lock_timeout_60">۱ دقیقه</string> <string name="nc_screen_lock_timeout_60">۱ دقیقه</string>
@ -173,6 +282,7 @@
<string name="nc_screen_lock_timeout_three_hundred">۳۰۰</string> <string name="nc_screen_lock_timeout_three_hundred">۳۰۰</string>
<string name="nc_search">جستجو</string> <string name="nc_search">جستجو</string>
<string name="nc_select_an_account">یک حساب کاربری انتخاب کنید</string> <string name="nc_select_an_account">یک حساب کاربری انتخاب کنید</string>
<string name="nc_select_participants">Select participants</string>
<string name="nc_sent_a_gif" formatted="true">ارسال یک GIF %1$s.</string> <string name="nc_sent_a_gif" formatted="true">ارسال یک GIF %1$s.</string>
<string name="nc_sent_a_gif_you">شما یک GIF ارسال کردید.</string> <string name="nc_sent_a_gif_you">شما یک GIF ارسال کردید.</string>
<string name="nc_sent_a_video" formatted="true">ارسال یک فایل ویدئو %1$s.</string> <string name="nc_sent_a_video" formatted="true">ارسال یک فایل ویدئو %1$s.</string>
@ -183,6 +293,12 @@
<string name="nc_sent_an_audio_you">شما صوتی ارسال کردید.</string> <string name="nc_sent_an_audio_you">شما صوتی ارسال کردید.</string>
<string name="nc_sent_an_image" formatted="true">ارسال یک تصویر %1$s.</string> <string name="nc_sent_an_image" formatted="true">ارسال یک تصویر %1$s.</string>
<string name="nc_sent_an_image_you">شما یک تصویر ارسال کردید</string> <string name="nc_sent_an_image_you">شما یک تصویر ارسال کردید</string>
<string name="nc_sent_location" formatted="true">%1$s sent a location.</string>
<string name="nc_sent_location_you">You sent a location.</string>
<string name="nc_sent_poll" formatted="true">%1$s sent a poll.</string>
<string name="nc_sent_poll_you">You sent a poll.</string>
<string name="nc_sent_voice" formatted="true">%1$s sent a voice message.</string>
<string name="nc_sent_voice_you">You sent a voice message.</string>
<string name="nc_server_connect">آزمایش اتصال به سرور</string> <string name="nc_server_connect">آزمایش اتصال به سرور</string>
<string name="nc_server_db_upgrade_needed">لطفا پایگاه داده %1$s خود را ارتقا دهید</string> <string name="nc_server_db_upgrade_needed">لطفا پایگاه داده %1$s خود را ارتقا دهید</string>
<string name="nc_server_failed_to_import_account">" وارد کردن حساب انتخاب‌شده موفقیت آمیز نبود"</string> <string name="nc_server_failed_to_import_account">" وارد کردن حساب انتخاب‌شده موفقیت آمیز نبود"</string>
@ -201,6 +317,7 @@
<string name="nc_settings_account_updated">به جای اضافه کردن حساب جدید، حساب از قبل موجود شما بروز شد</string> <string name="nc_settings_account_updated">به جای اضافه کردن حساب جدید، حساب از قبل موجود شما بروز شد</string>
<string name="nc_settings_advanced_title">پیشرفته</string> <string name="nc_settings_advanced_title">پیشرفته</string>
<string name="nc_settings_appearance">ظاهر</string> <string name="nc_settings_appearance">ظاهر</string>
<string name="nc_settings_call_ringtone">Calls</string>
<string name="nc_settings_incognito_keyboard_desc">دستورالعمل صفحه کلید را برای غیرفعال کردن یادگیری شخصی (بدون ضمانت)</string> <string name="nc_settings_incognito_keyboard_desc">دستورالعمل صفحه کلید را برای غیرفعال کردن یادگیری شخصی (بدون ضمانت)</string>
<string name="nc_settings_incognito_keyboard_title">صفحه کلید ناشناس</string> <string name="nc_settings_incognito_keyboard_title">صفحه کلید ناشناس</string>
<string name="nc_settings_no_ringtone">بدون صدا</string> <string name="nc_settings_no_ringtone">بدون صدا</string>
@ -208,11 +325,21 @@
<string name="nc_settings_notification_sounds">صدا</string> <string name="nc_settings_notification_sounds">صدا</string>
<string name="nc_settings_notification_sounds_post_oreo">آگاهی‌ها</string> <string name="nc_settings_notification_sounds_post_oreo">آگاهی‌ها</string>
<string name="nc_settings_other_notifications_ringtone">پیام ها</string> <string name="nc_settings_other_notifications_ringtone">پیام ها</string>
<string name="nc_settings_phone_book_integration_desc">Match contacts based on phone number to integrate Talk shortcut into system contacts app</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_description">You can set your phone number so other users will be able to find you</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_invalid">Invalid phone number</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_success">Phone number set successfully</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_title">شماره تلفن</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_title">شماره تلفن</string>
<string name="nc_settings_phone_book_integration_title">Phone number integration</string>
<string name="nc_settings_privacy">حریم خصوصی</string> <string name="nc_settings_privacy">حریم خصوصی</string>
<string name="nc_settings_proxy_host_title">میزبان پروکسی</string> <string name="nc_settings_proxy_host_title">میزبان پروکسی</string>
<string name="nc_settings_proxy_password_title">Proxy password</string>
<string name="nc_settings_proxy_port_title">پورت پروکسی</string> <string name="nc_settings_proxy_port_title">پورت پروکسی</string>
<string name="nc_settings_proxy_type_title">نوع پروکسی</string> <string name="nc_settings_proxy_type_title">نوع پروکسی</string>
<string name="nc_settings_proxy_username_title">Proxy username</string>
<string name="nc_settings_read_privacy_desc">Share my read-status and show the read-status of others</string>
<string name="nc_settings_read_privacy_title">Read status</string>
<string name="nc_settings_reauthorize">Reauthorize account</string>
<string name="nc_settings_remove">حذف</string> <string name="nc_settings_remove">حذف</string>
<string name="nc_settings_remove_account">حذف حساب کاربری</string> <string name="nc_settings_remove_account">حذف حساب کاربری</string>
<string name="nc_settings_remove_confirmation">لطفاً قصد خود را برای حذف حساب جاری تأیید کنید.</string> <string name="nc_settings_remove_confirmation">لطفاً قصد خود را برای حذف حساب جاری تأیید کنید.</string>
@ -221,39 +348,96 @@
<string name="nc_settings_screen_lock_title">قفل صفحه</string> <string name="nc_settings_screen_lock_title">قفل صفحه</string>
<string name="nc_settings_screen_security_desc">از گرفتن عکسهای صفحه در لیست اخیر و داخل برنامه جلوگیری می کند</string> <string name="nc_settings_screen_security_desc">از گرفتن عکسهای صفحه در لیست اخیر و داخل برنامه جلوگیری می کند</string>
<string name="nc_settings_screen_security_title">امنیت صفحه نمایش</string> <string name="nc_settings_screen_security_title">امنیت صفحه نمایش</string>
<string name="nc_settings_server_almost_eol">The server version is very old and will not be supported in the next release!</string>
<string name="nc_settings_server_eol">The server version is too old and not supported by this version of the Android app</string>
<string name="nc_settings_server_eol_title">Unsupported server</string>
<string name="nc_settings_theme_battery_saver">تنظیم شده توسط ذخیره نیرو</string> <string name="nc_settings_theme_battery_saver">تنظیم شده توسط ذخیره نیرو</string>
<string name="nc_settings_theme_dark">تیره</string> <string name="nc_settings_theme_dark">تیره</string>
<string name="nc_settings_theme_follow_system">از پیش‌فرض سیستم استفاده کنید</string> <string name="nc_settings_theme_follow_system">از پیش‌فرض سیستم استفاده کنید</string>
<string name="nc_settings_theme_key">تم</string> <string name="nc_settings_theme_key">تم</string>
<string name="nc_settings_theme_light">روشن</string> <string name="nc_settings_theme_light">روشن</string>
<string name="nc_settings_theme_title">تم</string> <string name="nc_settings_theme_title">تم</string>
<string name="nc_settings_typing_status_desc">Share my typing-status and show the typing-status of others</string>
<string name="nc_settings_typing_status_hpb_description">Typing status is only available when using a high performance backend (HPB)</string>
<string name="nc_settings_typing_status_title">Typing status</string>
<string name="nc_settings_use_credentials_title">Proxy requires credentials</string>
<string name="nc_settings_warning">هشدار</string> <string name="nc_settings_warning">هشدار</string>
<string name="nc_settings_wrong_account">فقط حساب کاربری فعلی قابل گرفتن مجوز مجدد است</string> <string name="nc_settings_wrong_account">فقط حساب کاربری فعلی قابل گرفتن مجوز مجدد است</string>
<string name="nc_share_contact">Share contact</string>
<string name="nc_share_contact_permission">Permission to read contacts is required</string>
<string name="nc_share_current_location">Share current location</string>
<string name="nc_share_location">Share location</string>
<string name="nc_share_subject">دعوت %1$s</string> <string name="nc_share_subject">دعوت %1$s</string>
<string name="nc_share_text">به مکالمه %1$s/index.php/call/%2$s ملحق شوید</string> <string name="nc_share_text">به مکالمه %1$s/index.php/call/%2$s ملحق شوید</string>
<string name="nc_share_text_pass">رمز عبور: %1$s</string> <string name="nc_share_text_pass">رمز عبور: %1$s</string>
<string name="nc_share_this_location">اشتراک این مکان</string> <string name="nc_share_this_location">اشتراک این مکان</string>
<string name="nc_share_to_choose_account">حساب کاربری را انتخاب کنید</string> <string name="nc_share_to_choose_account">حساب کاربری را انتخاب کنید</string>
<string name="nc_shared_items">Shared items</string>
<string name="nc_shared_items_deck_card">کارت deck</string> <string name="nc_shared_items_deck_card">کارت deck</string>
<string name="nc_shared_items_description">Images, files, voice messages …</string>
<string name="nc_shared_items_empty">No shared items</string>
<string name="nc_shared_items_location">محل</string> <string name="nc_shared_items_location">محل</string>
<string name="nc_shared_location">Shared location</string>
<string name="nc_sort_by">مرتب‌سازی بر اساس</string> <string name="nc_sort_by">مرتب‌سازی بر اساس</string>
<string name="nc_start_time">زمان شروع</string> <string name="nc_start_time">زمان شروع</string>
<string name="nc_switch_account">تعویض حساب</string> <string name="nc_switch_account">تعویض حساب</string>
<string name="nc_upload_choose_local_files">Choose files</string>
<string name="nc_upload_confirm_send_multiple">Send these files to %1$s?</string>
<string name="nc_upload_confirm_send_single">Send this file to %1$s?</string>
<string name="nc_upload_failed">Sorry, upload failed</string>
<string name="nc_upload_failed_notification_text">Failed to upload %1$s</string>
<string name="nc_upload_failed_notification_title">Failure</string>
<string name="nc_upload_from_cloud">Share from %1$s</string>
<string name="nc_upload_from_device">Upload from device</string>
<string name="nc_upload_in_progess">در حال آپلود</string> <string name="nc_upload_in_progess">در حال آپلود</string>
<string name="nc_upload_notification_text">%1$s to %2$s - %3$s\%%</string>
<string name="nc_upload_picture_from_cam">عکس گرفتن</string> <string name="nc_upload_picture_from_cam">عکس گرفتن</string>
<string name="nc_upload_video_from_cam">Take video</string>
<string name="nc_user">کاربر</string> <string name="nc_user">کاربر</string>
<string name="nc_video_filename">Video recording from %1$s</string>
<string name="nc_voice_message_filename">Talk recording from %1$s (%2$s)</string>
<string name="nc_voice_message_hold_to_record_info">Hold to record, release to send.</string>
<string name="nc_voice_message_missing_audio_permission">Permission for audio recording is required</string>
<string name="nc_voice_message_slide_to_cancel">« Slide to cancel</string>
<string name="nc_webinar">وبینار</string> <string name="nc_webinar">وبینار</string>
<string name="nc_wrong_link">پیوند مکالمه معتبر نیست</string> <string name="nc_wrong_link">پیوند مکالمه معتبر نیست</string>
<string name="nc_wrong_password">کلمه عبور اشتباه</string> <string name="nc_wrong_password">کلمه عبور اشتباه</string>
<string name="nc_yes">بله</string> <string name="nc_yes">بله</string>
<string name="no_phone_book_integration_due_to_permissions">No phone number integration due to missing permissions</string>
<string name="oneHour">۱ ساعت</string> <string name="oneHour">۱ ساعت</string>
<string name="online">آنلاین</string> <string name="online">آنلاین</string>
<string name="online_status">وضعیت آنلاین</string> <string name="online_status">وضعیت آنلاین</string>
<string name="openConversations">مکالمه جدید</string> <string name="openConversations">مکالمه جدید</string>
<string name="open_in_files_app">Open in Files app</string>
<string name="play_pause_voice_message">Play/pause voice message</string>
<string name="polls_add_option">Add option</string>
<string name="polls_edit_vote">Edit vote</string>
<string name="polls_end_poll">End poll</string>
<string name="polls_end_poll_confirm">Do you really want to end this poll? This cannot be undone.</string>
<string name="polls_max_votes_reached">You cannot vote with more options for this poll.</string>
<string name="polls_multiple_answers">Multiple answers</string>
<string name="polls_option_delete">Delete option %1$s</string>
<string name="polls_option_hint">Option %1$s</string>
<string name="polls_options">گزینه‌ها</string> <string name="polls_options">گزینه‌ها</string>
<string name="polls_private_poll">Private poll</string>
<string name="polls_question">Question</string>
<string name="polls_question_hint">Your question</string>
<string name="polls_results_subtitle">نتایج</string> <string name="polls_results_subtitle">نتایج</string>
<string name="polls_settings">تنظیمات</string> <string name="polls_settings">تنظیمات</string>
<string name="polls_submit_vote">Vote</string>
<string name="polls_voted_hidden_success">Vote submitted</string>
<string name="raise_hand">Raise hand</string>
<string name="reactions_tab_all">همه</string> <string name="reactions_tab_all">همه</string>
<string name="read_storage_no_permission">Sharing files from storage is not possible without permissions</string>
<string name="record_active_info">The call is being recorded</string>
<string name="record_cancel_start">Cancel recording start</string>
<string name="record_failed_info">The recording failed. Please contact your administrator.</string>
<string name="record_start_description">Start recording</string>
<string name="record_stop_confirm_message">Do you really want to stop the recording?</string>
<string name="record_stop_confirm_title">Stop Call recording</string>
<string name="record_stop_description">Stop recording</string>
<string name="record_stopping">Stopping recording …</string>
<string name="restrict_join_other_room_while_call">It\'s not possible to join other rooms while being in a call</string>
<string name="save">ذخیره</string> <string name="save">ذخیره</string>
<string name="scope_federated_description">فقط با سرورهای قابل اعتماد همگام سازی شود</string> <string name="scope_federated_description">فقط با سرورهای قابل اعتماد همگام سازی شود</string>
<string name="scope_federated_title">فدرال</string> <string name="scope_federated_title">فدرال</string>
@ -263,8 +447,16 @@
<string name="scope_private_title">خصوصی</string> <string name="scope_private_title">خصوصی</string>
<string name="scope_published_description">با سرورهای قابل اعتماد و دفترچه آدرس عمومی و همگانی همگام سازی شود</string> <string name="scope_published_description">با سرورهای قابل اعتماد و دفترچه آدرس عمومی و همگانی همگام سازی شود</string>
<string name="scope_published_title">منتشر شده</string> <string name="scope_published_title">منتشر شده</string>
<string name="scope_toggle">Scope toggle</string>
<string name="scope_toggle_description">Change privacy level of %1$s</string>
<string name="scroll_to_bottom">Scroll to bottom</string>
<string name="secondsAgo">یک ثانیه پیش</string> <string name="secondsAgo">یک ثانیه پیش</string>
<string name="selected_list_item">انتخاب شد</string> <string name="selected_list_item">انتخاب شد</string>
<string name="send_to">Send to</string>
<string name="send_to_forbidden">You are not allowed to share content to this chat</string>
<string name="send_to_three_dots">Send to …</string>
<string name="send_without_notification">Send without notification</string>
<string name="set_avatar_from_camera">Set avatar from camera</string>
<string name="set_status">تنظیم وضعیت</string> <string name="set_status">تنظیم وضعیت</string>
<string name="set_status_message">تنظیم پیام وضعیت</string> <string name="set_status_message">تنظیم پیام وضعیت</string>
<string name="share">هم‌رسانی</string> <string name="share">هم‌رسانی</string>
@ -272,21 +464,43 @@
<string name="shared_items_file">فایل</string> <string name="shared_items_file">فایل</string>
<string name="shared_items_media">رسانه‌ها</string> <string name="shared_items_media">رسانه‌ها</string>
<string name="shared_items_other">اعلان‌ها</string> <string name="shared_items_other">اعلان‌ها</string>
<string name="shared_items_poll">Poll</string>
<string name="shared_items_recording">Call recording</string>
<string name="shared_items_voice">صدا</string> <string name="shared_items_voice">صدا</string>
<string name="starred">مورد‌ ‌علاقه‌</string> <string name="starred">مورد‌ ‌علاقه‌</string>
<string name="startCallForbidden">You are not allowed to start a call</string>
<string name="status_message">پیغام وضعیت</string> <string name="status_message">پیغام وضعیت</string>
<string name="switch_to_breakout_room">Switch to breakout room</string>
<string name="switch_to_main_room">Switch to main room</string>
<string name="take_photo">عکس گرفتن</string> <string name="take_photo">عکس گرفتن</string>
<string name="take_photo_error_deleting_picture">Error taking picture</string>
<string name="take_photo_permission">Taking a photo is not possible without permissions</string>
<string name="take_photo_retake_photo">Re-take photo</string>
<string name="take_photo_send">ارسال</string> <string name="take_photo_send">ارسال</string>
<string name="take_photo_switch_camera">دوربین را عوض کنید</string> <string name="take_photo_switch_camera">دوربین را عوض کنید</string>
<string name="take_photo_toggle_crop">Crop photo</string>
<string name="take_photo_toggle_lowres">Reduce image size</string>
<string name="take_photo_toggle_torch">تغییر مشعل</string> <string name="take_photo_toggle_torch">تغییر مشعل</string>
<string name="thirtyMinutes">۳۰ دقیقه</string> <string name="thirtyMinutes">۳۰ دقیقه</string>
<string name="thisWeek">این هفته</string> <string name="thisWeek">این هفته</string>
<string name="this_is_a_test_message">This is a test message</string>
<string name="title_attachments">پیوست ها</string> <string name="title_attachments">پیوست ها</string>
<string name="today">امروز</string> <string name="today">امروز</string>
<string name="translate">ترجمه</string> <string name="translate">ترجمه</string>
<string name="translation">Translation</string>
<string name="translation_copy_translated_text">Copy translated text</string>
<string name="translation_detect_language">Detect language</string>
<string name="translation_device_settings">تنظیمات افزاره</string> <string name="translation_device_settings">تنظیمات افزاره</string>
<string name="translation_error_message">Could not detect language</string>
<string name="translation_error_title">Translation failed</string>
<string name="translation_from">از</string> <string name="translation_from">از</string>
<string name="translation_to">به</string> <string name="translation_to">به</string>
<string name="typing_1_other">and 1 other is typing …</string>
<string name="typing_are_typing">are typing …</string>
<string name="typing_is_typing">is typing …</string>
<string name="typing_x_others">and %1$s others are typing …</string>
<string name="unread">Unread</string>
<string name="upload_new_avatar_from_device">Upload new avatar from device</string>
<string name="user_info_address">نشانی</string> <string name="user_info_address">نشانی</string>
<string name="user_info_displayname">نام کامل</string> <string name="user_info_displayname">نام کامل</string>
<string name="user_info_email">رایانامه</string> <string name="user_info_email">رایانامه</string>
@ -294,7 +508,12 @@
<string name="user_info_twitter">توییتر</string> <string name="user_info_twitter">توییتر</string>
<string name="user_info_website">وب‌ سایت</string> <string name="user_info_website">وب‌ سایت</string>
<string name="user_status">وضعیت</string> <string name="user_status">وضعیت</string>
<string name="userinfo_error_text">Failed to retrieve personal user information.</string>
<string name="userinfo_no_info_headline">اطلاعات شخصی تنطیم نشده</string> <string name="userinfo_no_info_headline">اطلاعات شخصی تنطیم نشده</string>
<string name="userinfo_no_info_text">نام، تصویر و اطلاعات تماس را در صفحه نمایه خود اضافه کنید.</string> <string name="userinfo_no_info_text">نام، تصویر و اطلاعات تماس را در صفحه نمایه خود اضافه کنید.</string>
<string name="whats_your_status">وضعیت شما چیست؟</string> <string name="whats_your_status">وضعیت شما چیست؟</string>
</resources> <plurals name="polls_amount_voters">
<item quantity="one">%d vote</item>
<item quantity="other">%d votes</item>
</plurals>
</resources>

View File

@ -249,7 +249,7 @@
<string name="nc_privacy">Vie privée</string> <string name="nc_privacy">Vie privée</string>
<string name="nc_proceed">Continuer</string> <string name="nc_proceed">Continuer</string>
<string name="nc_profile_personal_info_title">Informations personnelles</string> <string name="nc_profile_personal_info_title">Informations personnelles</string>
<string name="nc_promote">Promouvoir en modérateur</string> <string name="nc_promote">Promouvoir comme modérateur</string>
<string name="nc_public_call">Nouvelle conversation publique</string> <string name="nc_public_call">Nouvelle conversation publique</string>
<string name="nc_public_call_explanation">Les conversations publiques vous permettent d\'inviter des personnes extérieures grâce à un lien spécialement créé.</string> <string name="nc_public_call_explanation">Les conversations publiques vous permettent d\'inviter des personnes extérieures grâce à un lien spécialement créé.</string>
<string name="nc_push_disabled">Notifications push désactivées</string> <string name="nc_push_disabled">Notifications push désactivées</string>
@ -332,7 +332,7 @@
<string name="nc_settings_read_privacy_title">Statut de lecture</string> <string name="nc_settings_read_privacy_title">Statut de lecture</string>
<string name="nc_settings_reauthorize">Ré-autoriser le compte</string> <string name="nc_settings_reauthorize">Ré-autoriser le compte</string>
<string name="nc_settings_remove">Effacer</string> <string name="nc_settings_remove">Effacer</string>
<string name="nc_settings_remove_account">Supprimer le compte</string> <string name="nc_settings_remove_account">Retirer le compte</string>
<string name="nc_settings_remove_confirmation">Veuillez confirmer votre volonté de supprimer le compte actuel.</string> <string name="nc_settings_remove_confirmation">Veuillez confirmer votre volonté de supprimer le compte actuel.</string>
<string name="nc_settings_screen_lock_desc">Verrouiller %1$s avec le verrouillage décran Android ou une méthode biométrique supportée</string> <string name="nc_settings_screen_lock_desc">Verrouiller %1$s avec le verrouillage décran Android ou une méthode biométrique supportée</string>
<string name="nc_settings_screen_lock_timeout_title">Délai d\'inactivité avant verrouillage de l\'écran</string> <string name="nc_settings_screen_lock_timeout_title">Délai d\'inactivité avant verrouillage de l\'écran</string>

View File

@ -151,7 +151,7 @@
<string name="nc_expire_message_one_hour">1 hora</string> <string name="nc_expire_message_one_hour">1 hora</string>
<string name="nc_expire_message_one_week">1 semana</string> <string name="nc_expire_message_one_week">1 semana</string>
<string name="nc_expire_messages">Caducidade das mensaxes das parolas</string> <string name="nc_expire_messages">Caducidade das mensaxes das parolas</string>
<string name="nc_expire_messages_explanation">As mensaxes das parolas poden caducar após dun tempo determinado. Nota: os ficheiros compartidos na parola non se eliminarán para o propietario, mais xa non se compartirán na conversa.</string> <string name="nc_expire_messages_explanation">As mensaxes das parolas poden caducar após dun tempo determinado. Nota: Os ficheiros compartidos na parola non se eliminarán para o propietario, mais xa non se compartirán na conversa.</string>
<string name="nc_external_server_failed">Produciuse un fallo ao recuperar os axustes da sinalización</string> <string name="nc_external_server_failed">Produciuse un fallo ao recuperar os axustes da sinalización</string>
<string name="nc_failed_signaling_settings">O servidor de destino non admite unirse a conversas públicas mediante teléfonos móbiles. Pode tentar unirse á chamada empregando o navegador web.</string> <string name="nc_failed_signaling_settings">O servidor de destino non admite unirse a conversas públicas mediante teléfonos móbiles. Pode tentar unirse á chamada empregando o navegador web.</string>
<string name="nc_failed_to_perform_operation">Desculpe, algo foi mal!</string> <string name="nc_failed_to_perform_operation">Desculpe, algo foi mal!</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">有線ヘッドセット</string> <string name="audio_output_wired_headset">有線ヘッドセット</string>
<string name="avatar">アバター</string> <string name="avatar">アバター</string>
<string name="away">離席中</string> <string name="away">離席中</string>
<string name="call_running_since_one_hour">通話が1 時間経過</string>
<string name="call_without_notification">通知なしで通話</string> <string name="call_without_notification">通知なしで通話</string>
<string name="choose_avatar_from_cloud">クラウドからアバターを選択</string> <string name="choose_avatar_from_cloud">クラウドからアバターを選択</string>
<string name="clear_status_message">ステータスメッセージを消去</string> <string name="clear_status_message">ステータスメッセージを消去</string>
@ -137,6 +138,7 @@
<string name="nc_group">グループ</string> <string name="nc_group">グループ</string>
<string name="nc_groups">グループ</string> <string name="nc_groups">グループ</string>
<string name="nc_guest">ゲスト</string> <string name="nc_guest">ゲスト</string>
<string name="nc_guest_access">ゲスト参加</string>
<string name="nc_guest_access_allow_title">ゲストを許可</string> <string name="nc_guest_access_allow_title">ゲストを許可</string>
<string name="nc_guest_access_password_dialog_hint">パスワードを入力</string> <string name="nc_guest_access_password_dialog_hint">パスワードを入力</string>
<string name="nc_guest_access_password_summary">パスワードを設定して、パブリックリンクを使用できるユーザーを制限します。</string> <string name="nc_guest_access_password_summary">パスワードを設定して、パブリックリンクを使用できるユーザーを制限します。</string>
@ -359,6 +361,9 @@
<string name="raise_hand">挙手 (r)</string> <string name="raise_hand">挙手 (r)</string>
<string name="reactions_tab_all">すべて</string> <string name="reactions_tab_all">すべて</string>
<string name="read_storage_no_permission">ストレージからのファイル共有は権限がなければ不可能です</string> <string name="read_storage_no_permission">ストレージからのファイル共有は権限がなければ不可能です</string>
<string name="record_cancel_start">録画開始をキャンセル</string>
<string name="record_start_description">録画を開始</string>
<string name="record_stop_description">録画を停止</string>
<string name="save">保存</string> <string name="save">保存</string>
<string name="scope_federated_description">信頼できるサーバーのみと同期</string> <string name="scope_federated_description">信頼できるサーバーのみと同期</string>
<string name="scope_federated_title">連携</string> <string name="scope_federated_title">連携</string>

View File

@ -311,6 +311,7 @@
<string name="thisWeek">Denne uken</string> <string name="thisWeek">Denne uken</string>
<string name="title_attachments">Vedlegg</string> <string name="title_attachments">Vedlegg</string>
<string name="today">I dag</string> <string name="today">I dag</string>
<string name="translate">Oversette</string>
<string name="translation_device_settings">Enhetsinnstillinger</string> <string name="translation_device_settings">Enhetsinnstillinger</string>
<string name="translation_from">Fra</string> <string name="translation_from">Fra</string>
<string name="translation_to">Til</string> <string name="translation_to">Til</string>

View File

@ -10,6 +10,7 @@
<string name="avatar">Аватар</string> <string name="avatar">Аватар</string>
<string name="away">Отошёл</string> <string name="away">Отошёл</string>
<string name="call_more_actions_dialog_headline">Дополнительные настройки звонка</string> <string name="call_more_actions_dialog_headline">Дополнительные настройки звонка</string>
<string name="call_running_since_one_hour">Звонок длится уже час</string>
<string name="call_without_notification">Звонок без уведомления</string> <string name="call_without_notification">Звонок без уведомления</string>
<string name="camera_permission_granted">Разрешение на камеру получено. Пожалуйста, выберите камеру снова.</string> <string name="camera_permission_granted">Разрешение на камеру получено. Пожалуйста, выберите камеру снова.</string>
<string name="choose_avatar_from_cloud">Выберите аватар из облака</string> <string name="choose_avatar_from_cloud">Выберите аватар из облака</string>

View File

@ -10,12 +10,14 @@
<string name="avatar">Аватар</string> <string name="avatar">Аватар</string>
<string name="away">Одсутан</string> <string name="away">Одсутан</string>
<string name="call_more_actions_dialog_headline">Напредне опције позива</string> <string name="call_more_actions_dialog_headline">Напредне опције позива</string>
<string name="call_running_since_one_hour">Позив траје један сат.</string>
<string name="call_without_notification">Позив без обавештења</string> <string name="call_without_notification">Позив без обавештења</string>
<string name="camera_permission_granted">Дозвољен је приступ камери. Молимо вас да поново изаберете камеру</string> <string name="camera_permission_granted">Дозвољен је приступ камери. Молимо вас да поново изаберете камеру</string>
<string name="choose_avatar_from_cloud">Изаберите аватар из облака</string> <string name="choose_avatar_from_cloud">Изаберите аватар из облака</string>
<string name="clear_status_message">Обриши статусну поруку</string> <string name="clear_status_message">Обриши статусну поруку</string>
<string name="clear_status_message_after">Обриши статусну поруку након</string> <string name="clear_status_message_after">Обриши статусну поруку након</string>
<string name="close">Затвори</string> <string name="close">Затвори</string>
<string name="continuous_voice_message_recording">Закључајте снимање да би се гласовна порука непрестано снимала.</string>
<string name="conversations">Разговори</string> <string name="conversations">Разговори</string>
<string name="danger_zone">Зона опасности</string> <string name="danger_zone">Зона опасности</string>
<string name="delete_avatar">Обриши аватар</string> <string name="delete_avatar">Обриши аватар</string>
@ -63,6 +65,7 @@
<string name="nc_allow_guests">Дозволи госте</string> <string name="nc_allow_guests">Дозволи госте</string>
<string name="nc_attendee_pin">Прикачено: %1$s</string> <string name="nc_attendee_pin">Прикачено: %1$s</string>
<string name="nc_biometric_unlock">Откључај %1$s</string> <string name="nc_biometric_unlock">Откључај %1$s</string>
<string name="nc_bluetooth_permission_hint">Ако желите да укључите bluetooth звучнике, молимо вас да дате дозволу „Оближњи уређаји”</string>
<string name="nc_call_button_content_description_advanced">Напредне опције позива</string> <string name="nc_call_button_content_description_advanced">Напредне опције позива</string>
<string name="nc_call_button_content_description_answer_video_call">Одговори као видео позив</string> <string name="nc_call_button_content_description_answer_video_call">Одговори као видео позив</string>
<string name="nc_call_button_content_description_answer_voice_only">Одговори као гласовни позив</string> <string name="nc_call_button_content_description_answer_voice_only">Одговори као гласовни позив</string>
@ -86,6 +89,7 @@
<string name="nc_call_unknown">%s позив</string> <string name="nc_call_unknown">%s позив</string>
<string name="nc_call_video">%s видео позив</string> <string name="nc_call_video">%s видео позив</string>
<string name="nc_call_voice">%s гласовни позив</string> <string name="nc_call_voice">%s гласовни позив</string>
<string name="nc_camera_permission_hint">Ако желите да укључите видео комуникацију, молимо вас да дате дозволу „Камера”</string>
<string name="nc_camera_permission_permanently_denied">Да бисте омогућили видео комуникацију, дозволите приступ камери у системским поставкама.</string> <string name="nc_camera_permission_permanently_denied">Да бисте омогућили видео комуникацију, дозволите приступ камери у системским поставкама.</string>
<string name="nc_cancel">Откажи</string> <string name="nc_cancel">Откажи</string>
<string name="nc_capabilities_failed">Грешка приликом дохватања могућности, прекидам</string> <string name="nc_capabilities_failed">Грешка приликом дохватања могућности, прекидам</string>
@ -207,6 +211,7 @@
<string name="nc_message_quote_cancel_reply">Откажи одговор</string> <string name="nc_message_quote_cancel_reply">Откажи одговор</string>
<string name="nc_message_read">Порука је прочитана</string> <string name="nc_message_read">Порука је прочитана</string>
<string name="nc_message_sent">Порука послата</string> <string name="nc_message_sent">Порука послата</string>
<string name="nc_microphone_permission_hint">Ако желите да укључите аудио комуникацију, молимо вас да дате дозволу „Микрофон”</string>
<string name="nc_microphone_permission_permanently_denied">Да бисте омогућили аудио комуникацију, дозволите приступ микрофону у системским поставкама.</string> <string name="nc_microphone_permission_permanently_denied">Да бисте омогућили аудио комуникацију, дозволите приступ микрофону у системским поставкама.</string>
<string name="nc_missed_call">Имате пропуштен позив од %s</string> <string name="nc_missed_call">Имате пропуштен позив од %s</string>
<string name="nc_moderator">Модератор</string> <string name="nc_moderator">Модератор</string>
@ -240,7 +245,11 @@
<string name="nc_participants">Учесници</string> <string name="nc_participants">Учесници</string>
<string name="nc_participants_add">Додај учеснике</string> <string name="nc_participants_add">Додај учеснике</string>
<string name="nc_password">Лозинка</string> <string name="nc_password">Лозинка</string>
<string name="nc_permissions_ask">Постави дозволе</string>
<string name="nc_permissions_denied">Неке дозволе нису одобрене.</string>
<string name="nc_permissions_rationale_dialog_title">Молимо вас да дате дозволе</string>
<string name="nc_permissions_settings">Отвори поставке</string> <string name="nc_permissions_settings">Отвори поставке</string>
<string name="nc_permissions_settings_hint">Молимо вас да одобрите доволе у Подешавања > Дозволе</string>
<string name="nc_phone_book_integration_account_not_found">Налог није нађен</string> <string name="nc_phone_book_integration_account_not_found">Налог није нађен</string>
<string name="nc_phone_book_integration_chat_via">Чет преко %s</string> <string name="nc_phone_book_integration_chat_via">Чет преко %s</string>
<string name="nc_pip_microphone_mute">Утули микрофон</string> <string name="nc_pip_microphone_mute">Утули микрофон</string>

View File

@ -280,19 +280,19 @@
<string name="nc_sent_voice" formatted="true">%1$s надсилає голосове повідомлення.</string> <string name="nc_sent_voice" formatted="true">%1$s надсилає голосове повідомлення.</string>
<string name="nc_sent_voice_you">Ви надіслали голосове повідомлення.</string> <string name="nc_sent_voice_you">Ви надіслали голосове повідомлення.</string>
<string name="nc_server_connect">Перевірка з\'єднання з сервером</string> <string name="nc_server_connect">Перевірка з\'єднання з сервером</string>
<string name="nc_server_db_upgrade_needed">Будь ласка, оновіть Вашу %1$s базу даних</string> <string name="nc_server_db_upgrade_needed">Будь ласка, оновіть вашу %1$s базу даних</string>
<string name="nc_server_failed_to_import_account">Не вдалося імпортувати обраний акаунт.</string> <string name="nc_server_failed_to_import_account">Не вдалося імпортувати обраний акаунт.</string>
<string name="nc_server_helper_text">Посилання на ваш веб-інтерфейс %1$s, коли ви відкриєте його у веб-переглядачі.</string> <string name="nc_server_helper_text">Посилання на ваш веб-інтерфейс %1$s, коли ви відкриєте його у веб-переглядачі.</string>
<string name="nc_server_import_account">Імпортувати обліковий запис із застосунку %1$s</string> <string name="nc_server_import_account">Імпортувати обліковий запис із застосунку %1$s</string>
<string name="nc_server_import_account_plain">Імпорт акаунту</string> <string name="nc_server_import_account_plain">Імпорт акаунту</string>
<string name="nc_server_import_accounts">Імпортувати облікові записти із застосунку %1$s</string> <string name="nc_server_import_accounts">Імпортувати облікові записти із застосунку %1$s</string>
<string name="nc_server_import_accounts_plain">Імпорт акаунтів</string> <string name="nc_server_import_accounts_plain">Імпорт акаунтів</string>
<string name="nc_server_maintenance">Будь ласка, вимкніть для %1$s режим обслуговування</string> <string name="nc_server_maintenance">Будь ласка, вимкніть режим обслуговування для %1$s </string>
<string name="nc_server_not_installed">Будь ласка, закінчіть Ваше %1$s встановлення</string> <string name="nc_server_not_installed">Будь ласка, завершіть встановлення %1$s </string>
<string name="nc_server_testing_connection">Перевірка з\'єднання</string> <string name="nc_server_testing_connection">Перевірка з\'єднання</string>
<string name="nc_server_unsupported">На сервері не встановлено застосунок \"Talk\", який може підтримуватися</string> <string name="nc_server_unsupported">На сервері не встановлено застосунок \"Talk\", який може підтримуватися</string>
<string name="nc_server_url">Адреса сервера https://…</string> <string name="nc_server_url">Адреса сервера https://…</string>
<string name="nc_server_version">Робота додатка %1$s можлива тільки із серверами %2$s версії 13 або старше</string> <string name="nc_server_version">Застосунок %1$s сумісний з %2$s версії 13 або вище</string>
<string name="nc_settings">Налаштування</string> <string name="nc_settings">Налаштування</string>
<string name="nc_settings_account_updated">Замість створення нового облікового запису було виконано оновлення існуючого</string> <string name="nc_settings_account_updated">Замість створення нового облікового запису було виконано оновлення існуючого</string>
<string name="nc_settings_advanced_title">Додатково</string> <string name="nc_settings_advanced_title">Додатково</string>
@ -389,7 +389,7 @@
<string name="polls_end_poll_confirm">Ви справді хочете закінчити це опитування? Це не можна скасувати.</string> <string name="polls_end_poll_confirm">Ви справді хочете закінчити це опитування? Це не можна скасувати.</string>
<string name="polls_max_votes_reached">Ви не можете голосувати більше ніж за один варіант у цьому опитуванні.</string> <string name="polls_max_votes_reached">Ви не можете голосувати більше ніж за один варіант у цьому опитуванні.</string>
<string name="polls_multiple_answers">Кілька відповідей</string> <string name="polls_multiple_answers">Кілька відповідей</string>
<string name="polls_option_delete">Видалити варіант %1$s</string> <string name="polls_option_delete">Вилучити варіант %1$s</string>
<string name="polls_option_hint">Варіант %1$s</string> <string name="polls_option_hint">Варіант %1$s</string>
<string name="polls_options">Параметри</string> <string name="polls_options">Параметри</string>
<string name="polls_private_poll">Приватне опитування</string> <string name="polls_private_poll">Приватне опитування</string>

View File

@ -223,8 +223,14 @@
<string name="raise_hand">Giơ tay</string> <string name="raise_hand">Giơ tay</string>
<string name="reactions_tab_all">Tất cả</string> <string name="reactions_tab_all">Tất cả</string>
<string name="save">Lưu</string> <string name="save">Lưu</string>
<string name="scope_federated_description">Chỉ đồng bộ đối với máy chủ tin cậy</string>
<string name="scope_federated_title">Federated</string> <string name="scope_federated_title">Federated</string>
<string name="scope_local_description">Chỉ hiển thị với mọi người trong trường hợp này và khách</string>
<string name="scope_local_title">Cục bộ(ngoại tuyến)</string>
<string name="scope_private_description">Chỉ hiển thị với những người phù hợp thông qua tích hợp số điện thoại thông qua Talk trên thiết bị di động</string>
<string name="scope_private_title">Riêng tư</string> <string name="scope_private_title">Riêng tư</string>
<string name="scope_published_description">Đồng bộ với máy chủ tin cậy và sổ danh bạ toàn cầu và công khai</string>
<string name="scope_published_title">Đã đăng</string>
<string name="scroll_to_bottom">Cuộn xuống dưới cùng</string> <string name="scroll_to_bottom">Cuộn xuống dưới cùng</string>
<string name="secondsAgo">vài giây trước</string> <string name="secondsAgo">vài giây trước</string>
<string name="selected_list_item">Selected</string> <string name="selected_list_item">Selected</string>
@ -248,6 +254,7 @@
<string name="today">Hôm nay</string> <string name="today">Hôm nay</string>
<string name="translate">Dịch</string> <string name="translate">Dịch</string>
<string name="translation_device_settings">Cài đặt thiết bị</string> <string name="translation_device_settings">Cài đặt thiết bị</string>
<string name="translation_error_message">Không thể phát hiện ngôn ngữ</string>
<string name="translation_from">Từ</string> <string name="translation_from">Từ</string>
<string name="translation_to">Tới</string> <string name="translation_to">Tới</string>
<string name="user_info_address">Địa chỉ</string> <string name="user_info_address">Địa chỉ</string>

View File

@ -37,9 +37,9 @@ buildscript {
classpath 'com.android.tools.build:gradle:8.1.0' classpath 'com.android.tools.build:gradle:8.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}"
classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.1.1' classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.1.3'
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.1" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.1"
classpath "org.jlleitschuh.gradle:ktlint-gradle:11.5.0" classpath "org.jlleitschuh.gradle:ktlint-gradle:11.5.1"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files