Merge tag '2.8.10' into develop

This commit is contained in:
genofire 2020-08-03 07:51:42 +02:00
commit c9c37dfb04
69 changed files with 831 additions and 723 deletions

18
.github/stale.yml vendored
View File

@ -1,18 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 90
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- feature
- security
- bug
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

View File

@ -1,5 +1,11 @@
# Changelog
### Version 2.8.10
* Handle GPX files
* Improve performance for backup restore
* bug fixes
### Version 2.8.9
* add 'Return to chat' to audio call screen

View File

@ -8,7 +8,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.2'
classpath 'com.android.tools.build:gradle:4.0.1'
}
}
@ -96,8 +96,8 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
versionCode 395
versionName "2.8.9"
versionCode 397
versionName "2.8.10"
archivesBaseName += "-$versionName"
applicationId "eu.sum7.conversations"
resValue "string", "applicationId", applicationId

View File

@ -0,0 +1,3 @@
* Handle GPX files
* Improve performance for backup restore
* bug fixes

View File

@ -1,6 +1,6 @@
#Thu Mar 19 11:51:26 CET 2020
#Sun Jul 26 11:32:42 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

View File

@ -17,6 +17,7 @@ import android.support.v4.app.NotificationManagerCompat;
import android.util.Log;
import com.google.common.base.Charsets;
import com.google.common.base.Stopwatch;
import com.google.common.io.CountingInputStream;
import org.bouncycastle.crypto.engines.AESEngine;
@ -189,6 +190,7 @@ public class ImportBackupService extends Service {
private boolean importBackup(final Uri uri, final String password) {
Log.d(Config.LOGTAG, "importing backup from " + uri);
final Stopwatch stopwatch = Stopwatch.createStarted();
try {
final SQLiteDatabase db = mDatabaseBackend.getWritableDatabase();
final InputStream inputStream;
@ -233,12 +235,13 @@ public class ImportBackupService extends Service {
final byte[] key = ExportBackupService.getKey(password, backupFileHeader.getSalt());
AEADBlockCipher cipher = new GCMBlockCipher(new AESEngine());
final AEADBlockCipher cipher = new GCMBlockCipher(new AESEngine());
cipher.init(false, new AEADParameters(new KeyParameter(key), 128, backupFileHeader.getIv()));
final CipherInputStream cipherInputStream = new CipherInputStream(countingInputStream, cipher);
final GZIPInputStream gzipInputStream = new GZIPInputStream(cipherInputStream);
BufferedReader reader = new BufferedReader(new InputStreamReader(gzipInputStream, Charsets.UTF_8));
final BufferedReader reader = new BufferedReader(new InputStreamReader(gzipInputStream, Charsets.UTF_8));
db.beginTransaction();
String line;
StringBuilder multiLineQuery = null;
while ((line = reader.readLine()) != null) {
@ -260,11 +263,13 @@ public class ImportBackupService extends Service {
}
}
}
db.setTransactionSuccessful();
db.endTransaction();
final Jid jid = backupFileHeader.getJid();
Cursor countCursor = db.rawQuery("select count(messages.uuid) from messages join conversations on conversations.uuid=messages.conversationUuid join accounts on conversations.accountUuid=accounts.uuid where accounts.username=? and accounts.server=?", new String[]{jid.getEscapedLocal(), jid.getDomain().toEscapedString()});
final Cursor countCursor = db.rawQuery("select count(messages.uuid) from messages join conversations on conversations.uuid=messages.conversationUuid join accounts on conversations.accountUuid=accounts.uuid where accounts.username=? and accounts.server=?", new String[]{jid.getEscapedLocal(), jid.getDomain().toEscapedString()});
countCursor.moveToFirst();
int count = countCursor.getInt(0);
Log.d(Config.LOGTAG, "restored " + count + " messages");
final int count = countCursor.getInt(0);
Log.d(Config.LOGTAG, String.format("restored %d messages in %s", count, stopwatch.stop().toString()));
countCursor.close();
stopBackgroundService();
synchronized (mOnBackupProcessedListeners) {
@ -274,7 +279,7 @@ public class ImportBackupService extends Service {
}
return true;
} catch (final Exception e) {
Throwable throwable = e.getCause();
final Throwable throwable = e.getCause();
final boolean reasonWasCrypto = throwable instanceof BadPaddingException || e instanceof ZipException;
synchronized (mOnBackupProcessedListeners) {
for (OnBackupProcessed l : mOnBackupProcessedListeners) {

View File

@ -10,4 +10,5 @@ In ogni caso per facilitare puoi creare facilmente un account su chat.sum7.eu, u
<string name="magic_create_text_on_x">Sei stato invitato su %1$s. Ti guideremo nel procedimento per creare un account.\nQuando scegli %1$s come fornitore sarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo.</string>
<string name="magic_create_text_fixed">Sei stato invitato su %1$s. È già stato scelto un nome utente per te. Ti guideremo nel procedimento per creare un account.\nSarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo.</string>
<string name="your_server_invitation">Il tuo invito al server</string>
</resources>
<string name="improperly_formatted_provisioning">Codice di approvvigionamento formattato male</string>
</resources>

View File

@ -8,4 +8,5 @@
<string name="magic_create_text_on_x">Você foi convidado para %1$s. Nós iremos guiá-lo ao longo do processo de criação de uma conta.\nAo escolher %1$s como um provedor você conseguirá se comunicar com usuários de outros provedores dando a eles seu endereço XMPP completo.</string>
<string name="magic_create_text_fixed">Você foi convidado para %1$s. Um nome de usuário já foi escolhido para você. Nós iremos guiá-lo ao longo do processo de criação de uma conta.\nVocê conseguirá se comunicar com usuários de outros provedores dando a eles seu endereço XMPP completo.</string>
<string name="your_server_invitation">Seu convite do servidor</string>
</resources>
<string name="improperly_formatted_provisioning">Código de provisionamento formatado de maneira imprópria</string>
</resources>

View File

@ -8,4 +8,5 @@
<string name="magic_create_text_on_x">Вас пригласили на %1$s. Мы проведём вас через процесс создания аккаунта. Аккаунт на %1$s позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
<string name="magic_create_text_fixed">Вас пригласили на %1$s. Вам уже назначили имя пользователя. Мы проведём вас через процесс создания аккаунта. Этот аккаунт позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
<string name="your_server_invitation">Ваше приглашение</string>
</resources>
<string name="improperly_formatted_provisioning">Неправильный формат кода</string>
</resources>

View File

@ -8,4 +8,5 @@
<string name="magic_create_text_on_x">您已受邀参加%1$s。 我们将指导您完成创建帐户的过程。\n选择%1$s作为提供者后您可以通过提供其他人的完整XMPP地址与其他提供者的用户进行交流。</string>
<string name="magic_create_text_fixed">您已受邀参加%1$s。 已经为您选择了一个用户名。 我们将指导您完成创建帐户的过程。\n您可以通过向其他提供商的用户提供完整的XMPP地址来与他们进行交流。</string>
<string name="your_server_invitation">你的服务器邀请</string>
</resources>
<string name="improperly_formatted_provisioning">格式不正确的配置代码</string>
</resources>

View File

@ -621,7 +621,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
}
public boolean isEditable() {
return getStatus() != STATUS_RECEIVED && !isCarbon();
return status != STATUS_RECEIVED && !isCarbon() && type != Message.TYPE_RTP_SESSION;
}
public boolean mergeable(final Message message) {

View File

@ -225,19 +225,31 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
private void execute(final Query query) {
final Account account = query.getAccount();
if (account.getStatus() == Account.State.ONLINE) {
final Conversation conversation = query.getConversation();
if (conversation != null && conversation.getStatus() == Conversation.STATUS_ARCHIVED) {
throw new IllegalStateException("Attempted to run MAM query for archived conversation");
}
Log.d(Config.LOGTAG, account.getJid().asBareJid().toString() + ": running mam query " + query.toString());
IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query);
final IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query);
this.mXmppConnectionService.sendIqPacket(account, packet, (a, p) -> {
Element fin = p.findChild("fin", query.version.namespace);
final Element fin = p.findChild("fin", query.version.namespace);
if (p.getType() == IqPacket.TYPE.TIMEOUT) {
synchronized (MessageArchiveService.this.queries) {
MessageArchiveService.this.queries.remove(query);
synchronized (this.queries) {
this.queries.remove(query);
if (query.hasCallback()) {
query.callback(false);
}
}
} else if (p.getType() == IqPacket.TYPE.RESULT && fin != null) {
processFin(query, fin);
final boolean running;
synchronized (this.queries) {
running = this.queries.contains(query);
}
if (running) {
processFin(query, fin);
} else {
Log.d(Config.LOGTAG,account.getJid().asBareJid()+": ignoring MAM iq result because query had been killed");
}
} else if (p.getType() == IqPacket.TYPE.RESULT && query.isLegacy()) {
//do nothing
} else {
@ -252,9 +264,11 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
}
}
private void finalizeQuery(Query query, boolean done) {
private void finalizeQuery(final Query query, boolean done) {
synchronized (this.queries) {
this.queries.remove(query);
if (!this.queries.remove(query)) {
throw new IllegalStateException("Unable to remove query from queries");
}
}
final Conversation conversation = query.getConversation();
if (conversation != null) {
@ -377,7 +391,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
void kill(Conversation conversation) {
final ArrayList<Query> toBeKilled = new ArrayList<>();
synchronized (this.queries) {
for (Query q : queries) {
for (final Query q : queries) {
if (q.conversation == conversation) {
toBeKilled.add(q);
}

View File

@ -239,8 +239,8 @@ public class XmppConnectionService extends Service {
Environment.getExternalStorageDirectory().getAbsolutePath()
) {
@Override
public void onEvent(int event, String path) {
markFileDeleted(path);
public void onEvent(final int event, final File file) {
markFileDeleted(file);
}
};
private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {
@ -1859,17 +1859,16 @@ public class XmppConnectionService extends Service {
return this.conversations;
}
private void markFileDeleted(final String path) {
private void markFileDeleted(final File file) {
synchronized (FILENAMES_TO_IGNORE_DELETION) {
if (FILENAMES_TO_IGNORE_DELETION.remove(path)) {
Log.d(Config.LOGTAG, "ignored deletion of " + path);
if (FILENAMES_TO_IGNORE_DELETION.remove(file.getAbsolutePath())) {
Log.d(Config.LOGTAG, "ignored deletion of " + file.getAbsolutePath());
return;
}
}
final File file = new File(path);
final boolean isInternalFile = fileBackend.isInternalFile(file);
final List<String> uuids = databaseBackend.markFileAsDeleted(file, isInternalFile);
Log.d(Config.LOGTAG, "deleted file " + path + " internal=" + isInternalFile + ", database hits=" + uuids.size());
Log.d(Config.LOGTAG, "deleted file " + file.getAbsolutePath() + " internal=" + isInternalFile + ", database hits=" + uuids.size());
markUuidsAsDeletedFiles(uuids);
}

View File

@ -2752,8 +2752,10 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
if (lastEditableMessage != null) {
correctMessage(lastEditableMessage);
return true;
} else {
Toast.makeText(getActivity(),R.string.could_not_correct_message, Toast.LENGTH_LONG).show();
return false;
}
return false;
}
@Override
@ -2762,7 +2764,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
if (service == null) {
return;
}
Account.State status = conversation.getAccount().getStatus();
final Account.State status = conversation.getAccount().getStatus();
if (status == Account.State.ONLINE && conversation.setOutgoingChatState(ChatState.COMPOSING)) {
service.sendChatState(conversation);
}
@ -2775,7 +2777,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
if (service == null) {
return;
}
Account.State status = conversation.getAccount().getStatus();
final Account.State status = conversation.getAccount().getStatus();
if (status == Account.State.ONLINE && conversation.setOutgoingChatState(ChatState.PAUSED)) {
service.sendChatState(conversation);
}
@ -2787,7 +2789,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
if (service == null) {
return;
}
Account.State status = conversation.getAccount().getStatus();
final Account.State status = conversation.getAccount().getStatus();
if (status == Account.State.ONLINE && conversation.setOutgoingChatState(Config.DEFAULT_CHAT_STATE)) {
service.sendChatState(conversation);
}

View File

@ -33,6 +33,8 @@ import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.common.base.CharMatcher;
import org.openintents.openpgp.util.OpenPgpUtils;
import java.net.URL;
@ -69,13 +71,13 @@ import eu.siacs.conversations.utils.TorServiceUtils;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.utils.XmppUri;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
import eu.siacs.conversations.xmpp.XmppConnection;
import eu.siacs.conversations.xmpp.XmppConnection.Features;
import eu.siacs.conversations.xmpp.forms.Data;
import eu.siacs.conversations.xmpp.pep.Avatar;
import eu.siacs.conversations.xmpp.Jid;
public class EditAccountActivity extends OmemoActivity implements OnAccountUpdate, OnUpdateBlocklist,
OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched {
@ -215,12 +217,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
removeErrorsOnAllBut(binding.accountJidLayout);
return;
}
String hostname = null;
final String hostname;
int numericPort = 5222;
if (mShowOptions) {
hostname = binding.hostname.getText().toString().replaceAll("\\s", "");
final String port = binding.port.getText().toString().replaceAll("\\s", "");
if (hostname.contains(" ")) {
hostname = CharMatcher.whitespace().removeFrom(binding.hostname.getText());
final String port = CharMatcher.whitespace().removeFrom(binding.port.getText());
if (Resolver.invalidHostname(hostname)) {
binding.hostnameLayout.setError(getString(R.string.not_valid_hostname));
binding.hostname.requestFocus();
removeErrorsOnAllBut(binding.hostnameLayout);
@ -243,6 +245,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
return;
}
}
} else {
hostname = null;
}
if (jid.getLocal() == null) {

View File

@ -371,15 +371,23 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
binding.with.setText(account.getRoster().getContact(with).getDisplayName());
} else if (Intent.ACTION_VIEW.equals(action)) {
final String extraLastState = intent.getStringExtra(EXTRA_LAST_REPORTED_STATE);
if (extraLastState != null) {
final RtpEndUserState state = extraLastState == null ? null : RtpEndUserState.valueOf(extraLastState);
if (state != null) {
Log.d(Config.LOGTAG, "restored last state from intent extra");
RtpEndUserState state = RtpEndUserState.valueOf(extraLastState);
updateButtonConfiguration(state);
updateStateDisplay(state);
updateProfilePicture(state);
invalidateOptionsMenu();
}
binding.with.setText(account.getRoster().getContact(with).getDisplayName());
if (xmppConnectionService.getJingleConnectionManager().fireJingleRtpConnectionStateUpdates()) {
return;
}
if (END_CARD.contains(state) || xmppConnectionService.getJingleConnectionManager().hasMatchingProposal(account, with)) {
return;
}
Log.d(Config.LOGTAG, "restored state (" + state + ") was not an end card. finishing");
finish();
}
}

View File

@ -11,6 +11,7 @@ import android.support.annotation.AttrRes;
import android.support.annotation.DimenRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
@ -21,6 +22,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.databinding.MediaBinding;
import eu.siacs.conversations.services.ExportBackupService;
@ -51,14 +53,16 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
this.mediaSize = Math.round(activity.getResources().getDimension(mediaSize));
}
@SuppressWarnings("rawtypes")
public static void setMediaSize(RecyclerView recyclerView, int mediaSize) {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
final RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter instanceof MediaAdapter) {
((MediaAdapter) adapter).setMediaSize(mediaSize);
}
}
private static @AttrRes int getImageAttr(Attachment attachment) {
private static @AttrRes
int getImageAttr(Attachment attachment) {
final @AttrRes int attr;
if (attachment.getType() == Attachment.Type.LOCATION) {
attr = R.attr.media_preview_location;
@ -66,6 +70,7 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
attr = R.attr.media_preview_recording;
} else {
final String mime = attachment.getMime();
Log.d(Config.LOGTAG, "mime=" + mime);
if (mime == null) {
attr = R.attr.media_preview_unknown;
} else if (mime.startsWith("audio/")) {
@ -84,6 +89,8 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
attr = R.attr.media_preview_backup;
} else if (DOCUMENT_MIMES.contains(mime)) {
attr = R.attr.media_preview_document;
} else if (mime.equals("application/gpx+xml")) {
attr = R.attr.media_preview_tour;
} else {
attr = R.attr.media_preview_unknown;
}
@ -155,7 +162,7 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
private void loadPreview(Attachment attachment, ImageView imageView) {
if (cancelPotentialWork(attachment, imageView)) {
final Bitmap bm = activity.xmppConnectionService.getFileBackend().getPreviewForUri(attachment,mediaSize,true);
final Bitmap bm = activity.xmppConnectionService.getFileBackend().getPreviewForUri(attachment, mediaSize, true);
if (bm != null) {
cancelPotentialWork(attachment, imageView);
imageView.setImageBitmap(bm);

View File

@ -36,6 +36,8 @@ import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import com.google.common.base.MoreObjects;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
@ -87,6 +89,16 @@ public class Attachment implements Parcelable {
return type;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("uri", uri)
.add("type", type)
.add("uuid", uuid)
.add("mime", mime)
.toString();
}
public enum Type {
FILE, IMAGE, LOCATION, RECORDING
}

View File

@ -6,8 +6,11 @@ import android.util.Log;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import eu.siacs.conversations.Config;
@ -19,6 +22,9 @@ import eu.siacs.conversations.Config;
*/
public abstract class ConversationsFileObserver {
private static final Executor EVENT_EXECUTOR = Executors.newSingleThreadExecutor();
private static final int MASK = FileObserver.DELETE | FileObserver.MOVED_FROM | FileObserver.CREATE;
private final String path;
private final List<SingleFileObserver> mObservers = new ArrayList<>();
@ -34,50 +40,47 @@ public abstract class ConversationsFileObserver {
}
private synchronized void startWatchingInternal() {
Stack<String> stack = new Stack<>();
final Stack<String> stack = new Stack<>();
stack.push(path);
while (!stack.empty()) {
if (shouldStop.get()) {
Log.d(Config.LOGTAG,"file observer received command to stop");
Log.d(Config.LOGTAG, "file observer received command to stop");
return;
}
String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, FileObserver.DELETE| FileObserver.MOVED_FROM));
final String parent = stack.pop();
final File path = new File(parent);
mObservers.add(new SingleFileObserver(path, MASK));
final File[] files = path.listFiles();
if (files == null) {
continue;
}
for(File file : files) {
for (final File file : (files == null ? new File[0] : files)) {
if (shouldStop.get()) {
Log.d(Config.LOGTAG,"file observer received command to stop");
Log.d(Config.LOGTAG, "file observer received command to stop");
return;
}
if (file.isDirectory() && file.getName().charAt(0) != '.') {
final String currentPath = file.getAbsolutePath();
if (depth(file) <= 8 && !stack.contains(currentPath) && !observing(currentPath)) {
if (depth(file) <= 8 && !stack.contains(currentPath) && !observing(file)) {
stack.push(currentPath);
}
}
}
}
for(FileObserver observer : mObservers) {
for (FileObserver observer : mObservers) {
observer.startWatching();
}
}
private static int depth(File file) {
int depth = 0;
while((file = file.getParentFile()) != null) {
while ((file = file.getParentFile()) != null) {
depth++;
}
return depth;
}
private boolean observing(String path) {
for(SingleFileObserver observer : mObservers) {
if(path.equals(observer.path)) {
private boolean observing(final File path) {
for (final SingleFileObserver observer : mObservers) {
if (path.equals(observer.path)) {
return true;
}
}
@ -90,13 +93,13 @@ public abstract class ConversationsFileObserver {
}
private synchronized void stopWatchingInternal() {
for(FileObserver observer : mObservers) {
for (FileObserver observer : mObservers) {
observer.stopWatching();
}
mObservers.clear();
}
abstract public void onEvent(int event, String path);
abstract public void onEvent(final int event, File path);
public void restartWatching() {
stopWatching();
@ -104,21 +107,33 @@ public abstract class ConversationsFileObserver {
}
private class SingleFileObserver extends FileObserver {
private final String path;
private final File path;
SingleFileObserver(String path, int mask) {
super(path, mask);
SingleFileObserver(final File path, final int mask) {
super(path.getAbsolutePath(), mask);
this.path = path;
}
@Override
public void onEvent(int event, String filename) {
public void onEvent(final int event, final String filename) {
if (filename == null) {
Log.d(Config.LOGTAG,"ignored file event with NULL filename (event="+event+")");
Log.d(Config.LOGTAG, "ignored file event with NULL filename (event=" + event + ")");
return;
}
ConversationsFileObserver.this.onEvent(event, path+'/'+filename);
EVENT_EXECUTOR.execute(() -> {
final File file = new File(this.path, filename);
if ((event & FileObserver.ALL_EVENTS) == FileObserver.CREATE) {
if (file.isDirectory()) {
Log.d(Config.LOGTAG, "file observer observed new directory creation " + file);
if (!observing(file)) {
final SingleFileObserver observer = new SingleFileObserver(file, MASK);
observer.startWatching();
}
}
return;
}
ConversationsFileObserver.this.onEvent(event, file);
});
}
}
}

View File

@ -14,8 +14,11 @@
* limitations under the License.
*/
package eu.siacs.conversations.utils;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;
import java.io.File;
@ -38,6 +41,7 @@ import eu.siacs.conversations.services.ExportBackupService;
public final class MimeUtils {
private static final Map<String, String> mimeTypeToExtensionMap = new HashMap<>();
private static final Map<String, String> extensionToMimeTypeMap = new HashMap<>();
static {
// The following table is based on /etc/mime.types data minus
// chemical/* MIME types and MIME types that don't map to any
@ -52,7 +56,8 @@ public final class MimeUtils {
// by guessExtensionFromMimeType.
add("application/andrew-inset", "ez");
add("application/dsptype", "tsp");
add("application/epub+zip","epub");
add("application/epub+zip", "epub");
add("application/gpx+xml", "gpx");
add("application/hta", "hta");
add("application/mac-binhex40", "hqx");
add("application/mathematica", "nb");
@ -68,9 +73,9 @@ public final class MimeUtils {
add("application/rdf+xml", "rdf");
add("application/rss+xml", "rss");
add("application/zip", "zip");
add("application/vnd.amazon.mobi8-ebook","azw3");
add("application/vnd.amazon.mobi8-ebook","azw");
add("application/vnd.amazon.mobi8-ebook","kfx");
add("application/vnd.amazon.mobi8-ebook", "azw3");
add("application/vnd.amazon.mobi8-ebook", "azw");
add("application/vnd.amazon.mobi8-ebook", "kfx");
add("application/vnd.android.package-archive", "apk");
add("application/vnd.cinderella", "cdy");
add(ExportBackupService.MIME_TYPE, "ceb");
@ -183,7 +188,7 @@ public final class MimeUtils {
add("application/x-maker", "book");
add("application/x-maker", "fbdoc");
add("application/x-mif", "mif");
add("application/x-mobipocket-ebook","mobi");
add("application/x-mobipocket-ebook", "mobi");
add("application/x-ms-wmd", "wmd");
add("application/x-ms-wmz", "wmz");
add("application/x-msi", "msi");
@ -242,7 +247,7 @@ public final class MimeUtils {
add("audio/mpeg", "mp2");
add("audio/mpeg", "m4a");
add("audio/mpegurl", "m3u");
add("audio/ogg","oga");
add("audio/ogg", "oga");
add("audio/prs.sid", "sid");
add("audio/x-aiff", "aif");
add("audio/x-aiff", "aiff");
@ -268,7 +273,7 @@ public final class MimeUtils {
add("image/ico", "cur");
add("image/ico", "ico");
add("image/ief", "ief");
add("image/heic","heic");
add("image/heic", "heic");
// add ".jpg" first so it will be the default for guessExtensionFromMimeType
add("image/jpeg", "jpg");
add("image/jpeg", "jpeg");
@ -367,7 +372,7 @@ public final class MimeUtils {
add("video/fli", "fli");
add("video/m4v", "m4v");
add("video/mp2ts", "ts");
add("video/ogg","ogv");
add("video/ogg", "ogv");
add("video/mpeg", "mpeg");
add("video/mpeg", "mpg");
add("video/mpeg", "mpe");
@ -393,6 +398,7 @@ public final class MimeUtils {
add("x-epoc/x-sisx-app", "sisx");
applyOverrides();
}
private static void add(String mimeType, String extension) {
// If we have an existing x -> y mapping, we do not want to
// override it with another mapping x -> y2.
@ -406,6 +412,7 @@ public final class MimeUtils {
extensionToMimeTypeMap.put(extension, mimeType);
}
}
private static InputStream getContentTypesPropertiesStream() {
// User override?
String userTable = System.getProperty("content.types.user.table");
@ -428,6 +435,7 @@ public final class MimeUtils {
}
return null;
}
/**
* This isn't what the RI does. The RI doesn't have hard-coded defaults, so supplying your
* own "content.types.user.table" means you don't get any of the built-ins, and the built-ins
@ -456,10 +464,13 @@ public final class MimeUtils {
} catch (IOException ignored) {
}
}
private MimeUtils() {
}
/**
* Returns true if the given MIME type has an entry in the map.
*
* @param mimeType A MIME type (i.e. text/plain)
* @return True iff there is a mimeType entry in the map.
*/
@ -469,8 +480,10 @@ public final class MimeUtils {
}
return mimeTypeToExtensionMap.containsKey(mimeType);
}
/**
* Returns the MIME type for the given extension.
*
* @param extension A file extension without the leading '.'
* @return The MIME type for the given extension or null iff there is none.
*/
@ -480,8 +493,10 @@ public final class MimeUtils {
}
return extensionToMimeTypeMap.get(extension.toLowerCase());
}
/**
* Returns true if the given extension has a registered MIME type.
*
* @param extension A file extension without the leading '.'
* @return True iff there is an extension entry in the map.
*/
@ -491,10 +506,12 @@ public final class MimeUtils {
}
return extensionToMimeTypeMap.containsKey(extension);
}
/**
* Returns the registered extension for the given MIME type. Note that some
* MIME types map to multiple extensions. This call will return the most
* common extension for the given MIME type.
*
* @param mimeType A MIME type (i.e. text/plain)
* @return The extension for the given MIME type or null iff there is none.
*/
@ -506,7 +523,7 @@ public final class MimeUtils {
}
public static String guessMimeTypeFromUriAndMime(final Context context, final Uri uri, final String mime) {
Log.d(Config.LOGTAG,"guessMimeTypeFromUriAndMime "+uri+" and mime="+mime);
Log.d(Config.LOGTAG, "guessMimeTypeFromUriAndMime " + uri + " and mime=" + mime);
if (mime == null || mime.equals("application/octet-stream")) {
final String guess = guessMimeTypeFromUri(context, uri);
if (guess != null) {
@ -515,7 +532,7 @@ public final class MimeUtils {
return mime;
}
}
return guessMimeTypeFromUri(context ,uri);
return guessMimeTypeFromUri(context, uri);
}
public static String guessMimeTypeFromUri(Context context, Uri uri) {
@ -523,18 +540,20 @@ public final class MimeUtils {
String mimeType;
try {
mimeType = context.getContentResolver().getType(uri);
} catch (Throwable throwable) {
} catch (final Throwable throwable) {
mimeType = null;
}
// try the extension
if ((mimeType == null || mimeType.equals("application/octet-stream")) && uri.getPath() != null) {
String path = uri.getPath();
int start = path.lastIndexOf('.') + 1;
if (start < path.length()) {
final String guess = MimeUtils.guessMimeTypeFromExtension(path.substring(start));
if (guess != null) {
mimeType = guess;
}
if (mimeType == null || mimeType.equals("application/octet-stream")) {
final String path = uri.getPath();
if (path != null) {
mimeType = guessFromPath(path);
}
}
if (mimeType == null && "content".equals(uri.getScheme())) {
final String name = getDisplayName(context, uri);
if (name != null) {
mimeType = guessFromPath(name);
}
}
// sometimes this works (as with the commit content api)
@ -544,6 +563,23 @@ public final class MimeUtils {
return mimeType;
}
private static String getDisplayName(final Context context, final Uri uri) {
try (Cursor cursor = context.getContentResolver().query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
return cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
}
return null;
}
private static String guessFromPath(final String path) {
final int start = path.lastIndexOf('.') + 1;
if (start < path.length()) {
return MimeUtils.guessMimeTypeFromExtension(path.substring(start));
}
return null;
}
public static String extractRelevantExtension(URL url) {
String path = url.getPath();
return extractRelevantExtension(path, true);
@ -565,7 +601,7 @@ public final class MimeUtils {
String extension = filename.substring(dotPosition + 1);
// we want the real file extension, not the crypto one
if (ignoreCryptoExtension && Transferable.VALID_CRYPTO_EXTENSIONS.contains(extension)) {
return extractRelevantExtension(filename.substring(0,dotPosition));
return extractRelevantExtension(filename.substring(0, dotPosition));
} else {
return extension;
}

View File

@ -90,7 +90,6 @@ public class Resolver {
return happyEyeball(resolveNoSrvRecords(DNSName.from(hostname), port, true));
}
public static boolean useDirectTls(final int port) {
return port == 443 || port == 5223;
}

File diff suppressed because it is too large Load Diff

View File

@ -683,7 +683,9 @@ public class XmppConnection implements Runnable {
if (Config.BACKGROUND_STANZA_LOGGING && mXmppConnectionService.checkListeners()) {
Log.d(Config.LOGTAG, "[background stanza] " + element);
}
if (element instanceof IqPacket && element.hasChild("jingle", Namespace.JINGLE)) {
if (element instanceof IqPacket
&& (((IqPacket) element).getType() == IqPacket.TYPE.SET)
&& element.hasChild("jingle", Namespace.JINGLE)) {
return JinglePacket.upgrade((IqPacket) element);
} else {
return element;

View File

@ -456,6 +456,21 @@ public class JingleConnectionManager extends AbstractConnectionManager {
}
}
public boolean fireJingleRtpConnectionStateUpdates() {
boolean firedUpdates = false;
for (final AbstractJingleConnection connection : this.connections.values()) {
if (connection instanceof JingleRtpConnection) {
final JingleRtpConnection jingleRtpConnection = (JingleRtpConnection) connection;
if (jingleRtpConnection.isTerminated()) {
continue;
}
jingleRtpConnection.fireStateUpdate();
firedUpdates = true;
}
}
return firedUpdates;
}
void getPrimaryCandidate(final Account account, final boolean initiator, final OnPrimaryCandidateFound listener) {
if (Config.DISABLE_PROXY_LOOKUP) {
listener.onPrimaryCandidateFound(false, null);
@ -576,6 +591,18 @@ public class JingleConnectionManager extends AbstractConnectionManager {
}
}
public boolean hasMatchingProposal(final Account account, final Jid with) {
synchronized (this.rtpSessionProposals) {
for (Map.Entry<RtpSessionProposal, DeviceDiscoveryState> entry : this.rtpSessionProposals.entrySet()) {
final RtpSessionProposal proposal = entry.getKey();
if (proposal.account == account && with.asBareJid().equals(proposal.with)) {
return true;
}
}
}
return false;
}
public void deliverIbbPacket(Account account, IqPacket packet) {
final String sid;
final Element payload;

View File

@ -239,7 +239,11 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
}
final Set<Map.Entry<String, RtpContentMap.DescriptionTransport>> candidates = contentMap.contents.entrySet();
if (this.state == State.SESSION_ACCEPTED) {
processCandidates(candidates);
try {
processCandidates(candidates);
} catch (final WebRTCWrapper.PeerConnectionNotInitialized e) {
Log.w(Config.LOGTAG, id.account.getJid().asBareJid() + ": PeerConnection was not initialized when processing transport info. this usually indicates a race condition that can be ignored");
}
} else {
pendingIceCandidates.push(candidates);
}
@ -807,7 +811,14 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
return RtpEndUserState.CONNECTING;
}
case SESSION_ACCEPTED:
final PeerConnection.PeerConnectionState state = webRTCWrapper.getState();
final PeerConnection.PeerConnectionState state;
try {
state = webRTCWrapper.getState();
} catch (final WebRTCWrapper.PeerConnectionNotInitialized e) {
//We usually close the WebRTCWrapper *before* transitioning so we might still
//be in SESSION_ACCEPTED even though the peerConnection has been torn down
return RtpEndUserState.ENDING_CALL;
}
if (state == PeerConnection.PeerConnectionState.CONNECTED) {
return RtpEndUserState.CONNECTED;
} else if (state == PeerConnection.PeerConnectionState.NEW || state == PeerConnection.PeerConnectionState.CONNECTING) {
@ -1256,6 +1267,11 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
this.proposedMedia = media;
}
public void fireStateUpdate() {
final RtpEndUserState endUserState = getEndUserState();
xmppConnectionService.notifyJingleRtpConnectionUpdate(id.account, id.with, id.sessionId, endUserState);
}
private interface OnIceServersDiscovered {
void onIceServersDiscovered(List<PeerConnection.IceServer> iceServers);
}

View File

@ -552,7 +552,7 @@ public class WebRTCWrapper {
private PeerConnection requirePeerConnection() {
final PeerConnection peerConnection = this.peerConnection;
if (peerConnection == null) {
throw new IllegalStateException("initialize PeerConnection first");
throw new PeerConnectionNotInitialized();
}
return peerConnection;
}
@ -617,6 +617,14 @@ public class WebRTCWrapper {
}
}
public static class PeerConnectionNotInitialized extends IllegalStateException {
private PeerConnectionNotInitialized() {
super("initialize PeerConnection first");
}
}
private static class CapturerChoice {
private final CameraVideoCapturer cameraVideoCapturer;
private final CameraEnumerationAndroid.CaptureFormat captureFormat;

View File

@ -29,6 +29,7 @@ public class JinglePacket extends IqPacket {
public static JinglePacket upgrade(final IqPacket iqPacket) {
Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE));
Preconditions.checkArgument(iqPacket.getType() == TYPE.SET);
final JinglePacket jinglePacket = new JinglePacket();
jinglePacket.setAttributes(iqPacket.getAttributes());
jinglePacket.setChildren(iqPacket.getChildren());
@ -70,11 +71,11 @@ public class JinglePacket extends IqPacket {
public ReasonWrapper getReason() {
final Element reasonElement = getJingleChild("reason");
if (reasonElement == null) {
return new ReasonWrapper(Reason.UNKNOWN,null);
return new ReasonWrapper(Reason.UNKNOWN, null);
}
String text = null;
Reason reason = Reason.UNKNOWN;
for(Element child : reasonElement.getChildren()) {
for (Element child : reasonElement.getChildren()) {
if ("text".equals(child.getName())) {
text = child.getContent();
} else {

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

View File

@ -363,7 +363,6 @@
<string name="server_info_broken">مكسر</string>
<string name="pref_presence_settings">حالة الحضور</string>
<string name="pref_away_when_screen_off">غائب عند إطفاء الشاشة</string>
<string name="pref_dnd_on_silent_mode">\"لا تزعجني\" في وضع السكوت</string>
<string name="pref_show_connection_options">إعدادات الربط الموسعة</string>
<string name="pref_show_connection_options_summary">عرض اسم المضيف وإعدادات المنفذ عند تنصيب حساب</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -368,11 +368,7 @@
<string name="server_info_broken">Повредено</string>
<string name="pref_presence_settings">Присъствие</string>
<string name="pref_away_when_screen_off">Отсъстващ, когато екранът е изключен</string>
<string name="pref_away_when_screen_off_summary">Преминава в състояние „отсъстващ“ когато екранът бъде изключен</string>
<string name="pref_dnd_on_silent_mode">„Отпочиващ“ в тих режим</string>
<string name="pref_dnd_on_silent_mode_summary">Преминава в състояние „отсъстващ“, когато устройството е в тих режим</string>
<string name="pref_treat_vibrate_as_silent">Тих режим при режим на вибриране</string>
<string name="pref_treat_vibrate_as_dnd_summary">Преминава в състояние „отсъстващ“, когато устройството е в режим на вибриране.</string>
<string name="pref_show_connection_options">Разширени настройки за връзката</string>
<string name="pref_show_connection_options_summary">Показване на настройките за сървър и порт при установка на профил</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -366,11 +366,7 @@
<string name="server_info_broken">Trencat</string>
<string name="pref_presence_settings">Disponibilitat</string>
<string name="pref_away_when_screen_off">Fora quan la pantalla està apagada</string>
<string name="pref_away_when_screen_off_summary">Marqueu el vostre recurs quan la pantalla estigui desactivada</string>
<string name="pref_dnd_on_silent_mode">\"No molesteu\" en modo silenciós</string>
<string name="pref_dnd_on_silent_mode_summary">Marqueu el vostre recurs com \"No molesteu\" quan el dispositiu estigui en modo silenciós</string>
<string name="pref_treat_vibrate_as_silent">Tracteu de vibrar al modo silenciós</string>
<string name="pref_treat_vibrate_as_dnd_summary">Marqueu el vostre recurs com \"No molesteu\" quan el dispositiu estigui en vibració</string>
<string name="pref_show_connection_options">Configuració de connexió estesa</string>
<string name="pref_show_connection_options_summary">Mostra el nom de la màquina i la configuració del port quan configureu un compte</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -316,7 +316,6 @@
<string name="account_status_bind_failure">Bind chyba</string>
<string name="server_info_broken">Rozbité</string>
<string name="pref_away_when_screen_off">Pryč při vypnuté obrazovce</string>
<string name="pref_away_when_screen_off_summary">Při vypnuté obrazovce označí váš stav jako pryč</string>
<string name="pref_treat_vibrate_as_silent">Vibrační mód brát stejně jako tichý</string>
<string name="pref_show_connection_options">Rozšířená nastavení připojení</string>
<string name="pref_show_connection_options_summary">Zobrazovat nastavení hostname a port při vytváření účtu</string>

View File

@ -460,12 +460,12 @@
<string name="account_status_host_unknown">Der Server ist nicht für diese Domain verantwortlich</string>
<string name="server_info_broken">Fehlerhaft</string>
<string name="pref_presence_settings">Status</string>
<string name="pref_away_when_screen_off">Abwesend bei abgeschaltetem Bildschirm</string>
<string name="pref_away_when_screen_off_summary">Setzt deinen Status auf \"abwesend\", solange dein Bildschirm abgeschaltet ist</string>
<string name="pref_dnd_on_silent_mode">\"Bitte nicht stören\" bei Stummschaltung</string>
<string name="pref_dnd_on_silent_mode_summary">Setzt deinen Status auf \"Bitte nicht stören\", solange dein Gerät stummgeschaltet ist </string>
<string name="pref_away_when_screen_off">Abwesend bei ausgeschaltetem Bildschirm</string>
<string name="pref_away_when_screen_off_summary">Als abwesend anzeigen, wenn der Bildschirm ausgeschaltet ist</string>
<string name="pref_dnd_on_silent_mode">Beschäftigt im lautlosen Modus</string>
<string name="pref_dnd_on_silent_mode_summary">Als Beschäftigt anzeigen, wenn sich das Gerät im lautlosen Modus befindet</string>
<string name="pref_treat_vibrate_as_silent">Vibration als Lautlos behandeln</string>
<string name="pref_treat_vibrate_as_dnd_summary">Setzt deinen Status auf \"Bitte nicht stören\", solange das Gerät auf Vibration geschaltet ist</string>
<string name="pref_treat_vibrate_as_dnd_summary">Als Beschäftigt anzeigen, wenn das Gerät auf Vibration eingestellt ist</string>
<string name="pref_show_connection_options">Erweiterte Verbindungsoptionen</string>
<string name="pref_show_connection_options_summary">Hostname- und Port-Optionen bei Kontoeinrichtung anzeigen</string>
<string name="hostname_example">xmpp.domain.de</string>
@ -923,6 +923,8 @@
<string name="could_not_switch_camera">Kamera konnte nicht gewechselt werden</string>
<string name="add_to_favorites">Zu Favoriten hinzufügen</string>
<string name="remove_from_favorites">Von Favoriten entfernen</string>
<string name="gpx_track">GPX-Strecke</string>
<string name="could_not_correct_message">Nachricht konnte nicht korrigiert werden</string>
<plurals name="view_users">
<item quantity="one">%1$d Teilnehmer anzeigen</item>
<item quantity="other">%1$d Teilnehmer anzeigen</item>

View File

@ -402,11 +402,7 @@
<string name="server_info_broken">Χαλασμένος</string>
<string name="pref_presence_settings">Διαθεσιμότητα</string>
<string name="pref_away_when_screen_off">Εκτός χρήσης όταν η οθόνη είναι σβηστή</string>
<string name="pref_away_when_screen_off_summary">Σημειώνει την παρουσία σας ως εκτός χρήσης όταν σβήνει η οθόνη</string>
<string name="pref_dnd_on_silent_mode">\"Μην ενοχλείτε\" όταν βρίσκεται σε σιωπηρή λειτουργία</string>
<string name="pref_dnd_on_silent_mode_summary">Σημειώνει την παρουσία σας ως \"Μην ενοχλείτε\" όταν η συσκευή είναι σε κατάσταση σιωπής</string>
<string name="pref_treat_vibrate_as_silent">Χρήση της κατάστασης δόνησης ως σιωπηρή κατάσταση</string>
<string name="pref_treat_vibrate_as_dnd_summary">Σημειώνει την παρουσία σας ως \"Μην ενοχλείτε\" όταν η συσκευή είναι σε κατάσταση δόνησης</string>
<string name="pref_show_connection_options">Περισσότερες ρυθμίσεις σύνδεσης</string>
<string name="pref_show_connection_options_summary">Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων πόρτας όταν δημιουργείται ένας νέος λογαριασμός</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -461,11 +461,11 @@
<string name="server_info_broken">Error</string>
<string name="pref_presence_settings">Disponibilidad</string>
<string name="pref_away_when_screen_off">Ausente con pantalla apagada</string>
<string name="pref_away_when_screen_off_summary">Cambia tu estado a ausente cuando la pantalla está apagada</string>
<string name="pref_dnd_on_silent_mode">\"No molestar\" en modo silencio</string>
<string name="pref_dnd_on_silent_mode_summary">Cambia tu estado a \"no molestar\" cuando el dispositivo está en modo silencio</string>
<string name="pref_away_when_screen_off_summary">Mostrar como Ausente cuando la pantalla esté apagada</string>
<string name="pref_dnd_on_silent_mode">Ocupado en modo silencio</string>
<string name="pref_dnd_on_silent_mode_summary">Mostrar como Ocupado cuando el dispositivo esté en modo silencio</string>
<string name="pref_treat_vibrate_as_silent">Modo vibración como modo silencio</string>
<string name="pref_treat_vibrate_as_dnd_summary">Cambia tu estado a \"no molestar\" cuando el dispositivo está en modo vibración</string>
<string name="pref_treat_vibrate_as_dnd_summary">Mostrar como Ocupado cuando el dispositivo esté en modo vibración</string>
<string name="pref_show_connection_options">Opciones de conexión</string>
<string name="pref_show_connection_options_summary">Mostrar el hostname y el puerto cuando se está creando una cuenta</string>
<string name="hostname_example">xmpp.ejemplo.com</string>
@ -923,6 +923,8 @@
<string name="could_not_switch_camera">No se ha podido cambiar de cámara</string>
<string name="add_to_favorites">Añadir a los favoritos</string>
<string name="remove_from_favorites">Eliminar de favoritos</string>
<string name="gpx_track">Recorrido GPX</string>
<string name="could_not_correct_message">No se pudo corregir el mensaje</string>
<plurals name="view_users">
<item quantity="one">Ver %1$d Participante</item>
<item quantity="other">Ver %1$d Participantes</item>

View File

@ -399,11 +399,7 @@
<string name="server_info_broken">Hondatuta</string>
<string name="pref_presence_settings">Eskuragarritasuna</string>
<string name="pref_away_when_screen_off">Urrun pantaila itzalita dagoenean</string>
<string name="pref_away_when_screen_off_summary">Zure baliabidea urrun bezala markatzen du pantaila itzalita dagoenean</string>
<string name="pref_dnd_on_silent_mode">\"Ez gogaitu\" modu isilean</string>
<string name="pref_dnd_on_silent_mode_summary">Zure baliabidea \"Ez gogaitu\" bezala markatzen du gailua modu isilean dagoenean</string>
<string name="pref_treat_vibrate_as_silent">Dardara modu isila bezala tratatu</string>
<string name="pref_treat_vibrate_as_dnd_summary">Zure baliabidea \"Ez gogaitu\" bezala markatzen du gailua dardara moduan dagoenean</string>
<string name="pref_show_connection_options">Konexioaren ezarpen luzatuak</string>
<string name="pref_show_connection_options_summary">Ostalariaren izena eta ataka ezarpenak erakutsi kontu bat ezartzerakoan</string>
<string name="hostname_example">xmpp.adibidea.com</string>

View File

@ -460,11 +460,7 @@
<string name="server_info_broken">Détraqué</string>
<string name="pref_presence_settings">Disponibilité</string>
<string name="pref_away_when_screen_off">Absent quand l\'écran est éteint</string>
<string name="pref_away_when_screen_off_summary">Marquer cette ressource comme absente quand l\'écran est éteint.</string>
<string name="pref_dnd_on_silent_mode">Indisponible en mode silencieux</string>
<string name="pref_dnd_on_silent_mode_summary">Marquer cette ressource comme Indisponible quand l\'appareil est en mode silencieux</string>
<string name="pref_treat_vibrate_as_silent">Indisponible en mode vibreur</string>
<string name="pref_treat_vibrate_as_dnd_summary">Marquer cette ressource comme Indisponible quand l\'appareil est en mode vibreur</string>
<string name="pref_show_connection_options">Paramètres de connexion avancés</string>
<string name="pref_show_connection_options_summary">Montrer le nom d\'hôte et le port lors du paramétrage d\'un compte</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -461,11 +461,11 @@
<string name="server_info_broken">Roto</string>
<string name="pref_presence_settings">Disponibilidade</string>
<string name="pref_away_when_screen_off">Non dispoñible cando se apaga a pantalla</string>
<string name="pref_away_when_screen_off_summary">Marca o seu recurso como non dipoñíble cando se apaga a pantalla</string>
<string name="pref_dnd_on_silent_mode">\"Non molestar\" en modo silencioso</string>
<string name="pref_dnd_on_silent_mode_summary">Marca o seu recurso como \"Non molestar\" cando o dispositivo está en modo silencioso</string>
<string name="pref_away_when_screen_off_summary">Mostrar como Fóra cando se apaga a pantalla</string>
<string name="pref_dnd_on_silent_mode">En modolo silencioso, Ocupado</string>
<string name="pref_dnd_on_silent_mode_summary">Mostrar como Ocupado se o dispositivo está en silencio</string>
<string name="pref_treat_vibrate_as_silent">Trata a vibración como modo silencioso</string>
<string name="pref_treat_vibrate_as_dnd_summary">Marca o seu recurso como \"Non molestar\" cando o dispositivo está en modo vibración</string>
<string name="pref_treat_vibrate_as_dnd_summary">Mostrar como Ocupado cando o dispositivo está en vibración</string>
<string name="pref_show_connection_options">Axustes ampliados de conexión</string>
<string name="pref_show_connection_options_summary">Mostar axustes de servidor e porto cando se configura unha conta</string>
<string name="hostname_example">xmpp.exemplo.com</string>
@ -923,6 +923,8 @@
<string name="could_not_switch_camera">Non se puido activar a cámara</string>
<string name="add_to_favorites">Engadir a favoritas</string>
<string name="remove_from_favorites">Eliminar das favoritas</string>
<string name="gpx_track">Ruta GPX</string>
<string name="could_not_correct_message">No se pode correxir a mensaxe</string>
<plurals name="view_users">
<item quantity="one">Ver %1$d Participante</item>
<item quantity="other">Ver %1$d Participantes</item>

View File

@ -443,11 +443,7 @@
<string name="server_info_broken">Törött</string>
<string name="pref_presence_settings">Elérhetőség</string>
<string name="pref_away_when_screen_off">„Távol”, ha a kijelző ki van kapcsolva</string>
<string name="pref_away_when_screen_off_summary">„Távol” állapotként jelöli az erőforrást, ha a kijelző ki van kapcsolva</string>
<string name="pref_dnd_on_silent_mode">„Ne zavarjon” csendes módban</string>
<string name="pref_dnd_on_silent_mode_summary">„Ne zavarjon” állapotként jelöli az erőforrást, ha az eszköz csendes módban van</string>
<string name="pref_treat_vibrate_as_silent">Rezgés kezelése csendes módként</string>
<string name="pref_treat_vibrate_as_dnd_summary">„Ne zavarjon” állapotként jelöli az erőforrást, ha az eszköz rezgő módban van</string>
<string name="pref_show_connection_options">Kiterjesztett kapcsolati beállítások</string>
<string name="pref_show_connection_options_summary">Gépnév és port beállításainak megjelenítése egy fiók beállításakor</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -401,6 +401,7 @@
<string name="mark_as_read">Segna come già letto</string>
<string name="pref_input_options">Input</string>
<string name="pref_enter_is_send">Invio spedisce</string>
<string name="pref_enter_is_send_summary">Usa il tasto Invio per spedire il messaggio. Puoi sempre usare Ctrl+Invio per spedire, anche se questa opzione è disattivata.</string>
<string name="pref_display_enter_key">Mostra il tasto invio</string>
<string name="pref_display_enter_key_summary">Cambia il tasto delle faccine nel tasto di invio</string>
<string name="audio">audio</string>
@ -460,11 +461,7 @@
<string name="server_info_broken">Rotto</string>
<string name="pref_presence_settings">Disponibilità</string>
<string name="pref_away_when_screen_off">\"Non disponibile\" a schermo spento</string>
<string name="pref_away_when_screen_off_summary">Imposta la tua risorsa come non disponibile quando lo schermo è spento</string>
<string name="pref_dnd_on_silent_mode">\"Non disturbare\" in modalità silenziosa</string>
<string name="pref_dnd_on_silent_mode_summary">Segna la tua risorsa come \"Non disturbare\" quando il dispositivo è in modalità silenziosa</string>
<string name="pref_treat_vibrate_as_silent">Tratta vibrazione come modalità silenziosa</string>
<string name="pref_treat_vibrate_as_dnd_summary">Segna la tua risorsa come \"Non disturbare\" quando il dispositivo ha solo la vibrazione</string>
<string name="pref_show_connection_options">Impostazioni estese di connessione</string>
<string name="pref_show_connection_options_summary">Mostra nome host e impostazioni della porta quando configuri un account</string>
<string name="hostname_example">xmpp.esempio.it</string>
@ -915,6 +912,7 @@
<string name="audio_call">Chiamata vocale</string>
<string name="video_call">Chiamata video</string>
<string name="help">Aiuto</string>
<string name="switch_to_conversation">Passa alla conversazione</string>
<string name="microphone_unavailable">Il tuo microfono non è disponibile</string>
<string name="only_one_call_at_a_time">Puoi fare solo una chiamata alla volta.</string>
<string name="return_to_ongoing_call">Torna alla chiamata in corso</string>

View File

@ -266,7 +266,6 @@
<string name="download_failed_could_not_connect">ההורדה נכשלה: נכשל ביצוע חיבור לשרת</string>
<string name="server_info_broken">לא עובד</string>
<string name="pref_away_when_screen_off">העבר למצב \"לא נמצא\" כאשר המסך כבוי</string>
<string name="pref_away_when_screen_off_summary">מעביר את המכשיר לסטטוס \"לא נמצא\" כאשר המסך כבוי</string>
<string name="action_renew_certificate">חידוש תעודה</string>
<string name="error_fetching_omemo_key">שגיאה בתפיסת OMEMO!</string>
<string name="pref_use_tor">התחבר דרך Tor</string>

View File

@ -367,11 +367,7 @@
<string name="server_info_broken">壊れています</string>
<string name="pref_presence_settings">可用性</string>
<string name="pref_away_when_screen_off">画面がオフのときは離席</string>
<string name="pref_away_when_screen_off_summary">画面がオフになっているとき、リソースを離席としてマークします</string>
<string name="pref_dnd_on_silent_mode">サイレントモード時 “邪魔しないで”</string>
<string name="pref_dnd_on_silent_mode_summary">デバイスがサイレントモードの時に、リソースを “邪魔しないで” としてマークします</string>
<string name="pref_treat_vibrate_as_silent">バイブレートをサイレントモードとして扱う</string>
<string name="pref_treat_vibrate_as_dnd_summary">デバイスがバイブレートの時に、リソースを “邪魔しないで” としてマークします</string>
<string name="pref_show_connection_options">拡張接続設定</string>
<string name="pref_show_connection_options_summary">アカウントを設定するときにホスト名とポートの設定を表示します</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -306,7 +306,6 @@
<string name="account_status_bind_failure">바인드 실패</string>
<string name="server_info_broken">손상됨</string>
<string name="pref_away_when_screen_off">화면이 꺼져있을 경우 자리 비움으로 표시</string>
<string name="pref_away_when_screen_off_summary">화면이 꺼져있을 경우에 자리 비움으로 상태를 표시함</string>
<string name="pref_treat_vibrate_as_silent">진동을 자동으로 처리</string>
<string name="pref_show_connection_options">확장 연결 설정</string>
<string name="pref_show_connection_options_summary">계정을 설정할 때 호스트 이름과 포트 설정을 표시합니다</string>

View File

@ -335,11 +335,7 @@
<string name="account_status_bind_failure">Klarte ikke å binde</string>
<string name="server_info_broken">Knekt</string>
<string name="pref_away_when_screen_off">Borte når skjermen er av</string>
<string name="pref_away_when_screen_off_summary">Markerer din ressurs som borte når skjermen er avskrudd</string>
<string name="pref_dnd_on_silent_mode">“Ikke forstyrr” i stillemodus.</string>
<string name="pref_dnd_on_silent_mode_summary">Merker din ressurs som \"Ikke forstyrr\" når enheten er i stillemodus.</string>
<string name="pref_treat_vibrate_as_silent">Behandle vibrering som stille-modus</string>
<string name="pref_treat_vibrate_as_dnd_summary">Merker din ressurs som \"Ikke forstyrr\" når enheten er skrudd til vibrering</string>
<string name="pref_show_connection_options">Utvidede tilkoblingsinnst.</string>
<string name="pref_show_connection_options_summary">Vis vertsnavn og portinnstillinger når du setter opp en ny konto</string>
<string name="hostname_example">xmpp.eksempel.no</string>

View File

@ -411,11 +411,7 @@
<string name="server_info_broken">Gebroken</string>
<string name="pref_presence_settings">Aanwezigheid</string>
<string name="pref_away_when_screen_off">Even weg wanneer scherm uit staat</string>
<string name="pref_away_when_screen_off_summary">Stelt je bron in als even weg wanneer het scherm uitgeschakeld is</string>
<string name="pref_dnd_on_silent_mode">“Niet storen” in stille modus</string>
<string name="pref_dnd_on_silent_mode_summary">Stelt je bron in als “Niet storen” wanneer je apparaat in stille modus staat</string>
<string name="pref_treat_vibrate_as_silent">Trillen behandelen als stille modus</string>
<string name="pref_treat_vibrate_as_dnd_summary">Stelt je bron in als “Niet storen” wanneer je apparaat in trilmodus staat</string>
<string name="pref_show_connection_options">Uitgebreide verbindingsinstellingen</string>
<string name="pref_show_connection_options_summary">Toon hostnaam- en poortinstellingen bij instellen van een account</string>
<string name="hostname_example">xmpp.voorbeeld.be</string>

View File

@ -462,11 +462,7 @@
<string name="server_info_broken">Zepsute</string>
<string name="pref_presence_settings">Dostępność</string>
<string name="pref_away_when_screen_off">Status \"Oddalony\" gdy wyświetlacz jest wyłączony</string>
<string name="pref_away_when_screen_off_summary">Oznacza twój zasób jako \"Oddalony\", gdy wyświetlacz jest wyłączony</string>
<string name="pref_dnd_on_silent_mode">\"Nie przeszkadzać\" w trybie cichym</string>
<string name="pref_dnd_on_silent_mode_summary">Oznacza twój zasób jako \"Nie przeszkadzać\", gdy urządzenie jest w trybie cichym</string>
<string name="pref_treat_vibrate_as_silent">Traktuj tryb wibracji jak tryb cichy</string>
<string name="pref_treat_vibrate_as_dnd_summary">Oznacza twój zasób jako \"Nie przeszkadzać\", gdy urządzenie jest w trybie wibracji</string>
<string name="pref_show_connection_options">Rozszerzone ustawienia połączenia</string>
<string name="pref_show_connection_options_summary">Pokaż nazwę hosta i ustawienia portu przy dodawaniu konta</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -401,6 +401,7 @@
<string name="mark_as_read">Marcar como lida</string>
<string name="pref_input_options">Entrada</string>
<string name="pref_enter_is_send">Enter envia</string>
<string name="pref_enter_is_send_summary">Use a tecla Enter para enviar mensagens. Você sempre pode usar Ctrl+Enter para enviar mensagens, mesmo se essa opção estiver desabilitada.</string>
<string name="pref_display_enter_key">Exibir o botão Enter</string>
<string name="pref_display_enter_key_summary">Altera o botão de emoticons para um botão Enter.</string>
<string name="audio">áudio</string>
@ -459,12 +460,12 @@
<string name="account_status_host_unknown">O servidor não responde por esse domínio</string>
<string name="server_info_broken">Quebrado</string>
<string name="pref_presence_settings">Disponibilidade</string>
<string name="pref_away_when_screen_off">Afastado quando a tela estiver desligada</string>
<string name="pref_away_when_screen_off_summary">Define o seu status como afastado quando a tela estiver desligada.</string>
<string name="pref_dnd_on_silent_mode">\"Não perturbe\" em modo silencioso</string>
<string name="pref_dnd_on_silent_mode_summary">Define o seu status como \"Não perturbe\" quando o dispositivo estiver em modo silencioso</string>
<string name="pref_away_when_screen_off">\"Afastado\" quando a tela estiver desligada</string>
<string name="pref_away_when_screen_off_summary">Exibe como Afastado quando a tela for desligada</string>
<string name="pref_dnd_on_silent_mode">\"Ocupado\" no modo silencioso</string>
<string name="pref_dnd_on_silent_mode_summary">Exibe como Ocupado quando o dispositivo estiver em modo silencioso</string>
<string name="pref_treat_vibrate_as_silent">Considerar o modo de vibração como silencioso</string>
<string name="pref_treat_vibrate_as_dnd_summary">Define o seu status como \"Não perturbe\" quando o dispositivo estiver no modo de vibração</string>
<string name="pref_treat_vibrate_as_dnd_summary">Exibe como Ocupado quando o dispositivo estiver em vibratório</string>
<string name="pref_show_connection_options">Configurações detalhadas da conexão</string>
<string name="pref_show_connection_options_summary">Exibe o nome de host e configurações da porta ao configurar uma conta.</string>
<string name="hostname_example">xmpp.example.com</string>
@ -900,6 +901,7 @@
<string name="rtp_state_ringing">Tocando</string>
<string name="rtp_state_declined_or_busy">Ocupado</string>
<string name="rtp_state_connectivity_error">Não foi possível conectar à chamada</string>
<string name="rtp_state_connectivity_lost_error">Conexão perdida</string>
<string name="rtp_state_retracted">Chamada rejeitada</string>
<string name="rtp_state_application_failure">Falha no aplicativo</string>
<string name="hang_up">Desligar</string>
@ -913,12 +915,16 @@
<string name="missed_call">Chamada perdida</string>
<string name="audio_call">Chamada de áudio</string>
<string name="video_call">Chamada de vídeo</string>
<string name="help">Ajuda</string>
<string name="switch_to_conversation">Alternar para a conversa</string>
<string name="microphone_unavailable">Seu microfone não está disponível</string>
<string name="only_one_call_at_a_time">Você só pode ter uma chamada de cada vez</string>
<string name="return_to_ongoing_call">Retornar para a chamada em andamento</string>
<string name="could_not_switch_camera">Não foi possível trocar a câmera</string>
<string name="add_to_favorites">Adicionar aos favoritos</string>
<string name="remove_from_favorites">Remover dos favoritos</string>
<string name="gpx_track">Trilha GPX</string>
<string name="could_not_correct_message">Não foi possível corrigir a mensagem</string>
<plurals name="view_users">
<item quantity="one">Ver %1$d participante</item>
<item quantity="other">Ver %1$d participantes</item>

View File

@ -330,8 +330,6 @@
<string name="server_info_broken">Existe um problema</string>
<string name="pref_presence_settings">Disponibilidade</string>
<string name="pref_away_when_screen_off">Ausente quando o ecrã está desligado</string>
<string name="pref_away_when_screen_off_summary">Define o seu recurso como ausente quando o ecrã está desligado</string>
<string name="pref_dnd_on_silent_mode">\"Não incomodar\" em modo silencioso</string>
<string name="pref_treat_vibrate_as_silent">Tratar vibrar como modo silencioso</string>
<string name="pref_show_connection_options">Definições de conexão</string>
<string name="pref_show_connection_options_summary">Mostrar as definições do hostname e do porto ao configurar uma conta</string>

View File

@ -463,10 +463,10 @@
<string name="pref_presence_settings">Setări de disponibilitate</string>
<string name="pref_away_when_screen_off">Plecat când ecranul este oprit</string>
<string name="pref_away_when_screen_off_summary">Prezintă clientul drept \"Plecat\" atunci când ecranul este oprit</string>
<string name="pref_dnd_on_silent_mode">\"Nu deranja\" în modul silențios</string>
<string name="pref_dnd_on_silent_mode_summary">Prezintă clientul drept \"Nu deranja\" atunci când dispozitivul este în mod silențios</string>
<string name="pref_dnd_on_silent_mode">\"Ocupat\" în modul silențios</string>
<string name="pref_dnd_on_silent_mode_summary">Prezintă clientul drept \"Ocupat\" atunci când dispozitivul este în mod silențios</string>
<string name="pref_treat_vibrate_as_silent">Tratează modul vibrație ca silențios</string>
<string name="pref_treat_vibrate_as_dnd_summary">Prezintă clientul drept \"Nu deranja\" atunci când dispozitivul este în mod vibrație</string>
<string name="pref_treat_vibrate_as_dnd_summary">Prezintă clientul drept \"Ocupat\" atunci când dispozitivul este în mod vibrație</string>
<string name="pref_show_connection_options">Opțiuni avansate conexiune</string>
<string name="pref_show_connection_options_summary">Arată opțiunea de setare a numelui de gazdă și a portului, atunci când se configurează un cont</string>
<string name="hostname_example">xmpp.exemplu.ro</string>
@ -931,6 +931,8 @@
<string name="could_not_switch_camera">Nu s-a putut face comutarea camerei foto</string>
<string name="add_to_favorites">Adaugă la favorite</string>
<string name="remove_from_favorites">Înlătură din favorite</string>
<string name="gpx_track">Traseu GPX</string>
<string name="could_not_correct_message">Nu s-a putut corecta mesajul</string>
<plurals name="view_users">
<item quantity="one">Arată %1$d participant</item>
<item quantity="few">Arată %1$d participanți</item>

View File

@ -53,7 +53,7 @@
<string name="change_password_on_server">Изменить пароль на сервере</string>
<string name="share_with">Поделиться с</string>
<string name="start_conversation">Начать беседу</string>
<string name="invite_contact">Пригласить собеседника</string>
<string name="invite_contact">Пригласить контакт</string>
<string name="invite">Пригласить</string>
<string name="contacts">Контакты</string>
<string name="contact">Контакт</string>
@ -298,6 +298,8 @@
<string name="hosted_on">размещено на %s</string>
<string name="checking_x">Проверка %s на сервере HTTP</string>
<string name="not_connected_try_again">Вы неподключены. Попробуйте позже</string>
<string name="check_x_filesize">Проверить размер %s</string>
<string name="check_x_filesize_on_host">Проверить размер %1$s на %2$s</string>
<string name="message_options">Опции сообщения</string>
<string name="quote">Цитировать</string>
<string name="paste_as_quote">Вставить как цитату</string>
@ -399,6 +401,7 @@
<string name="mark_as_read">Прочитано</string>
<string name="pref_input_options">Ввод</string>
<string name="pref_enter_is_send">Отправить на \"Enter\"</string>
<string name="pref_enter_is_send_summary">Отправлять сообщения клавишей Enter. Даже если эта опция отключена, сообщение можно отправить, нажав Ctrl+Enter.</string>
<string name="pref_display_enter_key">Показывать клавишу ввода</string>
<string name="pref_display_enter_key_summary">Поменять кнопку смайликов на кнопку ввода</string>
<string name="audio">аудио</string>
@ -460,11 +463,7 @@
<string name="server_info_broken">Повреждено</string>
<string name="pref_presence_settings">Доступность</string>
<string name="pref_away_when_screen_off">\"Отошёл\" когда экран выключен</string>
<string name="pref_away_when_screen_off_summary">Устанавливает статус \"Отошёл\", когда экран выключен</string>
<string name="pref_dnd_on_silent_mode">\"Не беспокоить\" в беззвучном режиме</string>
<string name="pref_dnd_on_silent_mode_summary">Устанавливает статус \"Не беспокоить\", когда устройство в беззвучном режиме</string>
<string name="pref_treat_vibrate_as_silent">Не доступен в режиме вибрации</string>
<string name="pref_treat_vibrate_as_dnd_summary">Устанавливает статус \"Не беспокоить\", когда устройство на вибрации</string>
<string name="pref_show_connection_options">Расширенные настройки подключения</string>
<string name="pref_show_connection_options_summary">Показывать имя сервера и порт в настройках аккаунтов</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -349,11 +349,7 @@
<string name="server_info_broken">Оштећен</string>
<string name="pref_presence_settings">Доступност</string>
<string name="pref_away_when_screen_off">Одсутан кад је екран искључен</string>
<string name="pref_away_when_screen_off_summary">Означавање вашег ресурса као одсутан кад је екран искључен</string>
<string name="pref_dnd_on_silent_mode">„Не ометај“ у нечујном режиму</string>
<string name="pref_dnd_on_silent_mode_summary">Означавање вашег ресурса као „не ометај“ кад је уређај у нечујном режиму</string>
<string name="pref_treat_vibrate_as_silent">Вибрација је нечујни режим</string>
<string name="pref_treat_vibrate_as_dnd_summary">Означавање вашег ресурса као „не ометај“ кад је уређај у режиму вибрирања</string>
<string name="pref_show_connection_options">Проширене поставке повезивања</string>
<string name="pref_show_connection_options_summary">Приказ домаћина и порта у поставкама налога</string>
<string name="hostname_example">xmpp.primer.com</string>

View File

@ -370,8 +370,6 @@
<string name="server_info_broken">Sönder</string>
<string name="pref_presence_settings">Tillgänglighet</string>
<string name="pref_away_when_screen_off">Status borta när skärmen är av</string>
<string name="pref_away_when_screen_off_summary">Sätter din tillgänglighet till borta när skrämen är av</string>
<string name="pref_dnd_on_silent_mode">\"Stör ej\" i tyst läge</string>
<string name="pref_treat_vibrate_as_silent">Hantera vibrationsläge som tyst läge</string>
<string name="pref_show_connection_options">Utökade anslutningsinställningar</string>
<string name="pref_show_connection_options_summary">Visa val av servernamn och port vid inställning av konto</string>

View File

@ -321,7 +321,6 @@
<string name="account_status_bind_failure">Bağlantı başarısız</string>
<string name="server_info_broken">Bozuk</string>
<string name="pref_away_when_screen_off">Ekran kapandığında uzakta</string>
<string name="pref_away_when_screen_off_summary">Ekran kapandığında çevrim içi durum bildiriminizi uzakta olarak değiştirir</string>
<string name="pref_treat_vibrate_as_silent">Titreşim kipini sessiz kip olarak değerlendir</string>
<string name="pref_show_connection_options">Genişletilmiş bağlantı seçenekleri</string>
<string name="pref_show_connection_options_summary">Hesap oluştururken sunucu adıyla bağlantı noktası seçeneğini göster</string>

View File

@ -367,7 +367,7 @@
<string name="enable_all_accounts">Увімкнути всі облікові записи</string>
<string name="disable_all_accounts">Вимкнути всі облікові записи</string>
<string name="perform_action_with">Здійснити дію з</string>
<string name="no_affiliation">Непов\'язаний</string>
<string name="no_affiliation">Учасник</string>
<string name="no_role">Поза мережею</string>
<string name="outcast">Вигнанець</string>
<string name="member">Учасник</string>
@ -380,7 +380,7 @@
<string name="remove_owner_privileges">Відкликати права власника</string>
<string name="remove_from_room">Вилучити з групи</string>
<string name="remove_from_channel">Прибрати з каналу</string>
<string name="could_not_change_affiliation">Неможливо змінити статус приєднання з %s</string>
<string name="could_not_change_affiliation">Неможливо змінити статус участі %s</string>
<string name="ban_from_conference">Заборонити доступ до групи</string>
<string name="ban_from_channel">Вилучити з каналу</string>
<string name="removing_from_public_conference">Ви намагаєтеся вилучити %s з публічного каналу. Єдиним способом для цього є заблокувати користувача назавжди.</string>
@ -401,6 +401,7 @@
<string name="mark_as_read">Позначити як прочитане</string>
<string name="pref_input_options">Введення</string>
<string name="pref_enter_is_send">Enter для надсилання</string>
<string name="pref_enter_is_send_summary">Використовувати кнопку Enter для надсилання повідомлень. Якщо цей параметр вимкнено, повідомлення можна надсилати за допомогою комбінації Ctrl-Enter. </string>
<string name="pref_display_enter_key">Показувати кнопку Enter</string>
<string name="pref_display_enter_key_summary">Змінити клавішу емоційок на кнопку Enter</string>
<string name="audio">аудіо</string>
@ -462,11 +463,7 @@
<string name="server_info_broken">Поламано</string>
<string name="pref_presence_settings">Доступність</string>
<string name="pref_away_when_screen_off">Відійшов, якщо екран вимкнено</string>
<string name="pref_away_when_screen_off_summary">Показувати стан \"відійшов\", якщо екран вимкнено</string>
<string name="pref_dnd_on_silent_mode">\"Не турбувати\" в режимі тиші</string>
<string name="pref_dnd_on_silent_mode_summary">Додавати \"Не турбувати\" до імені вашого пристрою, коли пристрій в режимі тиші</string>
<string name="pref_treat_vibrate_as_silent">Вважати вібро за безшумний режим</string>
<string name="pref_treat_vibrate_as_dnd_summary">Додавати \"Не турбувати\" до імені вашого пристрою, коли пристрій в режимі вібрації</string>
<string name="pref_show_connection_options">Розширені налаштування з\'єднання</string>
<string name="pref_show_connection_options_summary">Показати налаштування імені вузла та порту при налаштуванні облікового запису</string>
<string name="hostname_example">xmpp.example.com</string>

View File

@ -290,7 +290,6 @@
<string name="account_status_tor_unavailable">Mạng Tor chưa sẵn sàng</string>
<string name="server_info_broken">Bị hỏng</string>
<string name="pref_away_when_screen_off">Vắng mặt khi màn hình tắt</string>
<string name="pref_away_when_screen_off_summary">Hiện ứng dụng là \'vắng mặt\' khi màn hình tắt</string>
<string name="action_renew_certificate">Gia hạn chứng nhận</string>
<string name="error_fetching_omemo_key">Lỗi nhập khoá OMEMO!</string>
<string name="verified_omemo_key_with_certificate">Khoá OMEMO đã xác minh với chứng nhận!</string>

View File

@ -401,6 +401,7 @@
<string name="mark_as_read">标记为已读</string>
<string name="pref_input_options">输入</string>
<string name="pref_enter_is_send">点击回车发送</string>
<string name="pref_enter_is_send_summary">使用Enter键发送消息。即使禁用此选项也可以使用Ctrl+Enter发送消息。</string>
<string name="pref_display_enter_key">显示回车键</string>
<string name="pref_display_enter_key_summary">将表情键改为回车键</string>
<string name="audio">音频</string>
@ -459,11 +460,7 @@
<string name="server_info_broken">损坏</string>
<string name="pref_presence_settings">可用性</string>
<string name="pref_away_when_screen_off">锁屏时显示离开</string>
<string name="pref_away_when_screen_off_summary">锁屏时标记为离开状态</string>
<string name="pref_dnd_on_silent_mode">静音模式时设为“请勿打扰”</string>
<string name="pref_dnd_on_silent_mode_summary">当设备静音时标记为“请勿打扰”状态</string>
<string name="pref_treat_vibrate_as_silent">将振动看作静音</string>
<string name="pref_treat_vibrate_as_dnd_summary">使用振动模式时标记为“请勿打扰”状态</string>
<string name="pref_show_connection_options">高级连接设置</string>
<string name="pref_show_connection_options_summary">注册账户时显示主机名和端口</string>
<string name="hostname_example">xmpp.example.com</string>
@ -907,6 +904,7 @@
<string name="audio_call">语音通话</string>
<string name="video_call">视频通话</string>
<string name="help">帮助</string>
<string name="switch_to_conversation">切换到对话</string>
<string name="microphone_unavailable">麦克风不可用</string>
<string name="only_one_call_at_a_time">只能同时打一通电话</string>
<string name="return_to_ongoing_call">返回正在进行的通话</string>

View File

@ -309,7 +309,6 @@
<string name="account_status_bind_failure">綁定失敗</string>
<string name="server_info_broken">損壞</string>
<string name="pref_away_when_screen_off">關閉螢幕時離開</string>
<string name="pref_away_when_screen_off_summary">當螢幕關閉時將標記您的資源為離開狀態</string>
<string name="pref_treat_vibrate_as_silent">靜音模式開啟振動</string>
<string name="pref_show_connection_options">高級連接設置</string>
<string name="pref_show_connection_options_summary">註冊帳戶時顯示主機名稱和埠</string>

View File

@ -66,6 +66,7 @@
<attr name="media_preview_recording" format="reference" />
<attr name="media_preview_audio" format="reference" />
<attr name="media_preview_location" format="reference" />
<attr name="media_preview_tour" format="reference" />
<attr name="media_preview_contact" format="reference" />
<attr name="media_preview_app" format="reference" />
<attr name="media_preview_calendar" format="reference" />

View File

@ -461,11 +461,11 @@
<string name="server_info_broken">Broken</string>
<string name="pref_presence_settings">Availability</string>
<string name="pref_away_when_screen_off">Away when screen is off</string>
<string name="pref_away_when_screen_off_summary">Marks your resource as away when the screen is turned off</string>
<string name="pref_dnd_on_silent_mode">“Do not disturb” in silent mode</string>
<string name="pref_dnd_on_silent_mode_summary">Marks your resource as “Do not disturb” when device is in silent mode</string>
<string name="pref_away_when_screen_off_summary">Show as Away when the screen is turned off</string>
<string name="pref_dnd_on_silent_mode">Busy in silent mode</string>
<string name="pref_dnd_on_silent_mode_summary">Show as Busy when device is in silent mode</string>
<string name="pref_treat_vibrate_as_silent">Treat vibrate as silent mode</string>
<string name="pref_treat_vibrate_as_dnd_summary">Marks your resource as “Do not disturb” when device is on vibrate</string>
<string name="pref_treat_vibrate_as_dnd_summary">Show as Busy when device is on vibrate</string>
<string name="pref_show_connection_options">Extended connection settings</string>
<string name="pref_show_connection_options_summary">Show hostname and port settings when setting up an account</string>
<string name="hostname_example">xmpp.example.com</string>
@ -925,6 +925,8 @@
<string name="could_not_switch_camera">Could not switch camera</string>
<string name="add_to_favorites">Add to favorites</string>
<string name="remove_from_favorites">Remove from favorites</string>
<string name="gpx_track">GPX track</string>
<string name="could_not_correct_message">Could not correct message</string>
<plurals name="view_users">
<item quantity="one">View %1$d Participant</item>
<item quantity="other">View %1$d Participants</item>

View File

@ -85,6 +85,7 @@
<item name="media_preview_recording" type="reference">@drawable/ic_mic_black_48dp</item>
<item name="media_preview_audio" type="reference">@drawable/ic_headset_black_48dp</item>
<item name="media_preview_location" type="reference">@drawable/ic_room_black_48dp</item>
<item name="media_preview_tour" type="reference">@drawable/baseline_tour_black_48</item>
<item name="media_preview_contact" type="reference">@drawable/ic_person_black_48dp</item>
<item name="media_preview_app" type="reference">@drawable/ic_android_black_48dp</item>
<item name="media_preview_calendar" type="reference">@drawable/ic_event_black_48dp</item>
@ -240,6 +241,7 @@
<item name="media_preview_recording" type="reference">@drawable/ic_mic_white_48dp</item>
<item name="media_preview_audio" type="reference">@drawable/ic_headset_white_48dp</item>
<item name="media_preview_location" type="reference">@drawable/ic_room_white_48dp</item>
<item name="media_preview_tour" type="reference">@drawable/baseline_tour_white_48</item>
<item name="media_preview_contact" type="reference">@drawable/ic_person_white_48dp</item>
<item name="media_preview_app" type="reference">@drawable/ic_android_white_48dp</item>
<item name="media_preview_calendar" type="reference">@drawable/ic_event_white_48dp</item>