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 # Changelog
### Version 2.8.10
* Handle GPX files
* Improve performance for backup restore
* bug fixes
### Version 2.8.9 ### Version 2.8.9
* add 'Return to chat' to audio call screen * add 'Return to chat' to audio call screen

View File

@ -8,7 +8,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { 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 { defaultConfig {
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 25 targetSdkVersion 25
versionCode 395 versionCode 397
versionName "2.8.9" versionName "2.8.10"
archivesBaseName += "-$versionName" archivesBaseName += "-$versionName"
applicationId "eu.sum7.conversations" applicationId "eu.sum7.conversations"
resValue "string", "applicationId", applicationId 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 distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists 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 android.util.Log;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import com.google.common.base.Stopwatch;
import com.google.common.io.CountingInputStream; import com.google.common.io.CountingInputStream;
import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.engines.AESEngine;
@ -189,6 +190,7 @@ public class ImportBackupService extends Service {
private boolean importBackup(final Uri uri, final String password) { private boolean importBackup(final Uri uri, final String password) {
Log.d(Config.LOGTAG, "importing backup from " + uri); Log.d(Config.LOGTAG, "importing backup from " + uri);
final Stopwatch stopwatch = Stopwatch.createStarted();
try { try {
final SQLiteDatabase db = mDatabaseBackend.getWritableDatabase(); final SQLiteDatabase db = mDatabaseBackend.getWritableDatabase();
final InputStream inputStream; final InputStream inputStream;
@ -233,12 +235,13 @@ public class ImportBackupService extends Service {
final byte[] key = ExportBackupService.getKey(password, backupFileHeader.getSalt()); 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())); cipher.init(false, new AEADParameters(new KeyParameter(key), 128, backupFileHeader.getIv()));
final CipherInputStream cipherInputStream = new CipherInputStream(countingInputStream, cipher); final CipherInputStream cipherInputStream = new CipherInputStream(countingInputStream, cipher);
final GZIPInputStream gzipInputStream = new GZIPInputStream(cipherInputStream); 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; String line;
StringBuilder multiLineQuery = null; StringBuilder multiLineQuery = null;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
@ -260,11 +263,13 @@ public class ImportBackupService extends Service {
} }
} }
} }
db.setTransactionSuccessful();
db.endTransaction();
final Jid jid = backupFileHeader.getJid(); 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(); countCursor.moveToFirst();
int count = countCursor.getInt(0); final int count = countCursor.getInt(0);
Log.d(Config.LOGTAG, "restored " + count + " messages"); Log.d(Config.LOGTAG, String.format("restored %d messages in %s", count, stopwatch.stop().toString()));
countCursor.close(); countCursor.close();
stopBackgroundService(); stopBackgroundService();
synchronized (mOnBackupProcessedListeners) { synchronized (mOnBackupProcessedListeners) {
@ -274,7 +279,7 @@ public class ImportBackupService extends Service {
} }
return true; return true;
} catch (final Exception e) { } catch (final Exception e) {
Throwable throwable = e.getCause(); final Throwable throwable = e.getCause();
final boolean reasonWasCrypto = throwable instanceof BadPaddingException || e instanceof ZipException; final boolean reasonWasCrypto = throwable instanceof BadPaddingException || e instanceof ZipException;
synchronized (mOnBackupProcessedListeners) { synchronized (mOnBackupProcessedListeners) {
for (OnBackupProcessed l : 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_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="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> <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_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="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> <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_on_x">Вас пригласили на %1$s. Мы проведём вас через процесс создания аккаунта. Аккаунт на %1$s позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
<string name="magic_create_text_fixed">Вас пригласили на %1$s. Вам уже назначили имя пользователя. Мы проведём вас через процесс создания аккаунта. Этот аккаунт позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string> <string name="magic_create_text_fixed">Вас пригласили на %1$s. Вам уже назначили имя пользователя. Мы проведём вас через процесс создания аккаунта. Этот аккаунт позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
<string name="your_server_invitation">Ваше приглашение</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_on_x">您已受邀参加%1$s。 我们将指导您完成创建帐户的过程。\n选择%1$s作为提供者后您可以通过提供其他人的完整XMPP地址与其他提供者的用户进行交流。</string>
<string name="magic_create_text_fixed">您已受邀参加%1$s。 已经为您选择了一个用户名。 我们将指导您完成创建帐户的过程。\n您可以通过向其他提供商的用户提供完整的XMPP地址来与他们进行交流。</string> <string name="magic_create_text_fixed">您已受邀参加%1$s。 已经为您选择了一个用户名。 我们将指导您完成创建帐户的过程。\n您可以通过向其他提供商的用户提供完整的XMPP地址来与他们进行交流。</string>
<string name="your_server_invitation">你的服务器邀请</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() { public boolean isEditable() {
return getStatus() != STATUS_RECEIVED && !isCarbon(); return status != STATUS_RECEIVED && !isCarbon() && type != Message.TYPE_RTP_SESSION;
} }
public boolean mergeable(final Message message) { public boolean mergeable(final Message message) {

View File

@ -225,19 +225,31 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
private void execute(final Query query) { private void execute(final Query query) {
final Account account = query.getAccount(); final Account account = query.getAccount();
if (account.getStatus() == Account.State.ONLINE) { 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()); 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) -> { 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) { if (p.getType() == IqPacket.TYPE.TIMEOUT) {
synchronized (MessageArchiveService.this.queries) { synchronized (this.queries) {
MessageArchiveService.this.queries.remove(query); this.queries.remove(query);
if (query.hasCallback()) { if (query.hasCallback()) {
query.callback(false); query.callback(false);
} }
} }
} else if (p.getType() == IqPacket.TYPE.RESULT && fin != null) { } else if (p.getType() == IqPacket.TYPE.RESULT && fin != null) {
final boolean running;
synchronized (this.queries) {
running = this.queries.contains(query);
}
if (running) {
processFin(query, fin); 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()) { } else if (p.getType() == IqPacket.TYPE.RESULT && query.isLegacy()) {
//do nothing //do nothing
} else { } 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) { 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(); final Conversation conversation = query.getConversation();
if (conversation != null) { if (conversation != null) {
@ -377,7 +391,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
void kill(Conversation conversation) { void kill(Conversation conversation) {
final ArrayList<Query> toBeKilled = new ArrayList<>(); final ArrayList<Query> toBeKilled = new ArrayList<>();
synchronized (this.queries) { synchronized (this.queries) {
for (Query q : queries) { for (final Query q : queries) {
if (q.conversation == conversation) { if (q.conversation == conversation) {
toBeKilled.add(q); toBeKilled.add(q);
} }

View File

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

View File

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

View File

@ -33,6 +33,8 @@ import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
import com.google.common.base.CharMatcher;
import org.openintents.openpgp.util.OpenPgpUtils; import org.openintents.openpgp.util.OpenPgpUtils;
import java.net.URL; 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.UIHelper;
import eu.siacs.conversations.utils.XmppUri; import eu.siacs.conversations.utils.XmppUri;
import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated; import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
import eu.siacs.conversations.xmpp.OnUpdateBlocklist; import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.XmppConnection;
import eu.siacs.conversations.xmpp.XmppConnection.Features; import eu.siacs.conversations.xmpp.XmppConnection.Features;
import eu.siacs.conversations.xmpp.forms.Data; import eu.siacs.conversations.xmpp.forms.Data;
import eu.siacs.conversations.xmpp.pep.Avatar; import eu.siacs.conversations.xmpp.pep.Avatar;
import eu.siacs.conversations.xmpp.Jid;
public class EditAccountActivity extends OmemoActivity implements OnAccountUpdate, OnUpdateBlocklist, public class EditAccountActivity extends OmemoActivity implements OnAccountUpdate, OnUpdateBlocklist,
OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched { OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched {
@ -215,12 +217,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
removeErrorsOnAllBut(binding.accountJidLayout); removeErrorsOnAllBut(binding.accountJidLayout);
return; return;
} }
String hostname = null; final String hostname;
int numericPort = 5222; int numericPort = 5222;
if (mShowOptions) { if (mShowOptions) {
hostname = binding.hostname.getText().toString().replaceAll("\\s", ""); hostname = CharMatcher.whitespace().removeFrom(binding.hostname.getText());
final String port = binding.port.getText().toString().replaceAll("\\s", ""); final String port = CharMatcher.whitespace().removeFrom(binding.port.getText());
if (hostname.contains(" ")) { if (Resolver.invalidHostname(hostname)) {
binding.hostnameLayout.setError(getString(R.string.not_valid_hostname)); binding.hostnameLayout.setError(getString(R.string.not_valid_hostname));
binding.hostname.requestFocus(); binding.hostname.requestFocus();
removeErrorsOnAllBut(binding.hostnameLayout); removeErrorsOnAllBut(binding.hostnameLayout);
@ -243,6 +245,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
return; return;
} }
} }
} else {
hostname = null;
} }
if (jid.getLocal() == 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()); binding.with.setText(account.getRoster().getContact(with).getDisplayName());
} else if (Intent.ACTION_VIEW.equals(action)) { } else if (Intent.ACTION_VIEW.equals(action)) {
final String extraLastState = intent.getStringExtra(EXTRA_LAST_REPORTED_STATE); 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"); Log.d(Config.LOGTAG, "restored last state from intent extra");
RtpEndUserState state = RtpEndUserState.valueOf(extraLastState);
updateButtonConfiguration(state); updateButtonConfiguration(state);
updateStateDisplay(state); updateStateDisplay(state);
updateProfilePicture(state); updateProfilePicture(state);
invalidateOptionsMenu(); invalidateOptionsMenu();
} }
binding.with.setText(account.getRoster().getContact(with).getDisplayName()); 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.DimenRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
@ -21,6 +22,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R; import eu.siacs.conversations.R;
import eu.siacs.conversations.databinding.MediaBinding; import eu.siacs.conversations.databinding.MediaBinding;
import eu.siacs.conversations.services.ExportBackupService; 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)); this.mediaSize = Math.round(activity.getResources().getDimension(mediaSize));
} }
@SuppressWarnings("rawtypes")
public static void setMediaSize(RecyclerView recyclerView, int mediaSize) { public static void setMediaSize(RecyclerView recyclerView, int mediaSize) {
RecyclerView.Adapter adapter = recyclerView.getAdapter(); final RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter instanceof MediaAdapter) { if (adapter instanceof MediaAdapter) {
((MediaAdapter) adapter).setMediaSize(mediaSize); ((MediaAdapter) adapter).setMediaSize(mediaSize);
} }
} }
private static @AttrRes int getImageAttr(Attachment attachment) { private static @AttrRes
int getImageAttr(Attachment attachment) {
final @AttrRes int attr; final @AttrRes int attr;
if (attachment.getType() == Attachment.Type.LOCATION) { if (attachment.getType() == Attachment.Type.LOCATION) {
attr = R.attr.media_preview_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; attr = R.attr.media_preview_recording;
} else { } else {
final String mime = attachment.getMime(); final String mime = attachment.getMime();
Log.d(Config.LOGTAG, "mime=" + mime);
if (mime == null) { if (mime == null) {
attr = R.attr.media_preview_unknown; attr = R.attr.media_preview_unknown;
} else if (mime.startsWith("audio/")) { } else if (mime.startsWith("audio/")) {
@ -84,6 +89,8 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
attr = R.attr.media_preview_backup; attr = R.attr.media_preview_backup;
} else if (DOCUMENT_MIMES.contains(mime)) { } else if (DOCUMENT_MIMES.contains(mime)) {
attr = R.attr.media_preview_document; attr = R.attr.media_preview_document;
} else if (mime.equals("application/gpx+xml")) {
attr = R.attr.media_preview_tour;
} else { } else {
attr = R.attr.media_preview_unknown; 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) { private void loadPreview(Attachment attachment, ImageView imageView) {
if (cancelPotentialWork(attachment, 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) { if (bm != null) {
cancelPotentialWork(attachment, imageView); cancelPotentialWork(attachment, imageView);
imageView.setImageBitmap(bm); imageView.setImageBitmap(bm);

View File

@ -36,6 +36,8 @@ import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.google.common.base.MoreObjects;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -87,6 +89,16 @@ public class Attachment implements Parcelable {
return type; 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 { public enum Type {
FILE, IMAGE, LOCATION, RECORDING FILE, IMAGE, LOCATION, RECORDING
} }

View File

@ -6,8 +6,11 @@ import android.util.Log;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import eu.siacs.conversations.Config; import eu.siacs.conversations.Config;
@ -19,6 +22,9 @@ import eu.siacs.conversations.Config;
*/ */
public abstract class ConversationsFileObserver { 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 String path;
private final List<SingleFileObserver> mObservers = new ArrayList<>(); private final List<SingleFileObserver> mObservers = new ArrayList<>();
@ -34,50 +40,47 @@ public abstract class ConversationsFileObserver {
} }
private synchronized void startWatchingInternal() { private synchronized void startWatchingInternal() {
Stack<String> stack = new Stack<>(); final Stack<String> stack = new Stack<>();
stack.push(path); stack.push(path);
while (!stack.empty()) { while (!stack.empty()) {
if (shouldStop.get()) { if (shouldStop.get()) {
Log.d(Config.LOGTAG,"file observer received command to stop"); Log.d(Config.LOGTAG, "file observer received command to stop");
return; return;
} }
String parent = stack.pop(); final String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, FileObserver.DELETE| FileObserver.MOVED_FROM));
final File path = new File(parent); final File path = new File(parent);
mObservers.add(new SingleFileObserver(path, MASK));
final File[] files = path.listFiles(); final File[] files = path.listFiles();
if (files == null) { for (final File file : (files == null ? new File[0] : files)) {
continue;
}
for(File file : files) {
if (shouldStop.get()) { if (shouldStop.get()) {
Log.d(Config.LOGTAG,"file observer received command to stop"); Log.d(Config.LOGTAG, "file observer received command to stop");
return; return;
} }
if (file.isDirectory() && file.getName().charAt(0) != '.') { if (file.isDirectory() && file.getName().charAt(0) != '.') {
final String currentPath = file.getAbsolutePath(); 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); stack.push(currentPath);
} }
} }
} }
} }
for(FileObserver observer : mObservers) { for (FileObserver observer : mObservers) {
observer.startWatching(); observer.startWatching();
} }
} }
private static int depth(File file) { private static int depth(File file) {
int depth = 0; int depth = 0;
while((file = file.getParentFile()) != null) { while ((file = file.getParentFile()) != null) {
depth++; depth++;
} }
return depth; return depth;
} }
private boolean observing(String path) { private boolean observing(final File path) {
for(SingleFileObserver observer : mObservers) { for (final SingleFileObserver observer : mObservers) {
if(path.equals(observer.path)) { if (path.equals(observer.path)) {
return true; return true;
} }
} }
@ -90,13 +93,13 @@ public abstract class ConversationsFileObserver {
} }
private synchronized void stopWatchingInternal() { private synchronized void stopWatchingInternal() {
for(FileObserver observer : mObservers) { for (FileObserver observer : mObservers) {
observer.stopWatching(); observer.stopWatching();
} }
mObservers.clear(); mObservers.clear();
} }
abstract public void onEvent(int event, String path); abstract public void onEvent(final int event, File path);
public void restartWatching() { public void restartWatching() {
stopWatching(); stopWatching();
@ -104,21 +107,33 @@ public abstract class ConversationsFileObserver {
} }
private class SingleFileObserver extends FileObserver { private class SingleFileObserver extends FileObserver {
private final String path; private final File path;
SingleFileObserver(String path, int mask) { SingleFileObserver(final File path, final int mask) {
super(path, mask); super(path.getAbsolutePath(), mask);
this.path = path; this.path = path;
} }
@Override @Override
public void onEvent(int event, String filename) { public void onEvent(final int event, final String filename) {
if (filename == null) { 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; 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. * limitations under the License.
*/ */
package eu.siacs.conversations.utils; package eu.siacs.conversations.utils;
import android.content.Context; import android.content.Context;
import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log; import android.util.Log;
import java.io.File; import java.io.File;
@ -38,6 +41,7 @@ import eu.siacs.conversations.services.ExportBackupService;
public final class MimeUtils { public final class MimeUtils {
private static final Map<String, String> mimeTypeToExtensionMap = new HashMap<>(); private static final Map<String, String> mimeTypeToExtensionMap = new HashMap<>();
private static final Map<String, String> extensionToMimeTypeMap = new HashMap<>(); private static final Map<String, String> extensionToMimeTypeMap = new HashMap<>();
static { static {
// The following table is based on /etc/mime.types data minus // The following table is based on /etc/mime.types data minus
// chemical/* MIME types and MIME types that don't map to any // chemical/* MIME types and MIME types that don't map to any
@ -52,7 +56,8 @@ public final class MimeUtils {
// by guessExtensionFromMimeType. // by guessExtensionFromMimeType.
add("application/andrew-inset", "ez"); add("application/andrew-inset", "ez");
add("application/dsptype", "tsp"); 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/hta", "hta");
add("application/mac-binhex40", "hqx"); add("application/mac-binhex40", "hqx");
add("application/mathematica", "nb"); add("application/mathematica", "nb");
@ -68,9 +73,9 @@ public final class MimeUtils {
add("application/rdf+xml", "rdf"); add("application/rdf+xml", "rdf");
add("application/rss+xml", "rss"); add("application/rss+xml", "rss");
add("application/zip", "zip"); add("application/zip", "zip");
add("application/vnd.amazon.mobi8-ebook","azw3"); add("application/vnd.amazon.mobi8-ebook", "azw3");
add("application/vnd.amazon.mobi8-ebook","azw"); add("application/vnd.amazon.mobi8-ebook", "azw");
add("application/vnd.amazon.mobi8-ebook","kfx"); add("application/vnd.amazon.mobi8-ebook", "kfx");
add("application/vnd.android.package-archive", "apk"); add("application/vnd.android.package-archive", "apk");
add("application/vnd.cinderella", "cdy"); add("application/vnd.cinderella", "cdy");
add(ExportBackupService.MIME_TYPE, "ceb"); add(ExportBackupService.MIME_TYPE, "ceb");
@ -183,7 +188,7 @@ public final class MimeUtils {
add("application/x-maker", "book"); add("application/x-maker", "book");
add("application/x-maker", "fbdoc"); add("application/x-maker", "fbdoc");
add("application/x-mif", "mif"); 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-wmd", "wmd");
add("application/x-ms-wmz", "wmz"); add("application/x-ms-wmz", "wmz");
add("application/x-msi", "msi"); add("application/x-msi", "msi");
@ -242,7 +247,7 @@ public final class MimeUtils {
add("audio/mpeg", "mp2"); add("audio/mpeg", "mp2");
add("audio/mpeg", "m4a"); add("audio/mpeg", "m4a");
add("audio/mpegurl", "m3u"); add("audio/mpegurl", "m3u");
add("audio/ogg","oga"); add("audio/ogg", "oga");
add("audio/prs.sid", "sid"); add("audio/prs.sid", "sid");
add("audio/x-aiff", "aif"); add("audio/x-aiff", "aif");
add("audio/x-aiff", "aiff"); add("audio/x-aiff", "aiff");
@ -268,7 +273,7 @@ public final class MimeUtils {
add("image/ico", "cur"); add("image/ico", "cur");
add("image/ico", "ico"); add("image/ico", "ico");
add("image/ief", "ief"); add("image/ief", "ief");
add("image/heic","heic"); add("image/heic", "heic");
// add ".jpg" first so it will be the default for guessExtensionFromMimeType // add ".jpg" first so it will be the default for guessExtensionFromMimeType
add("image/jpeg", "jpg"); add("image/jpeg", "jpg");
add("image/jpeg", "jpeg"); add("image/jpeg", "jpeg");
@ -367,7 +372,7 @@ public final class MimeUtils {
add("video/fli", "fli"); add("video/fli", "fli");
add("video/m4v", "m4v"); add("video/m4v", "m4v");
add("video/mp2ts", "ts"); add("video/mp2ts", "ts");
add("video/ogg","ogv"); add("video/ogg", "ogv");
add("video/mpeg", "mpeg"); add("video/mpeg", "mpeg");
add("video/mpeg", "mpg"); add("video/mpeg", "mpg");
add("video/mpeg", "mpe"); add("video/mpeg", "mpe");
@ -393,6 +398,7 @@ public final class MimeUtils {
add("x-epoc/x-sisx-app", "sisx"); add("x-epoc/x-sisx-app", "sisx");
applyOverrides(); applyOverrides();
} }
private static void add(String mimeType, String extension) { private static void add(String mimeType, String extension) {
// If we have an existing x -> y mapping, we do not want to // If we have an existing x -> y mapping, we do not want to
// override it with another mapping x -> y2. // override it with another mapping x -> y2.
@ -406,6 +412,7 @@ public final class MimeUtils {
extensionToMimeTypeMap.put(extension, mimeType); extensionToMimeTypeMap.put(extension, mimeType);
} }
} }
private static InputStream getContentTypesPropertiesStream() { private static InputStream getContentTypesPropertiesStream() {
// User override? // User override?
String userTable = System.getProperty("content.types.user.table"); String userTable = System.getProperty("content.types.user.table");
@ -428,6 +435,7 @@ public final class MimeUtils {
} }
return null; return null;
} }
/** /**
* This isn't what the RI does. The RI doesn't have hard-coded defaults, so supplying your * 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 * 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) { } catch (IOException ignored) {
} }
} }
private MimeUtils() { private MimeUtils() {
} }
/** /**
* Returns true if the given MIME type has an entry in the map. * Returns true if the given MIME type has an entry in the map.
*
* @param mimeType A MIME type (i.e. text/plain) * @param mimeType A MIME type (i.e. text/plain)
* @return True iff there is a mimeType entry in the map. * @return True iff there is a mimeType entry in the map.
*/ */
@ -469,8 +480,10 @@ public final class MimeUtils {
} }
return mimeTypeToExtensionMap.containsKey(mimeType); return mimeTypeToExtensionMap.containsKey(mimeType);
} }
/** /**
* Returns the MIME type for the given extension. * Returns the MIME type for the given extension.
*
* @param extension A file extension without the leading '.' * @param extension A file extension without the leading '.'
* @return The MIME type for the given extension or null iff there is none. * @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()); return extensionToMimeTypeMap.get(extension.toLowerCase());
} }
/** /**
* Returns true if the given extension has a registered MIME type. * Returns true if the given extension has a registered MIME type.
*
* @param extension A file extension without the leading '.' * @param extension A file extension without the leading '.'
* @return True iff there is an extension entry in the map. * @return True iff there is an extension entry in the map.
*/ */
@ -491,10 +506,12 @@ public final class MimeUtils {
} }
return extensionToMimeTypeMap.containsKey(extension); return extensionToMimeTypeMap.containsKey(extension);
} }
/** /**
* Returns the registered extension for the given MIME type. Note that some * Returns the registered extension for the given MIME type. Note that some
* MIME types map to multiple extensions. This call will return the most * MIME types map to multiple extensions. This call will return the most
* common extension for the given MIME type. * common extension for the given MIME type.
*
* @param mimeType A MIME type (i.e. text/plain) * @param mimeType A MIME type (i.e. text/plain)
* @return The extension for the given MIME type or null iff there is none. * @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) { 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")) { if (mime == null || mime.equals("application/octet-stream")) {
final String guess = guessMimeTypeFromUri(context, uri); final String guess = guessMimeTypeFromUri(context, uri);
if (guess != null) { if (guess != null) {
@ -515,7 +532,7 @@ public final class MimeUtils {
return mime; return mime;
} }
} }
return guessMimeTypeFromUri(context ,uri); return guessMimeTypeFromUri(context, uri);
} }
public static String guessMimeTypeFromUri(Context context, Uri uri) { public static String guessMimeTypeFromUri(Context context, Uri uri) {
@ -523,19 +540,21 @@ public final class MimeUtils {
String mimeType; String mimeType;
try { try {
mimeType = context.getContentResolver().getType(uri); mimeType = context.getContentResolver().getType(uri);
} catch (Throwable throwable) { } catch (final Throwable throwable) {
mimeType = null; mimeType = null;
} }
// try the extension // try the extension
if ((mimeType == null || mimeType.equals("application/octet-stream")) && uri.getPath() != null) { if (mimeType == null || mimeType.equals("application/octet-stream")) {
String path = uri.getPath(); final String path = uri.getPath();
int start = path.lastIndexOf('.') + 1; if (path != null) {
if (start < path.length()) { mimeType = guessFromPath(path);
final String guess = MimeUtils.guessMimeTypeFromExtension(path.substring(start));
if (guess != null) {
mimeType = guess;
} }
} }
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) // sometimes this works (as with the commit content api)
if (mimeType == null) { if (mimeType == null) {
@ -544,6 +563,23 @@ public final class MimeUtils {
return mimeType; 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) { public static String extractRelevantExtension(URL url) {
String path = url.getPath(); String path = url.getPath();
return extractRelevantExtension(path, true); return extractRelevantExtension(path, true);
@ -565,7 +601,7 @@ public final class MimeUtils {
String extension = filename.substring(dotPosition + 1); String extension = filename.substring(dotPosition + 1);
// we want the real file extension, not the crypto one // we want the real file extension, not the crypto one
if (ignoreCryptoExtension && Transferable.VALID_CRYPTO_EXTENSIONS.contains(extension)) { if (ignoreCryptoExtension && Transferable.VALID_CRYPTO_EXTENSIONS.contains(extension)) {
return extractRelevantExtension(filename.substring(0,dotPosition)); return extractRelevantExtension(filename.substring(0, dotPosition));
} else { } else {
return extension; return extension;
} }

View File

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

View File

@ -298,7 +298,7 @@ public class UIHelper {
RtpSessionStatus rtpSessionStatus = RtpSessionStatus.of(message.getBody()); RtpSessionStatus rtpSessionStatus = RtpSessionStatus.of(message.getBody());
final boolean received = message.getStatus() == Message.STATUS_RECEIVED; final boolean received = message.getStatus() == Message.STATUS_RECEIVED;
if (!rtpSessionStatus.successful && received) { if (!rtpSessionStatus.successful && received) {
return new Pair<>(context.getString(R.string.missed_call),true); return new Pair<>(context.getString(R.string.missed_call), true);
} else { } else {
return new Pair<>(context.getString(received ? R.string.incoming_call : R.string.outgoing_call), true); return new Pair<>(context.getString(received ? R.string.incoming_call : R.string.outgoing_call), true);
} }
@ -361,7 +361,7 @@ public class UIHelper {
return false; return false;
} }
char first = line.charAt(0); char first = line.charAt(0);
return first == '>' && isPositionFollowedByQuoteableCharacter(line,0) || first == '\u00bb'; return first == '>' && isPositionFollowedByQuoteableCharacter(line, 0) || first == '\u00bb';
} }
public static CharSequence shorten(CharSequence input) { public static CharSequence shorten(CharSequence input) {
@ -497,6 +497,8 @@ public class UIHelper {
return context.getString(R.string.event); return context.getString(R.string.event);
} else if (mime.equals("application/epub+zip") || mime.equals("application/vnd.amazon.mobi8-ebook")) { } else if (mime.equals("application/epub+zip") || mime.equals("application/vnd.amazon.mobi8-ebook")) {
return context.getString(R.string.ebook); return context.getString(R.string.ebook);
} else if (mime.equals("application/gpx+xml")) {
return context.getString(R.string.gpx_track);
} else { } else {
return mime; return mime;
} }

View File

@ -683,7 +683,9 @@ public class XmppConnection implements Runnable {
if (Config.BACKGROUND_STANZA_LOGGING && mXmppConnectionService.checkListeners()) { if (Config.BACKGROUND_STANZA_LOGGING && mXmppConnectionService.checkListeners()) {
Log.d(Config.LOGTAG, "[background stanza] " + element); 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); return JinglePacket.upgrade((IqPacket) element);
} else { } else {
return element; 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) { void getPrimaryCandidate(final Account account, final boolean initiator, final OnPrimaryCandidateFound listener) {
if (Config.DISABLE_PROXY_LOOKUP) { if (Config.DISABLE_PROXY_LOOKUP) {
listener.onPrimaryCandidateFound(false, null); 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) { public void deliverIbbPacket(Account account, IqPacket packet) {
final String sid; final String sid;
final Element payload; 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(); final Set<Map.Entry<String, RtpContentMap.DescriptionTransport>> candidates = contentMap.contents.entrySet();
if (this.state == State.SESSION_ACCEPTED) { if (this.state == State.SESSION_ACCEPTED) {
try {
processCandidates(candidates); 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 { } else {
pendingIceCandidates.push(candidates); pendingIceCandidates.push(candidates);
} }
@ -807,7 +811,14 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
return RtpEndUserState.CONNECTING; return RtpEndUserState.CONNECTING;
} }
case SESSION_ACCEPTED: 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) { if (state == PeerConnection.PeerConnectionState.CONNECTED) {
return RtpEndUserState.CONNECTED; return RtpEndUserState.CONNECTED;
} else if (state == PeerConnection.PeerConnectionState.NEW || state == PeerConnection.PeerConnectionState.CONNECTING) { } else if (state == PeerConnection.PeerConnectionState.NEW || state == PeerConnection.PeerConnectionState.CONNECTING) {
@ -1256,6 +1267,11 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
this.proposedMedia = media; this.proposedMedia = media;
} }
public void fireStateUpdate() {
final RtpEndUserState endUserState = getEndUserState();
xmppConnectionService.notifyJingleRtpConnectionUpdate(id.account, id.with, id.sessionId, endUserState);
}
private interface OnIceServersDiscovered { private interface OnIceServersDiscovered {
void onIceServersDiscovered(List<PeerConnection.IceServer> iceServers); void onIceServersDiscovered(List<PeerConnection.IceServer> iceServers);
} }

View File

@ -552,7 +552,7 @@ public class WebRTCWrapper {
private PeerConnection requirePeerConnection() { private PeerConnection requirePeerConnection() {
final PeerConnection peerConnection = this.peerConnection; final PeerConnection peerConnection = this.peerConnection;
if (peerConnection == null) { if (peerConnection == null) {
throw new IllegalStateException("initialize PeerConnection first"); throw new PeerConnectionNotInitialized();
} }
return peerConnection; 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 static class CapturerChoice {
private final CameraVideoCapturer cameraVideoCapturer; private final CameraVideoCapturer cameraVideoCapturer;
private final CameraEnumerationAndroid.CaptureFormat captureFormat; private final CameraEnumerationAndroid.CaptureFormat captureFormat;

View File

@ -29,6 +29,7 @@ public class JinglePacket extends IqPacket {
public static JinglePacket upgrade(final IqPacket iqPacket) { public static JinglePacket upgrade(final IqPacket iqPacket) {
Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE)); Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE));
Preconditions.checkArgument(iqPacket.getType() == TYPE.SET);
final JinglePacket jinglePacket = new JinglePacket(); final JinglePacket jinglePacket = new JinglePacket();
jinglePacket.setAttributes(iqPacket.getAttributes()); jinglePacket.setAttributes(iqPacket.getAttributes());
jinglePacket.setChildren(iqPacket.getChildren()); jinglePacket.setChildren(iqPacket.getChildren());
@ -70,11 +71,11 @@ public class JinglePacket extends IqPacket {
public ReasonWrapper getReason() { public ReasonWrapper getReason() {
final Element reasonElement = getJingleChild("reason"); final Element reasonElement = getJingleChild("reason");
if (reasonElement == null) { if (reasonElement == null) {
return new ReasonWrapper(Reason.UNKNOWN,null); return new ReasonWrapper(Reason.UNKNOWN, null);
} }
String text = null; String text = null;
Reason reason = Reason.UNKNOWN; Reason reason = Reason.UNKNOWN;
for(Element child : reasonElement.getChildren()) { for (Element child : reasonElement.getChildren()) {
if ("text".equals(child.getName())) { if ("text".equals(child.getName())) {
text = child.getContent(); text = child.getContent();
} else { } 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="server_info_broken">مكسر</string>
<string name="pref_presence_settings">حالة الحضور</string> <string name="pref_presence_settings">حالة الحضور</string>
<string name="pref_away_when_screen_off">غائب عند إطفاء الشاشة</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">إعدادات الربط الموسعة</string>
<string name="pref_show_connection_options_summary">عرض اسم المضيف وإعدادات المنفذ عند تنصيب حساب</string> <string name="pref_show_connection_options_summary">عرض اسم المضيف وإعدادات المنفذ عند تنصيب حساب</string>
<string name="hostname_example">xmpp.example.com</string> <string name="hostname_example">xmpp.example.com</string>

View File

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

View File

@ -366,11 +366,7 @@
<string name="server_info_broken">Trencat</string> <string name="server_info_broken">Trencat</string>
<string name="pref_presence_settings">Disponibilitat</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">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_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">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="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> <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="account_status_bind_failure">Bind chyba</string>
<string name="server_info_broken">Rozbité</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">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_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">Rozšířená nastavení připojení</string>
<string name="pref_show_connection_options_summary">Zobrazovat nastavení hostname a port při vytváření účtu</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="account_status_host_unknown">Der Server ist nicht für diese Domain verantwortlich</string>
<string name="server_info_broken">Fehlerhaft</string> <string name="server_info_broken">Fehlerhaft</string>
<string name="pref_presence_settings">Status</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">Abwesend bei ausgeschaltetem Bildschirm</string>
<string name="pref_away_when_screen_off_summary">Setzt deinen Status auf \"abwesend\", solange dein Bildschirm abgeschaltet ist</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">\"Bitte nicht stören\" bei Stummschaltung</string> <string name="pref_dnd_on_silent_mode">Beschäftigt im lautlosen Modus</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_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_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">Erweiterte Verbindungsoptionen</string>
<string name="pref_show_connection_options_summary">Hostname- und Port-Optionen bei Kontoeinrichtung anzeigen</string> <string name="pref_show_connection_options_summary">Hostname- und Port-Optionen bei Kontoeinrichtung anzeigen</string>
<string name="hostname_example">xmpp.domain.de</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="could_not_switch_camera">Kamera konnte nicht gewechselt werden</string>
<string name="add_to_favorites">Zu Favoriten hinzufügen</string> <string name="add_to_favorites">Zu Favoriten hinzufügen</string>
<string name="remove_from_favorites">Von Favoriten entfernen</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"> <plurals name="view_users">
<item quantity="one">%1$d Teilnehmer anzeigen</item> <item quantity="one">%1$d Teilnehmer anzeigen</item>
<item quantity="other">%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="server_info_broken">Χαλασμένος</string>
<string name="pref_presence_settings">Διαθεσιμότητα</string> <string name="pref_presence_settings">Διαθεσιμότητα</string>
<string name="pref_away_when_screen_off">Εκτός χρήσης όταν η οθόνη είναι σβηστή</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_silent">Χρήση της κατάστασης δόνησης ως σιωπηρή κατάσταση</string>
<string name="pref_treat_vibrate_as_dnd_summary">Σημειώνει την παρουσία σας ως \"Μην ενοχλείτε\" όταν η συσκευή είναι σε κατάσταση δόνησης</string>
<string name="pref_show_connection_options">Περισσότερες ρυθμίσεις σύνδεσης</string> <string name="pref_show_connection_options">Περισσότερες ρυθμίσεις σύνδεσης</string>
<string name="pref_show_connection_options_summary">Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων πόρτας όταν δημιουργείται ένας νέος λογαριασμός</string> <string name="pref_show_connection_options_summary">Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων πόρτας όταν δημιουργείται ένας νέος λογαριασμός</string>
<string name="hostname_example">xmpp.example.com</string> <string name="hostname_example">xmpp.example.com</string>

View File

@ -461,11 +461,11 @@
<string name="server_info_broken">Error</string> <string name="server_info_broken">Error</string>
<string name="pref_presence_settings">Disponibilidad</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">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_away_when_screen_off_summary">Mostrar como 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">Ocupado 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_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_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">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="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> <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="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="add_to_favorites">Añadir a los favoritos</string>
<string name="remove_from_favorites">Eliminar de 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"> <plurals name="view_users">
<item quantity="one">Ver %1$d Participante</item> <item quantity="one">Ver %1$d Participante</item>
<item quantity="other">Ver %1$d Participantes</item> <item quantity="other">Ver %1$d Participantes</item>

View File

@ -399,11 +399,7 @@
<string name="server_info_broken">Hondatuta</string> <string name="server_info_broken">Hondatuta</string>
<string name="pref_presence_settings">Eskuragarritasuna</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">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_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">Konexioaren ezarpen luzatuak</string>
<string name="pref_show_connection_options_summary">Ostalariaren izena eta ataka ezarpenak erakutsi kontu bat ezartzerakoan</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> <string name="hostname_example">xmpp.adibidea.com</string>

View File

@ -460,11 +460,7 @@
<string name="server_info_broken">Détraqué</string> <string name="server_info_broken">Détraqué</string>
<string name="pref_presence_settings">Disponibilité</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">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_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">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="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> <string name="hostname_example">xmpp.example.com</string>

View File

@ -461,11 +461,11 @@
<string name="server_info_broken">Roto</string> <string name="server_info_broken">Roto</string>
<string name="pref_presence_settings">Disponibilidade</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">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_away_when_screen_off_summary">Mostrar como Fóra 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">En modolo silencioso, Ocupado</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_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_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">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="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> <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="could_not_switch_camera">Non se puido activar a cámara</string>
<string name="add_to_favorites">Engadir a favoritas</string> <string name="add_to_favorites">Engadir a favoritas</string>
<string name="remove_from_favorites">Eliminar das 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"> <plurals name="view_users">
<item quantity="one">Ver %1$d Participante</item> <item quantity="one">Ver %1$d Participante</item>
<item quantity="other">Ver %1$d Participantes</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="server_info_broken">Törött</string>
<string name="pref_presence_settings">Elérhetőség</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">„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_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">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="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> <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="mark_as_read">Segna come già letto</string>
<string name="pref_input_options">Input</string> <string name="pref_input_options">Input</string>
<string name="pref_enter_is_send">Invio spedisce</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">Mostra il tasto invio</string>
<string name="pref_display_enter_key_summary">Cambia il tasto delle faccine nel tasto di invio</string> <string name="pref_display_enter_key_summary">Cambia il tasto delle faccine nel tasto di invio</string>
<string name="audio">audio</string> <string name="audio">audio</string>
@ -460,11 +461,7 @@
<string name="server_info_broken">Rotto</string> <string name="server_info_broken">Rotto</string>
<string name="pref_presence_settings">Disponibilità</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">\"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_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">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="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> <string name="hostname_example">xmpp.esempio.it</string>
@ -915,6 +912,7 @@
<string name="audio_call">Chiamata vocale</string> <string name="audio_call">Chiamata vocale</string>
<string name="video_call">Chiamata video</string> <string name="video_call">Chiamata video</string>
<string name="help">Aiuto</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="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="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> <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="download_failed_could_not_connect">ההורדה נכשלה: נכשל ביצוע חיבור לשרת</string>
<string name="server_info_broken">לא עובד</string> <string name="server_info_broken">לא עובד</string>
<string name="pref_away_when_screen_off">העבר למצב \"לא נמצא\" כאשר המסך כבוי</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="action_renew_certificate">חידוש תעודה</string>
<string name="error_fetching_omemo_key">שגיאה בתפיסת OMEMO!</string> <string name="error_fetching_omemo_key">שגיאה בתפיסת OMEMO!</string>
<string name="pref_use_tor">התחבר דרך Tor</string> <string name="pref_use_tor">התחבר דרך Tor</string>

View File

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

View File

@ -306,7 +306,6 @@
<string name="account_status_bind_failure">바인드 실패</string> <string name="account_status_bind_failure">바인드 실패</string>
<string name="server_info_broken">손상됨</string> <string name="server_info_broken">손상됨</string>
<string name="pref_away_when_screen_off">화면이 꺼져있을 경우 자리 비움으로 표시</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_treat_vibrate_as_silent">진동을 자동으로 처리</string>
<string name="pref_show_connection_options">확장 연결 설정</string> <string name="pref_show_connection_options">확장 연결 설정</string>
<string name="pref_show_connection_options_summary">계정을 설정할 때 호스트 이름과 포트 설정을 표시합니다</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="account_status_bind_failure">Klarte ikke å binde</string>
<string name="server_info_broken">Knekt</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">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_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">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="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> <string name="hostname_example">xmpp.eksempel.no</string>

View File

@ -411,11 +411,7 @@
<string name="server_info_broken">Gebroken</string> <string name="server_info_broken">Gebroken</string>
<string name="pref_presence_settings">Aanwezigheid</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">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_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">Uitgebreide verbindingsinstellingen</string>
<string name="pref_show_connection_options_summary">Toon hostnaam- en poortinstellingen bij instellen van een account</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> <string name="hostname_example">xmpp.voorbeeld.be</string>

View File

@ -462,11 +462,7 @@
<string name="server_info_broken">Zepsute</string> <string name="server_info_broken">Zepsute</string>
<string name="pref_presence_settings">Dostępność</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">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_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">Rozszerzone ustawienia połączenia</string>
<string name="pref_show_connection_options_summary">Pokaż nazwę hosta i ustawienia portu przy dodawaniu konta</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> <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="mark_as_read">Marcar como lida</string>
<string name="pref_input_options">Entrada</string> <string name="pref_input_options">Entrada</string>
<string name="pref_enter_is_send">Enter envia</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">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="pref_display_enter_key_summary">Altera o botão de emoticons para um botão Enter.</string>
<string name="audio">áudio</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="account_status_host_unknown">O servidor não responde por esse domínio</string>
<string name="server_info_broken">Quebrado</string> <string name="server_info_broken">Quebrado</string>
<string name="pref_presence_settings">Disponibilidade</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">\"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_away_when_screen_off_summary">Exibe como Afastado quando a tela for desligada</string>
<string name="pref_dnd_on_silent_mode">\"Não perturbe\" em modo silencioso</string> <string name="pref_dnd_on_silent_mode">\"Ocupado\" no 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_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_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">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="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> <string name="hostname_example">xmpp.example.com</string>
@ -900,6 +901,7 @@
<string name="rtp_state_ringing">Tocando</string> <string name="rtp_state_ringing">Tocando</string>
<string name="rtp_state_declined_or_busy">Ocupado</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_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_retracted">Chamada rejeitada</string>
<string name="rtp_state_application_failure">Falha no aplicativo</string> <string name="rtp_state_application_failure">Falha no aplicativo</string>
<string name="hang_up">Desligar</string> <string name="hang_up">Desligar</string>
@ -913,12 +915,16 @@
<string name="missed_call">Chamada perdida</string> <string name="missed_call">Chamada perdida</string>
<string name="audio_call">Chamada de áudio</string> <string name="audio_call">Chamada de áudio</string>
<string name="video_call">Chamada de vídeo</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="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="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="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="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="add_to_favorites">Adicionar aos favoritos</string>
<string name="remove_from_favorites">Remover dos 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"> <plurals name="view_users">
<item quantity="one">Ver %1$d participante</item> <item quantity="one">Ver %1$d participante</item>
<item quantity="other">Ver %1$d participantes</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="server_info_broken">Existe um problema</string>
<string name="pref_presence_settings">Disponibilidade</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">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_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">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> <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_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">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_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">\"Ocupat\" î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_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_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">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="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> <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="could_not_switch_camera">Nu s-a putut face comutarea camerei foto</string>
<string name="add_to_favorites">Adaugă la favorite</string> <string name="add_to_favorites">Adaugă la favorite</string>
<string name="remove_from_favorites">Înlătură din 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"> <plurals name="view_users">
<item quantity="one">Arată %1$d participant</item> <item quantity="one">Arată %1$d participant</item>
<item quantity="few">Arată %1$d participanți</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="change_password_on_server">Изменить пароль на сервере</string>
<string name="share_with">Поделиться с</string> <string name="share_with">Поделиться с</string>
<string name="start_conversation">Начать беседу</string> <string name="start_conversation">Начать беседу</string>
<string name="invite_contact">Пригласить собеседника</string> <string name="invite_contact">Пригласить контакт</string>
<string name="invite">Пригласить</string> <string name="invite">Пригласить</string>
<string name="contacts">Контакты</string> <string name="contacts">Контакты</string>
<string name="contact">Контакт</string> <string name="contact">Контакт</string>
@ -298,6 +298,8 @@
<string name="hosted_on">размещено на %s</string> <string name="hosted_on">размещено на %s</string>
<string name="checking_x">Проверка %s на сервере HTTP</string> <string name="checking_x">Проверка %s на сервере HTTP</string>
<string name="not_connected_try_again">Вы неподключены. Попробуйте позже</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="message_options">Опции сообщения</string>
<string name="quote">Цитировать</string> <string name="quote">Цитировать</string>
<string name="paste_as_quote">Вставить как цитату</string> <string name="paste_as_quote">Вставить как цитату</string>
@ -399,6 +401,7 @@
<string name="mark_as_read">Прочитано</string> <string name="mark_as_read">Прочитано</string>
<string name="pref_input_options">Ввод</string> <string name="pref_input_options">Ввод</string>
<string name="pref_enter_is_send">Отправить на \"Enter\"</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">Показывать клавишу ввода</string>
<string name="pref_display_enter_key_summary">Поменять кнопку смайликов на кнопку ввода</string> <string name="pref_display_enter_key_summary">Поменять кнопку смайликов на кнопку ввода</string>
<string name="audio">аудио</string> <string name="audio">аудио</string>
@ -460,11 +463,7 @@
<string name="server_info_broken">Повреждено</string> <string name="server_info_broken">Повреждено</string>
<string name="pref_presence_settings">Доступность</string> <string name="pref_presence_settings">Доступность</string>
<string name="pref_away_when_screen_off">\"Отошёл\" когда экран выключен</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_silent">Не доступен в режиме вибрации</string>
<string name="pref_treat_vibrate_as_dnd_summary">Устанавливает статус \"Не беспокоить\", когда устройство на вибрации</string>
<string name="pref_show_connection_options">Расширенные настройки подключения</string> <string name="pref_show_connection_options">Расширенные настройки подключения</string>
<string name="pref_show_connection_options_summary">Показывать имя сервера и порт в настройках аккаунтов</string> <string name="pref_show_connection_options_summary">Показывать имя сервера и порт в настройках аккаунтов</string>
<string name="hostname_example">xmpp.example.com</string> <string name="hostname_example">xmpp.example.com</string>

View File

@ -349,11 +349,7 @@
<string name="server_info_broken">Оштећен</string> <string name="server_info_broken">Оштећен</string>
<string name="pref_presence_settings">Доступност</string> <string name="pref_presence_settings">Доступност</string>
<string name="pref_away_when_screen_off">Одсутан кад је екран искључен</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_silent">Вибрација је нечујни режим</string>
<string name="pref_treat_vibrate_as_dnd_summary">Означавање вашег ресурса као „не ометај“ кад је уређај у режиму вибрирања</string>
<string name="pref_show_connection_options">Проширене поставке повезивања</string> <string name="pref_show_connection_options">Проширене поставке повезивања</string>
<string name="pref_show_connection_options_summary">Приказ домаћина и порта у поставкама налога</string> <string name="pref_show_connection_options_summary">Приказ домаћина и порта у поставкама налога</string>
<string name="hostname_example">xmpp.primer.com</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="server_info_broken">Sönder</string>
<string name="pref_presence_settings">Tillgänglighet</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">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_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">Utökade anslutningsinställningar</string>
<string name="pref_show_connection_options_summary">Visa val av servernamn och port vid inställning av konto</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="account_status_bind_failure">Bağlantı başarısız</string>
<string name="server_info_broken">Bozuk</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">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_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">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> <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="enable_all_accounts">Увімкнути всі облікові записи</string>
<string name="disable_all_accounts">Вимкнути всі облікові записи</string> <string name="disable_all_accounts">Вимкнути всі облікові записи</string>
<string name="perform_action_with">Здійснити дію з</string> <string name="perform_action_with">Здійснити дію з</string>
<string name="no_affiliation">Непов\'язаний</string> <string name="no_affiliation">Учасник</string>
<string name="no_role">Поза мережею</string> <string name="no_role">Поза мережею</string>
<string name="outcast">Вигнанець</string> <string name="outcast">Вигнанець</string>
<string name="member">Учасник</string> <string name="member">Учасник</string>
@ -380,7 +380,7 @@
<string name="remove_owner_privileges">Відкликати права власника</string> <string name="remove_owner_privileges">Відкликати права власника</string>
<string name="remove_from_room">Вилучити з групи</string> <string name="remove_from_room">Вилучити з групи</string>
<string name="remove_from_channel">Прибрати з каналу</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_conference">Заборонити доступ до групи</string>
<string name="ban_from_channel">Вилучити з каналу</string> <string name="ban_from_channel">Вилучити з каналу</string>
<string name="removing_from_public_conference">Ви намагаєтеся вилучити %s з публічного каналу. Єдиним способом для цього є заблокувати користувача назавжди.</string> <string name="removing_from_public_conference">Ви намагаєтеся вилучити %s з публічного каналу. Єдиним способом для цього є заблокувати користувача назавжди.</string>
@ -401,6 +401,7 @@
<string name="mark_as_read">Позначити як прочитане</string> <string name="mark_as_read">Позначити як прочитане</string>
<string name="pref_input_options">Введення</string> <string name="pref_input_options">Введення</string>
<string name="pref_enter_is_send">Enter для надсилання</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">Показувати кнопку Enter</string>
<string name="pref_display_enter_key_summary">Змінити клавішу емоційок на кнопку Enter</string> <string name="pref_display_enter_key_summary">Змінити клавішу емоційок на кнопку Enter</string>
<string name="audio">аудіо</string> <string name="audio">аудіо</string>
@ -462,11 +463,7 @@
<string name="server_info_broken">Поламано</string> <string name="server_info_broken">Поламано</string>
<string name="pref_presence_settings">Доступність</string> <string name="pref_presence_settings">Доступність</string>
<string name="pref_away_when_screen_off">Відійшов, якщо екран вимкнено</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_silent">Вважати вібро за безшумний режим</string>
<string name="pref_treat_vibrate_as_dnd_summary">Додавати \"Не турбувати\" до імені вашого пристрою, коли пристрій в режимі вібрації</string>
<string name="pref_show_connection_options">Розширені налаштування з\'єднання</string> <string name="pref_show_connection_options">Розширені налаштування з\'єднання</string>
<string name="pref_show_connection_options_summary">Показати налаштування імені вузла та порту при налаштуванні облікового запису</string> <string name="pref_show_connection_options_summary">Показати налаштування імені вузла та порту при налаштуванні облікового запису</string>
<string name="hostname_example">xmpp.example.com</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="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="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">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="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="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> <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="mark_as_read">标记为已读</string>
<string name="pref_input_options">输入</string> <string name="pref_input_options">输入</string>
<string name="pref_enter_is_send">点击回车发送</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">显示回车键</string>
<string name="pref_display_enter_key_summary">将表情键改为回车键</string> <string name="pref_display_enter_key_summary">将表情键改为回车键</string>
<string name="audio">音频</string> <string name="audio">音频</string>
@ -459,11 +460,7 @@
<string name="server_info_broken">损坏</string> <string name="server_info_broken">损坏</string>
<string name="pref_presence_settings">可用性</string> <string name="pref_presence_settings">可用性</string>
<string name="pref_away_when_screen_off">锁屏时显示离开</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_silent">将振动看作静音</string>
<string name="pref_treat_vibrate_as_dnd_summary">使用振动模式时标记为“请勿打扰”状态</string>
<string name="pref_show_connection_options">高级连接设置</string> <string name="pref_show_connection_options">高级连接设置</string>
<string name="pref_show_connection_options_summary">注册账户时显示主机名和端口</string> <string name="pref_show_connection_options_summary">注册账户时显示主机名和端口</string>
<string name="hostname_example">xmpp.example.com</string> <string name="hostname_example">xmpp.example.com</string>
@ -907,6 +904,7 @@
<string name="audio_call">语音通话</string> <string name="audio_call">语音通话</string>
<string name="video_call">视频通话</string> <string name="video_call">视频通话</string>
<string name="help">帮助</string> <string name="help">帮助</string>
<string name="switch_to_conversation">切换到对话</string>
<string name="microphone_unavailable">麦克风不可用</string> <string name="microphone_unavailable">麦克风不可用</string>
<string name="only_one_call_at_a_time">只能同时打一通电话</string> <string name="only_one_call_at_a_time">只能同时打一通电话</string>
<string name="return_to_ongoing_call">返回正在进行的通话</string> <string name="return_to_ongoing_call">返回正在进行的通话</string>

View File

@ -309,7 +309,6 @@
<string name="account_status_bind_failure">綁定失敗</string> <string name="account_status_bind_failure">綁定失敗</string>
<string name="server_info_broken">損壞</string> <string name="server_info_broken">損壞</string>
<string name="pref_away_when_screen_off">關閉螢幕時離開</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_treat_vibrate_as_silent">靜音模式開啟振動</string>
<string name="pref_show_connection_options">高級連接設置</string> <string name="pref_show_connection_options">高級連接設置</string>
<string name="pref_show_connection_options_summary">註冊帳戶時顯示主機名稱和埠</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_recording" format="reference" />
<attr name="media_preview_audio" format="reference" /> <attr name="media_preview_audio" format="reference" />
<attr name="media_preview_location" 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_contact" format="reference" />
<attr name="media_preview_app" format="reference" /> <attr name="media_preview_app" format="reference" />
<attr name="media_preview_calendar" format="reference" /> <attr name="media_preview_calendar" format="reference" />

View File

@ -461,11 +461,11 @@
<string name="server_info_broken">Broken</string> <string name="server_info_broken">Broken</string>
<string name="pref_presence_settings">Availability</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">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_away_when_screen_off_summary">Show 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">Busy 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_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_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">Extended connection settings</string>
<string name="pref_show_connection_options_summary">Show hostname and port settings when setting up an account</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> <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="could_not_switch_camera">Could not switch camera</string>
<string name="add_to_favorites">Add to favorites</string> <string name="add_to_favorites">Add to favorites</string>
<string name="remove_from_favorites">Remove from 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"> <plurals name="view_users">
<item quantity="one">View %1$d Participant</item> <item quantity="one">View %1$d Participant</item>
<item quantity="other">View %1$d Participants</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_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_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_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_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_app" type="reference">@drawable/ic_android_black_48dp</item>
<item name="media_preview_calendar" type="reference">@drawable/ic_event_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_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_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_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_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_app" type="reference">@drawable/ic_android_white_48dp</item>
<item name="media_preview_calendar" type="reference">@drawable/ic_event_white_48dp</item> <item name="media_preview_calendar" type="reference">@drawable/ic_event_white_48dp</item>