Merge tag '2.8.10' into develop
|
@ -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
|
|
@ -1,5 +1,11 @@
|
|||
# Changelog
|
||||
|
||||
### Version 2.8.10
|
||||
|
||||
* Handle GPX files
|
||||
* Improve performance for backup restore
|
||||
* bug fixes
|
||||
|
||||
### Version 2.8.9
|
||||
|
||||
* add 'Return to chat' to audio call screen
|
||||
|
|
|
@ -8,7 +8,7 @@ buildscript {
|
|||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.6.2'
|
||||
classpath 'com.android.tools.build:gradle:4.0.1'
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -96,8 +96,8 @@ android {
|
|||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 25
|
||||
versionCode 395
|
||||
versionName "2.8.9"
|
||||
versionCode 397
|
||||
versionName "2.8.10"
|
||||
archivesBaseName += "-$versionName"
|
||||
applicationId "eu.sum7.conversations"
|
||||
resValue "string", "applicationId", applicationId
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
* Handle GPX files
|
||||
* Improve performance for backup restore
|
||||
* bug fixes
|
|
@ -1,6 +1,6 @@
|
|||
#Thu Mar 19 11:51:26 CET 2020
|
||||
#Sun Jul 26 11:32:42 CEST 2020
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
|
||||
|
|
|
@ -17,6 +17,7 @@ import android.support.v4.app.NotificationManagerCompat;
|
|||
import android.util.Log;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import com.google.common.base.Stopwatch;
|
||||
import com.google.common.io.CountingInputStream;
|
||||
|
||||
import org.bouncycastle.crypto.engines.AESEngine;
|
||||
|
@ -189,6 +190,7 @@ public class ImportBackupService extends Service {
|
|||
|
||||
private boolean importBackup(final Uri uri, final String password) {
|
||||
Log.d(Config.LOGTAG, "importing backup from " + uri);
|
||||
final Stopwatch stopwatch = Stopwatch.createStarted();
|
||||
try {
|
||||
final SQLiteDatabase db = mDatabaseBackend.getWritableDatabase();
|
||||
final InputStream inputStream;
|
||||
|
@ -233,12 +235,13 @@ public class ImportBackupService extends Service {
|
|||
|
||||
final byte[] key = ExportBackupService.getKey(password, backupFileHeader.getSalt());
|
||||
|
||||
AEADBlockCipher cipher = new GCMBlockCipher(new AESEngine());
|
||||
final AEADBlockCipher cipher = new GCMBlockCipher(new AESEngine());
|
||||
cipher.init(false, new AEADParameters(new KeyParameter(key), 128, backupFileHeader.getIv()));
|
||||
final CipherInputStream cipherInputStream = new CipherInputStream(countingInputStream, cipher);
|
||||
|
||||
final GZIPInputStream gzipInputStream = new GZIPInputStream(cipherInputStream);
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(gzipInputStream, Charsets.UTF_8));
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(gzipInputStream, Charsets.UTF_8));
|
||||
db.beginTransaction();
|
||||
String line;
|
||||
StringBuilder multiLineQuery = null;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
|
@ -260,11 +263,13 @@ public class ImportBackupService extends Service {
|
|||
}
|
||||
}
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
final Jid jid = backupFileHeader.getJid();
|
||||
Cursor countCursor = db.rawQuery("select count(messages.uuid) from messages join conversations on conversations.uuid=messages.conversationUuid join accounts on conversations.accountUuid=accounts.uuid where accounts.username=? and accounts.server=?", new String[]{jid.getEscapedLocal(), jid.getDomain().toEscapedString()});
|
||||
final Cursor countCursor = db.rawQuery("select count(messages.uuid) from messages join conversations on conversations.uuid=messages.conversationUuid join accounts on conversations.accountUuid=accounts.uuid where accounts.username=? and accounts.server=?", new String[]{jid.getEscapedLocal(), jid.getDomain().toEscapedString()});
|
||||
countCursor.moveToFirst();
|
||||
int count = countCursor.getInt(0);
|
||||
Log.d(Config.LOGTAG, "restored " + count + " messages");
|
||||
final int count = countCursor.getInt(0);
|
||||
Log.d(Config.LOGTAG, String.format("restored %d messages in %s", count, stopwatch.stop().toString()));
|
||||
countCursor.close();
|
||||
stopBackgroundService();
|
||||
synchronized (mOnBackupProcessedListeners) {
|
||||
|
@ -274,7 +279,7 @@ public class ImportBackupService extends Service {
|
|||
}
|
||||
return true;
|
||||
} catch (final Exception e) {
|
||||
Throwable throwable = e.getCause();
|
||||
final Throwable throwable = e.getCause();
|
||||
final boolean reasonWasCrypto = throwable instanceof BadPaddingException || e instanceof ZipException;
|
||||
synchronized (mOnBackupProcessedListeners) {
|
||||
for (OnBackupProcessed l : mOnBackupProcessedListeners) {
|
||||
|
|
|
@ -10,4 +10,5 @@ In ogni caso per facilitare puoi creare facilmente un account su chat.sum7.eu, u
|
|||
<string name="magic_create_text_on_x">Sei stato invitato su %1$s. Ti guideremo nel procedimento per creare un account.\nQuando scegli %1$s come fornitore sarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo.</string>
|
||||
<string name="magic_create_text_fixed">Sei stato invitato su %1$s. È già stato scelto un nome utente per te. Ti guideremo nel procedimento per creare un account.\nSarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo.</string>
|
||||
<string name="your_server_invitation">Il tuo invito al server</string>
|
||||
</resources>
|
||||
<string name="improperly_formatted_provisioning">Codice di approvvigionamento formattato male</string>
|
||||
</resources>
|
||||
|
|
|
@ -8,4 +8,5 @@
|
|||
<string name="magic_create_text_on_x">Você foi convidado para %1$s. Nós iremos guiá-lo ao longo do processo de criação de uma conta.\nAo escolher %1$s como um provedor você conseguirá se comunicar com usuários de outros provedores dando a eles seu endereço XMPP completo.</string>
|
||||
<string name="magic_create_text_fixed">Você foi convidado para %1$s. Um nome de usuário já foi escolhido para você. Nós iremos guiá-lo ao longo do processo de criação de uma conta.\nVocê conseguirá se comunicar com usuários de outros provedores dando a eles seu endereço XMPP completo.</string>
|
||||
<string name="your_server_invitation">Seu convite do servidor</string>
|
||||
</resources>
|
||||
<string name="improperly_formatted_provisioning">Código de provisionamento formatado de maneira imprópria</string>
|
||||
</resources>
|
||||
|
|
|
@ -8,4 +8,5 @@
|
|||
<string name="magic_create_text_on_x">Вас пригласили на %1$s. Мы проведём вас через процесс создания аккаунта. Аккаунт на %1$s позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
|
||||
<string name="magic_create_text_fixed">Вас пригласили на %1$s. Вам уже назначили имя пользователя. Мы проведём вас через процесс создания аккаунта. Этот аккаунт позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
|
||||
<string name="your_server_invitation">Ваше приглашение</string>
|
||||
</resources>
|
||||
<string name="improperly_formatted_provisioning">Неправильный формат кода</string>
|
||||
</resources>
|
||||
|
|
|
@ -8,4 +8,5 @@
|
|||
<string name="magic_create_text_on_x">您已受邀参加%1$s。 我们将指导您完成创建帐户的过程。\n选择%1$s作为提供者后,您可以通过提供其他人的完整XMPP地址与其他提供者的用户进行交流。</string>
|
||||
<string name="magic_create_text_fixed">您已受邀参加%1$s。 已经为您选择了一个用户名。 我们将指导您完成创建帐户的过程。\n您可以通过向其他提供商的用户提供完整的XMPP地址来与他们进行交流。</string>
|
||||
<string name="your_server_invitation">你的服务器邀请</string>
|
||||
</resources>
|
||||
<string name="improperly_formatted_provisioning">格式不正确的配置代码</string>
|
||||
</resources>
|
||||
|
|
|
@ -621,7 +621,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
|
|||
}
|
||||
|
||||
public boolean isEditable() {
|
||||
return getStatus() != STATUS_RECEIVED && !isCarbon();
|
||||
return status != STATUS_RECEIVED && !isCarbon() && type != Message.TYPE_RTP_SESSION;
|
||||
}
|
||||
|
||||
public boolean mergeable(final Message message) {
|
||||
|
|
|
@ -225,19 +225,31 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
private void execute(final Query query) {
|
||||
final Account account = query.getAccount();
|
||||
if (account.getStatus() == Account.State.ONLINE) {
|
||||
final Conversation conversation = query.getConversation();
|
||||
if (conversation != null && conversation.getStatus() == Conversation.STATUS_ARCHIVED) {
|
||||
throw new IllegalStateException("Attempted to run MAM query for archived conversation");
|
||||
}
|
||||
Log.d(Config.LOGTAG, account.getJid().asBareJid().toString() + ": running mam query " + query.toString());
|
||||
IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query);
|
||||
final IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query);
|
||||
this.mXmppConnectionService.sendIqPacket(account, packet, (a, p) -> {
|
||||
Element fin = p.findChild("fin", query.version.namespace);
|
||||
final Element fin = p.findChild("fin", query.version.namespace);
|
||||
if (p.getType() == IqPacket.TYPE.TIMEOUT) {
|
||||
synchronized (MessageArchiveService.this.queries) {
|
||||
MessageArchiveService.this.queries.remove(query);
|
||||
synchronized (this.queries) {
|
||||
this.queries.remove(query);
|
||||
if (query.hasCallback()) {
|
||||
query.callback(false);
|
||||
}
|
||||
}
|
||||
} else if (p.getType() == IqPacket.TYPE.RESULT && fin != null) {
|
||||
processFin(query, fin);
|
||||
final boolean running;
|
||||
synchronized (this.queries) {
|
||||
running = this.queries.contains(query);
|
||||
}
|
||||
if (running) {
|
||||
processFin(query, fin);
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid().asBareJid()+": ignoring MAM iq result because query had been killed");
|
||||
}
|
||||
} else if (p.getType() == IqPacket.TYPE.RESULT && query.isLegacy()) {
|
||||
//do nothing
|
||||
} else {
|
||||
|
@ -252,9 +264,11 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
}
|
||||
}
|
||||
|
||||
private void finalizeQuery(Query query, boolean done) {
|
||||
private void finalizeQuery(final Query query, boolean done) {
|
||||
synchronized (this.queries) {
|
||||
this.queries.remove(query);
|
||||
if (!this.queries.remove(query)) {
|
||||
throw new IllegalStateException("Unable to remove query from queries");
|
||||
}
|
||||
}
|
||||
final Conversation conversation = query.getConversation();
|
||||
if (conversation != null) {
|
||||
|
@ -377,7 +391,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
void kill(Conversation conversation) {
|
||||
final ArrayList<Query> toBeKilled = new ArrayList<>();
|
||||
synchronized (this.queries) {
|
||||
for (Query q : queries) {
|
||||
for (final Query q : queries) {
|
||||
if (q.conversation == conversation) {
|
||||
toBeKilled.add(q);
|
||||
}
|
||||
|
|
|
@ -239,8 +239,8 @@ public class XmppConnectionService extends Service {
|
|||
Environment.getExternalStorageDirectory().getAbsolutePath()
|
||||
) {
|
||||
@Override
|
||||
public void onEvent(int event, String path) {
|
||||
markFileDeleted(path);
|
||||
public void onEvent(final int event, final File file) {
|
||||
markFileDeleted(file);
|
||||
}
|
||||
};
|
||||
private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {
|
||||
|
@ -1859,17 +1859,16 @@ public class XmppConnectionService extends Service {
|
|||
return this.conversations;
|
||||
}
|
||||
|
||||
private void markFileDeleted(final String path) {
|
||||
private void markFileDeleted(final File file) {
|
||||
synchronized (FILENAMES_TO_IGNORE_DELETION) {
|
||||
if (FILENAMES_TO_IGNORE_DELETION.remove(path)) {
|
||||
Log.d(Config.LOGTAG, "ignored deletion of " + path);
|
||||
if (FILENAMES_TO_IGNORE_DELETION.remove(file.getAbsolutePath())) {
|
||||
Log.d(Config.LOGTAG, "ignored deletion of " + file.getAbsolutePath());
|
||||
return;
|
||||
}
|
||||
}
|
||||
final File file = new File(path);
|
||||
final boolean isInternalFile = fileBackend.isInternalFile(file);
|
||||
final List<String> uuids = databaseBackend.markFileAsDeleted(file, isInternalFile);
|
||||
Log.d(Config.LOGTAG, "deleted file " + path + " internal=" + isInternalFile + ", database hits=" + uuids.size());
|
||||
Log.d(Config.LOGTAG, "deleted file " + file.getAbsolutePath() + " internal=" + isInternalFile + ", database hits=" + uuids.size());
|
||||
markUuidsAsDeletedFiles(uuids);
|
||||
}
|
||||
|
||||
|
|
|
@ -2752,8 +2752,10 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
|||
if (lastEditableMessage != null) {
|
||||
correctMessage(lastEditableMessage);
|
||||
return true;
|
||||
} else {
|
||||
Toast.makeText(getActivity(),R.string.could_not_correct_message, Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2762,7 +2764,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
|||
if (service == null) {
|
||||
return;
|
||||
}
|
||||
Account.State status = conversation.getAccount().getStatus();
|
||||
final Account.State status = conversation.getAccount().getStatus();
|
||||
if (status == Account.State.ONLINE && conversation.setOutgoingChatState(ChatState.COMPOSING)) {
|
||||
service.sendChatState(conversation);
|
||||
}
|
||||
|
@ -2775,7 +2777,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
|||
if (service == null) {
|
||||
return;
|
||||
}
|
||||
Account.State status = conversation.getAccount().getStatus();
|
||||
final Account.State status = conversation.getAccount().getStatus();
|
||||
if (status == Account.State.ONLINE && conversation.setOutgoingChatState(ChatState.PAUSED)) {
|
||||
service.sendChatState(conversation);
|
||||
}
|
||||
|
@ -2787,7 +2789,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
|||
if (service == null) {
|
||||
return;
|
||||
}
|
||||
Account.State status = conversation.getAccount().getStatus();
|
||||
final Account.State status = conversation.getAccount().getStatus();
|
||||
if (status == Account.State.ONLINE && conversation.setOutgoingChatState(Config.DEFAULT_CHAT_STATE)) {
|
||||
service.sendChatState(conversation);
|
||||
}
|
||||
|
|
|
@ -33,6 +33,8 @@ import android.widget.EditText;
|
|||
import android.widget.ImageView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.common.base.CharMatcher;
|
||||
|
||||
import org.openintents.openpgp.util.OpenPgpUtils;
|
||||
|
||||
import java.net.URL;
|
||||
|
@ -69,13 +71,13 @@ import eu.siacs.conversations.utils.TorServiceUtils;
|
|||
import eu.siacs.conversations.utils.UIHelper;
|
||||
import eu.siacs.conversations.utils.XmppUri;
|
||||
import eu.siacs.conversations.xml.Element;
|
||||
import eu.siacs.conversations.xmpp.Jid;
|
||||
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
|
||||
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
|
||||
import eu.siacs.conversations.xmpp.XmppConnection;
|
||||
import eu.siacs.conversations.xmpp.XmppConnection.Features;
|
||||
import eu.siacs.conversations.xmpp.forms.Data;
|
||||
import eu.siacs.conversations.xmpp.pep.Avatar;
|
||||
import eu.siacs.conversations.xmpp.Jid;
|
||||
|
||||
public class EditAccountActivity extends OmemoActivity implements OnAccountUpdate, OnUpdateBlocklist,
|
||||
OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched {
|
||||
|
@ -215,12 +217,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
|
|||
removeErrorsOnAllBut(binding.accountJidLayout);
|
||||
return;
|
||||
}
|
||||
String hostname = null;
|
||||
final String hostname;
|
||||
int numericPort = 5222;
|
||||
if (mShowOptions) {
|
||||
hostname = binding.hostname.getText().toString().replaceAll("\\s", "");
|
||||
final String port = binding.port.getText().toString().replaceAll("\\s", "");
|
||||
if (hostname.contains(" ")) {
|
||||
hostname = CharMatcher.whitespace().removeFrom(binding.hostname.getText());
|
||||
final String port = CharMatcher.whitespace().removeFrom(binding.port.getText());
|
||||
if (Resolver.invalidHostname(hostname)) {
|
||||
binding.hostnameLayout.setError(getString(R.string.not_valid_hostname));
|
||||
binding.hostname.requestFocus();
|
||||
removeErrorsOnAllBut(binding.hostnameLayout);
|
||||
|
@ -243,6 +245,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
|
|||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
hostname = null;
|
||||
}
|
||||
|
||||
if (jid.getLocal() == null) {
|
||||
|
|
|
@ -371,15 +371,23 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
|
|||
binding.with.setText(account.getRoster().getContact(with).getDisplayName());
|
||||
} else if (Intent.ACTION_VIEW.equals(action)) {
|
||||
final String extraLastState = intent.getStringExtra(EXTRA_LAST_REPORTED_STATE);
|
||||
if (extraLastState != null) {
|
||||
final RtpEndUserState state = extraLastState == null ? null : RtpEndUserState.valueOf(extraLastState);
|
||||
if (state != null) {
|
||||
Log.d(Config.LOGTAG, "restored last state from intent extra");
|
||||
RtpEndUserState state = RtpEndUserState.valueOf(extraLastState);
|
||||
updateButtonConfiguration(state);
|
||||
updateStateDisplay(state);
|
||||
updateProfilePicture(state);
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
binding.with.setText(account.getRoster().getContact(with).getDisplayName());
|
||||
if (xmppConnectionService.getJingleConnectionManager().fireJingleRtpConnectionStateUpdates()) {
|
||||
return;
|
||||
}
|
||||
if (END_CARD.contains(state) || xmppConnectionService.getJingleConnectionManager().hasMatchingProposal(account, with)) {
|
||||
return;
|
||||
}
|
||||
Log.d(Config.LOGTAG, "restored state (" + state + ") was not an end card. finishing");
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ import android.support.annotation.AttrRes;
|
|||
import android.support.annotation.DimenRes;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
@ -21,6 +22,7 @@ import java.util.Arrays;
|
|||
import java.util.List;
|
||||
import java.util.concurrent.RejectedExecutionException;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
import eu.siacs.conversations.R;
|
||||
import eu.siacs.conversations.databinding.MediaBinding;
|
||||
import eu.siacs.conversations.services.ExportBackupService;
|
||||
|
@ -51,14 +53,16 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
|
|||
this.mediaSize = Math.round(activity.getResources().getDimension(mediaSize));
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void setMediaSize(RecyclerView recyclerView, int mediaSize) {
|
||||
RecyclerView.Adapter adapter = recyclerView.getAdapter();
|
||||
final RecyclerView.Adapter adapter = recyclerView.getAdapter();
|
||||
if (adapter instanceof MediaAdapter) {
|
||||
((MediaAdapter) adapter).setMediaSize(mediaSize);
|
||||
}
|
||||
}
|
||||
|
||||
private static @AttrRes int getImageAttr(Attachment attachment) {
|
||||
private static @AttrRes
|
||||
int getImageAttr(Attachment attachment) {
|
||||
final @AttrRes int attr;
|
||||
if (attachment.getType() == Attachment.Type.LOCATION) {
|
||||
attr = R.attr.media_preview_location;
|
||||
|
@ -66,6 +70,7 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
|
|||
attr = R.attr.media_preview_recording;
|
||||
} else {
|
||||
final String mime = attachment.getMime();
|
||||
Log.d(Config.LOGTAG, "mime=" + mime);
|
||||
if (mime == null) {
|
||||
attr = R.attr.media_preview_unknown;
|
||||
} else if (mime.startsWith("audio/")) {
|
||||
|
@ -84,6 +89,8 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
|
|||
attr = R.attr.media_preview_backup;
|
||||
} else if (DOCUMENT_MIMES.contains(mime)) {
|
||||
attr = R.attr.media_preview_document;
|
||||
} else if (mime.equals("application/gpx+xml")) {
|
||||
attr = R.attr.media_preview_tour;
|
||||
} else {
|
||||
attr = R.attr.media_preview_unknown;
|
||||
}
|
||||
|
@ -155,7 +162,7 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
|
|||
|
||||
private void loadPreview(Attachment attachment, ImageView imageView) {
|
||||
if (cancelPotentialWork(attachment, imageView)) {
|
||||
final Bitmap bm = activity.xmppConnectionService.getFileBackend().getPreviewForUri(attachment,mediaSize,true);
|
||||
final Bitmap bm = activity.xmppConnectionService.getFileBackend().getPreviewForUri(attachment, mediaSize, true);
|
||||
if (bm != null) {
|
||||
cancelPotentialWork(attachment, imageView);
|
||||
imageView.setImageBitmap(bm);
|
||||
|
|
|
@ -36,6 +36,8 @@ import android.net.Uri;
|
|||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import com.google.common.base.MoreObjects;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
@ -87,6 +89,16 @@ public class Attachment implements Parcelable {
|
|||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return MoreObjects.toStringHelper(this)
|
||||
.add("uri", uri)
|
||||
.add("type", type)
|
||||
.add("uuid", uuid)
|
||||
.add("mime", mime)
|
||||
.toString();
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
FILE, IMAGE, LOCATION, RECORDING
|
||||
}
|
||||
|
|
|
@ -6,8 +6,11 @@ import android.util.Log;
|
|||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
|
@ -19,6 +22,9 @@ import eu.siacs.conversations.Config;
|
|||
*/
|
||||
|
||||
public abstract class ConversationsFileObserver {
|
||||
private static final Executor EVENT_EXECUTOR = Executors.newSingleThreadExecutor();
|
||||
private static final int MASK = FileObserver.DELETE | FileObserver.MOVED_FROM | FileObserver.CREATE;
|
||||
|
||||
|
||||
private final String path;
|
||||
private final List<SingleFileObserver> mObservers = new ArrayList<>();
|
||||
|
@ -34,50 +40,47 @@ public abstract class ConversationsFileObserver {
|
|||
}
|
||||
|
||||
private synchronized void startWatchingInternal() {
|
||||
Stack<String> stack = new Stack<>();
|
||||
final Stack<String> stack = new Stack<>();
|
||||
stack.push(path);
|
||||
|
||||
while (!stack.empty()) {
|
||||
if (shouldStop.get()) {
|
||||
Log.d(Config.LOGTAG,"file observer received command to stop");
|
||||
Log.d(Config.LOGTAG, "file observer received command to stop");
|
||||
return;
|
||||
}
|
||||
String parent = stack.pop();
|
||||
mObservers.add(new SingleFileObserver(parent, FileObserver.DELETE| FileObserver.MOVED_FROM));
|
||||
final String parent = stack.pop();
|
||||
final File path = new File(parent);
|
||||
mObservers.add(new SingleFileObserver(path, MASK));
|
||||
final File[] files = path.listFiles();
|
||||
if (files == null) {
|
||||
continue;
|
||||
}
|
||||
for(File file : files) {
|
||||
for (final File file : (files == null ? new File[0] : files)) {
|
||||
if (shouldStop.get()) {
|
||||
Log.d(Config.LOGTAG,"file observer received command to stop");
|
||||
Log.d(Config.LOGTAG, "file observer received command to stop");
|
||||
return;
|
||||
}
|
||||
if (file.isDirectory() && file.getName().charAt(0) != '.') {
|
||||
final String currentPath = file.getAbsolutePath();
|
||||
if (depth(file) <= 8 && !stack.contains(currentPath) && !observing(currentPath)) {
|
||||
if (depth(file) <= 8 && !stack.contains(currentPath) && !observing(file)) {
|
||||
stack.push(currentPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(FileObserver observer : mObservers) {
|
||||
for (FileObserver observer : mObservers) {
|
||||
observer.startWatching();
|
||||
}
|
||||
}
|
||||
|
||||
private static int depth(File file) {
|
||||
int depth = 0;
|
||||
while((file = file.getParentFile()) != null) {
|
||||
while ((file = file.getParentFile()) != null) {
|
||||
depth++;
|
||||
}
|
||||
return depth;
|
||||
}
|
||||
|
||||
private boolean observing(String path) {
|
||||
for(SingleFileObserver observer : mObservers) {
|
||||
if(path.equals(observer.path)) {
|
||||
private boolean observing(final File path) {
|
||||
for (final SingleFileObserver observer : mObservers) {
|
||||
if (path.equals(observer.path)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -90,13 +93,13 @@ public abstract class ConversationsFileObserver {
|
|||
}
|
||||
|
||||
private synchronized void stopWatchingInternal() {
|
||||
for(FileObserver observer : mObservers) {
|
||||
for (FileObserver observer : mObservers) {
|
||||
observer.stopWatching();
|
||||
}
|
||||
mObservers.clear();
|
||||
}
|
||||
|
||||
abstract public void onEvent(int event, String path);
|
||||
abstract public void onEvent(final int event, File path);
|
||||
|
||||
public void restartWatching() {
|
||||
stopWatching();
|
||||
|
@ -104,21 +107,33 @@ public abstract class ConversationsFileObserver {
|
|||
}
|
||||
|
||||
private class SingleFileObserver extends FileObserver {
|
||||
private final String path;
|
||||
private final File path;
|
||||
|
||||
SingleFileObserver(String path, int mask) {
|
||||
super(path, mask);
|
||||
SingleFileObserver(final File path, final int mask) {
|
||||
super(path.getAbsolutePath(), mask);
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEvent(int event, String filename) {
|
||||
public void onEvent(final int event, final String filename) {
|
||||
if (filename == null) {
|
||||
Log.d(Config.LOGTAG,"ignored file event with NULL filename (event="+event+")");
|
||||
Log.d(Config.LOGTAG, "ignored file event with NULL filename (event=" + event + ")");
|
||||
return;
|
||||
}
|
||||
ConversationsFileObserver.this.onEvent(event, path+'/'+filename);
|
||||
EVENT_EXECUTOR.execute(() -> {
|
||||
final File file = new File(this.path, filename);
|
||||
if ((event & FileObserver.ALL_EVENTS) == FileObserver.CREATE) {
|
||||
if (file.isDirectory()) {
|
||||
Log.d(Config.LOGTAG, "file observer observed new directory creation " + file);
|
||||
if (!observing(file)) {
|
||||
final SingleFileObserver observer = new SingleFileObserver(file, MASK);
|
||||
observer.startWatching();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
ConversationsFileObserver.this.onEvent(event, file);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,8 +14,11 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
package eu.siacs.conversations.utils;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.provider.OpenableColumns;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.File;
|
||||
|
@ -38,6 +41,7 @@ import eu.siacs.conversations.services.ExportBackupService;
|
|||
public final class MimeUtils {
|
||||
private static final Map<String, String> mimeTypeToExtensionMap = new HashMap<>();
|
||||
private static final Map<String, String> extensionToMimeTypeMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
// The following table is based on /etc/mime.types data minus
|
||||
// chemical/* MIME types and MIME types that don't map to any
|
||||
|
@ -52,7 +56,8 @@ public final class MimeUtils {
|
|||
// by guessExtensionFromMimeType.
|
||||
add("application/andrew-inset", "ez");
|
||||
add("application/dsptype", "tsp");
|
||||
add("application/epub+zip","epub");
|
||||
add("application/epub+zip", "epub");
|
||||
add("application/gpx+xml", "gpx");
|
||||
add("application/hta", "hta");
|
||||
add("application/mac-binhex40", "hqx");
|
||||
add("application/mathematica", "nb");
|
||||
|
@ -68,9 +73,9 @@ public final class MimeUtils {
|
|||
add("application/rdf+xml", "rdf");
|
||||
add("application/rss+xml", "rss");
|
||||
add("application/zip", "zip");
|
||||
add("application/vnd.amazon.mobi8-ebook","azw3");
|
||||
add("application/vnd.amazon.mobi8-ebook","azw");
|
||||
add("application/vnd.amazon.mobi8-ebook","kfx");
|
||||
add("application/vnd.amazon.mobi8-ebook", "azw3");
|
||||
add("application/vnd.amazon.mobi8-ebook", "azw");
|
||||
add("application/vnd.amazon.mobi8-ebook", "kfx");
|
||||
add("application/vnd.android.package-archive", "apk");
|
||||
add("application/vnd.cinderella", "cdy");
|
||||
add(ExportBackupService.MIME_TYPE, "ceb");
|
||||
|
@ -183,7 +188,7 @@ public final class MimeUtils {
|
|||
add("application/x-maker", "book");
|
||||
add("application/x-maker", "fbdoc");
|
||||
add("application/x-mif", "mif");
|
||||
add("application/x-mobipocket-ebook","mobi");
|
||||
add("application/x-mobipocket-ebook", "mobi");
|
||||
add("application/x-ms-wmd", "wmd");
|
||||
add("application/x-ms-wmz", "wmz");
|
||||
add("application/x-msi", "msi");
|
||||
|
@ -242,7 +247,7 @@ public final class MimeUtils {
|
|||
add("audio/mpeg", "mp2");
|
||||
add("audio/mpeg", "m4a");
|
||||
add("audio/mpegurl", "m3u");
|
||||
add("audio/ogg","oga");
|
||||
add("audio/ogg", "oga");
|
||||
add("audio/prs.sid", "sid");
|
||||
add("audio/x-aiff", "aif");
|
||||
add("audio/x-aiff", "aiff");
|
||||
|
@ -268,7 +273,7 @@ public final class MimeUtils {
|
|||
add("image/ico", "cur");
|
||||
add("image/ico", "ico");
|
||||
add("image/ief", "ief");
|
||||
add("image/heic","heic");
|
||||
add("image/heic", "heic");
|
||||
// add ".jpg" first so it will be the default for guessExtensionFromMimeType
|
||||
add("image/jpeg", "jpg");
|
||||
add("image/jpeg", "jpeg");
|
||||
|
@ -367,7 +372,7 @@ public final class MimeUtils {
|
|||
add("video/fli", "fli");
|
||||
add("video/m4v", "m4v");
|
||||
add("video/mp2ts", "ts");
|
||||
add("video/ogg","ogv");
|
||||
add("video/ogg", "ogv");
|
||||
add("video/mpeg", "mpeg");
|
||||
add("video/mpeg", "mpg");
|
||||
add("video/mpeg", "mpe");
|
||||
|
@ -393,6 +398,7 @@ public final class MimeUtils {
|
|||
add("x-epoc/x-sisx-app", "sisx");
|
||||
applyOverrides();
|
||||
}
|
||||
|
||||
private static void add(String mimeType, String extension) {
|
||||
// If we have an existing x -> y mapping, we do not want to
|
||||
// override it with another mapping x -> y2.
|
||||
|
@ -406,6 +412,7 @@ public final class MimeUtils {
|
|||
extensionToMimeTypeMap.put(extension, mimeType);
|
||||
}
|
||||
}
|
||||
|
||||
private static InputStream getContentTypesPropertiesStream() {
|
||||
// User override?
|
||||
String userTable = System.getProperty("content.types.user.table");
|
||||
|
@ -428,6 +435,7 @@ public final class MimeUtils {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* This isn't what the RI does. The RI doesn't have hard-coded defaults, so supplying your
|
||||
* own "content.types.user.table" means you don't get any of the built-ins, and the built-ins
|
||||
|
@ -456,10 +464,13 @@ public final class MimeUtils {
|
|||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
private MimeUtils() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given MIME type has an entry in the map.
|
||||
*
|
||||
* @param mimeType A MIME type (i.e. text/plain)
|
||||
* @return True iff there is a mimeType entry in the map.
|
||||
*/
|
||||
|
@ -469,8 +480,10 @@ public final class MimeUtils {
|
|||
}
|
||||
return mimeTypeToExtensionMap.containsKey(mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the MIME type for the given extension.
|
||||
*
|
||||
* @param extension A file extension without the leading '.'
|
||||
* @return The MIME type for the given extension or null iff there is none.
|
||||
*/
|
||||
|
@ -480,8 +493,10 @@ public final class MimeUtils {
|
|||
}
|
||||
return extensionToMimeTypeMap.get(extension.toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given extension has a registered MIME type.
|
||||
*
|
||||
* @param extension A file extension without the leading '.'
|
||||
* @return True iff there is an extension entry in the map.
|
||||
*/
|
||||
|
@ -491,10 +506,12 @@ public final class MimeUtils {
|
|||
}
|
||||
return extensionToMimeTypeMap.containsKey(extension);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the registered extension for the given MIME type. Note that some
|
||||
* MIME types map to multiple extensions. This call will return the most
|
||||
* common extension for the given MIME type.
|
||||
*
|
||||
* @param mimeType A MIME type (i.e. text/plain)
|
||||
* @return The extension for the given MIME type or null iff there is none.
|
||||
*/
|
||||
|
@ -506,7 +523,7 @@ public final class MimeUtils {
|
|||
}
|
||||
|
||||
public static String guessMimeTypeFromUriAndMime(final Context context, final Uri uri, final String mime) {
|
||||
Log.d(Config.LOGTAG,"guessMimeTypeFromUriAndMime "+uri+" and mime="+mime);
|
||||
Log.d(Config.LOGTAG, "guessMimeTypeFromUriAndMime " + uri + " and mime=" + mime);
|
||||
if (mime == null || mime.equals("application/octet-stream")) {
|
||||
final String guess = guessMimeTypeFromUri(context, uri);
|
||||
if (guess != null) {
|
||||
|
@ -515,7 +532,7 @@ public final class MimeUtils {
|
|||
return mime;
|
||||
}
|
||||
}
|
||||
return guessMimeTypeFromUri(context ,uri);
|
||||
return guessMimeTypeFromUri(context, uri);
|
||||
}
|
||||
|
||||
public static String guessMimeTypeFromUri(Context context, Uri uri) {
|
||||
|
@ -523,18 +540,20 @@ public final class MimeUtils {
|
|||
String mimeType;
|
||||
try {
|
||||
mimeType = context.getContentResolver().getType(uri);
|
||||
} catch (Throwable throwable) {
|
||||
} catch (final Throwable throwable) {
|
||||
mimeType = null;
|
||||
}
|
||||
// try the extension
|
||||
if ((mimeType == null || mimeType.equals("application/octet-stream")) && uri.getPath() != null) {
|
||||
String path = uri.getPath();
|
||||
int start = path.lastIndexOf('.') + 1;
|
||||
if (start < path.length()) {
|
||||
final String guess = MimeUtils.guessMimeTypeFromExtension(path.substring(start));
|
||||
if (guess != null) {
|
||||
mimeType = guess;
|
||||
}
|
||||
if (mimeType == null || mimeType.equals("application/octet-stream")) {
|
||||
final String path = uri.getPath();
|
||||
if (path != null) {
|
||||
mimeType = guessFromPath(path);
|
||||
}
|
||||
}
|
||||
if (mimeType == null && "content".equals(uri.getScheme())) {
|
||||
final String name = getDisplayName(context, uri);
|
||||
if (name != null) {
|
||||
mimeType = guessFromPath(name);
|
||||
}
|
||||
}
|
||||
// sometimes this works (as with the commit content api)
|
||||
|
@ -544,6 +563,23 @@ public final class MimeUtils {
|
|||
return mimeType;
|
||||
}
|
||||
|
||||
private static String getDisplayName(final Context context, final Uri uri) {
|
||||
try (Cursor cursor = context.getContentResolver().query(uri, null, null, null, null)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
return cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static String guessFromPath(final String path) {
|
||||
final int start = path.lastIndexOf('.') + 1;
|
||||
if (start < path.length()) {
|
||||
return MimeUtils.guessMimeTypeFromExtension(path.substring(start));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String extractRelevantExtension(URL url) {
|
||||
String path = url.getPath();
|
||||
return extractRelevantExtension(path, true);
|
||||
|
@ -565,7 +601,7 @@ public final class MimeUtils {
|
|||
String extension = filename.substring(dotPosition + 1);
|
||||
// we want the real file extension, not the crypto one
|
||||
if (ignoreCryptoExtension && Transferable.VALID_CRYPTO_EXTENSIONS.contains(extension)) {
|
||||
return extractRelevantExtension(filename.substring(0,dotPosition));
|
||||
return extractRelevantExtension(filename.substring(0, dotPosition));
|
||||
} else {
|
||||
return extension;
|
||||
}
|
||||
|
|
|
@ -90,7 +90,6 @@ public class Resolver {
|
|||
return happyEyeball(resolveNoSrvRecords(DNSName.from(hostname), port, true));
|
||||
}
|
||||
|
||||
|
||||
public static boolean useDirectTls(final int port) {
|
||||
return port == 443 || port == 5223;
|
||||
}
|
||||
|
|
|
@ -683,7 +683,9 @@ public class XmppConnection implements Runnable {
|
|||
if (Config.BACKGROUND_STANZA_LOGGING && mXmppConnectionService.checkListeners()) {
|
||||
Log.d(Config.LOGTAG, "[background stanza] " + element);
|
||||
}
|
||||
if (element instanceof IqPacket && element.hasChild("jingle", Namespace.JINGLE)) {
|
||||
if (element instanceof IqPacket
|
||||
&& (((IqPacket) element).getType() == IqPacket.TYPE.SET)
|
||||
&& element.hasChild("jingle", Namespace.JINGLE)) {
|
||||
return JinglePacket.upgrade((IqPacket) element);
|
||||
} else {
|
||||
return element;
|
||||
|
|
|
@ -456,6 +456,21 @@ public class JingleConnectionManager extends AbstractConnectionManager {
|
|||
}
|
||||
}
|
||||
|
||||
public boolean fireJingleRtpConnectionStateUpdates() {
|
||||
boolean firedUpdates = false;
|
||||
for (final AbstractJingleConnection connection : this.connections.values()) {
|
||||
if (connection instanceof JingleRtpConnection) {
|
||||
final JingleRtpConnection jingleRtpConnection = (JingleRtpConnection) connection;
|
||||
if (jingleRtpConnection.isTerminated()) {
|
||||
continue;
|
||||
}
|
||||
jingleRtpConnection.fireStateUpdate();
|
||||
firedUpdates = true;
|
||||
}
|
||||
}
|
||||
return firedUpdates;
|
||||
}
|
||||
|
||||
void getPrimaryCandidate(final Account account, final boolean initiator, final OnPrimaryCandidateFound listener) {
|
||||
if (Config.DISABLE_PROXY_LOOKUP) {
|
||||
listener.onPrimaryCandidateFound(false, null);
|
||||
|
@ -576,6 +591,18 @@ public class JingleConnectionManager extends AbstractConnectionManager {
|
|||
}
|
||||
}
|
||||
|
||||
public boolean hasMatchingProposal(final Account account, final Jid with) {
|
||||
synchronized (this.rtpSessionProposals) {
|
||||
for (Map.Entry<RtpSessionProposal, DeviceDiscoveryState> entry : this.rtpSessionProposals.entrySet()) {
|
||||
final RtpSessionProposal proposal = entry.getKey();
|
||||
if (proposal.account == account && with.asBareJid().equals(proposal.with)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void deliverIbbPacket(Account account, IqPacket packet) {
|
||||
final String sid;
|
||||
final Element payload;
|
||||
|
|
|
@ -239,7 +239,11 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
|||
}
|
||||
final Set<Map.Entry<String, RtpContentMap.DescriptionTransport>> candidates = contentMap.contents.entrySet();
|
||||
if (this.state == State.SESSION_ACCEPTED) {
|
||||
processCandidates(candidates);
|
||||
try {
|
||||
processCandidates(candidates);
|
||||
} catch (final WebRTCWrapper.PeerConnectionNotInitialized e) {
|
||||
Log.w(Config.LOGTAG, id.account.getJid().asBareJid() + ": PeerConnection was not initialized when processing transport info. this usually indicates a race condition that can be ignored");
|
||||
}
|
||||
} else {
|
||||
pendingIceCandidates.push(candidates);
|
||||
}
|
||||
|
@ -807,7 +811,14 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
|||
return RtpEndUserState.CONNECTING;
|
||||
}
|
||||
case SESSION_ACCEPTED:
|
||||
final PeerConnection.PeerConnectionState state = webRTCWrapper.getState();
|
||||
final PeerConnection.PeerConnectionState state;
|
||||
try {
|
||||
state = webRTCWrapper.getState();
|
||||
} catch (final WebRTCWrapper.PeerConnectionNotInitialized e) {
|
||||
//We usually close the WebRTCWrapper *before* transitioning so we might still
|
||||
//be in SESSION_ACCEPTED even though the peerConnection has been torn down
|
||||
return RtpEndUserState.ENDING_CALL;
|
||||
}
|
||||
if (state == PeerConnection.PeerConnectionState.CONNECTED) {
|
||||
return RtpEndUserState.CONNECTED;
|
||||
} else if (state == PeerConnection.PeerConnectionState.NEW || state == PeerConnection.PeerConnectionState.CONNECTING) {
|
||||
|
@ -1256,6 +1267,11 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
|||
this.proposedMedia = media;
|
||||
}
|
||||
|
||||
public void fireStateUpdate() {
|
||||
final RtpEndUserState endUserState = getEndUserState();
|
||||
xmppConnectionService.notifyJingleRtpConnectionUpdate(id.account, id.with, id.sessionId, endUserState);
|
||||
}
|
||||
|
||||
private interface OnIceServersDiscovered {
|
||||
void onIceServersDiscovered(List<PeerConnection.IceServer> iceServers);
|
||||
}
|
||||
|
|
|
@ -552,7 +552,7 @@ public class WebRTCWrapper {
|
|||
private PeerConnection requirePeerConnection() {
|
||||
final PeerConnection peerConnection = this.peerConnection;
|
||||
if (peerConnection == null) {
|
||||
throw new IllegalStateException("initialize PeerConnection first");
|
||||
throw new PeerConnectionNotInitialized();
|
||||
}
|
||||
return peerConnection;
|
||||
}
|
||||
|
@ -617,6 +617,14 @@ public class WebRTCWrapper {
|
|||
}
|
||||
}
|
||||
|
||||
public static class PeerConnectionNotInitialized extends IllegalStateException {
|
||||
|
||||
private PeerConnectionNotInitialized() {
|
||||
super("initialize PeerConnection first");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class CapturerChoice {
|
||||
private final CameraVideoCapturer cameraVideoCapturer;
|
||||
private final CameraEnumerationAndroid.CaptureFormat captureFormat;
|
||||
|
|
|
@ -29,6 +29,7 @@ public class JinglePacket extends IqPacket {
|
|||
|
||||
public static JinglePacket upgrade(final IqPacket iqPacket) {
|
||||
Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE));
|
||||
Preconditions.checkArgument(iqPacket.getType() == TYPE.SET);
|
||||
final JinglePacket jinglePacket = new JinglePacket();
|
||||
jinglePacket.setAttributes(iqPacket.getAttributes());
|
||||
jinglePacket.setChildren(iqPacket.getChildren());
|
||||
|
@ -70,11 +71,11 @@ public class JinglePacket extends IqPacket {
|
|||
public ReasonWrapper getReason() {
|
||||
final Element reasonElement = getJingleChild("reason");
|
||||
if (reasonElement == null) {
|
||||
return new ReasonWrapper(Reason.UNKNOWN,null);
|
||||
return new ReasonWrapper(Reason.UNKNOWN, null);
|
||||
}
|
||||
String text = null;
|
||||
Reason reason = Reason.UNKNOWN;
|
||||
for(Element child : reasonElement.getChildren()) {
|
||||
for (Element child : reasonElement.getChildren()) {
|
||||
if ("text".equals(child.getName())) {
|
||||
text = child.getContent();
|
||||
} else {
|
||||
|
|
After Width: | Height: | Size: 369 B |
After Width: | Height: | Size: 372 B |
After Width: | Height: | Size: 273 B |
After Width: | Height: | Size: 277 B |
After Width: | Height: | Size: 451 B |
After Width: | Height: | Size: 451 B |
After Width: | Height: | Size: 662 B |
After Width: | Height: | Size: 662 B |
After Width: | Height: | Size: 809 B |
After Width: | Height: | Size: 809 B |
|
@ -363,7 +363,6 @@
|
|||
<string name="server_info_broken">مكسر</string>
|
||||
<string name="pref_presence_settings">حالة الحضور</string>
|
||||
<string name="pref_away_when_screen_off">غائب عند إطفاء الشاشة</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"لا تزعجني\" في وضع السكوت</string>
|
||||
<string name="pref_show_connection_options">إعدادات الربط الموسعة</string>
|
||||
<string name="pref_show_connection_options_summary">عرض اسم المضيف وإعدادات المنفذ عند تنصيب حساب</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -368,11 +368,7 @@
|
|||
<string name="server_info_broken">Повредено</string>
|
||||
<string name="pref_presence_settings">Присъствие</string>
|
||||
<string name="pref_away_when_screen_off">Отсъстващ, когато екранът е изключен</string>
|
||||
<string name="pref_away_when_screen_off_summary">Преминава в състояние „отсъстващ“ когато екранът бъде изключен</string>
|
||||
<string name="pref_dnd_on_silent_mode">„Отпочиващ“ в тих режим</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Преминава в състояние „отсъстващ“, когато устройството е в тих режим</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Тих режим при режим на вибриране</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Преминава в състояние „отсъстващ“, когато устройството е в режим на вибриране.</string>
|
||||
<string name="pref_show_connection_options">Разширени настройки за връзката</string>
|
||||
<string name="pref_show_connection_options_summary">Показване на настройките за сървър и порт при установка на профил</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -366,11 +366,7 @@
|
|||
<string name="server_info_broken">Trencat</string>
|
||||
<string name="pref_presence_settings">Disponibilitat</string>
|
||||
<string name="pref_away_when_screen_off">Fora quan la pantalla està apagada</string>
|
||||
<string name="pref_away_when_screen_off_summary">Marqueu el vostre recurs quan la pantalla estigui desactivada</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"No molesteu\" en modo silenciós</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Marqueu el vostre recurs com \"No molesteu\" quan el dispositiu estigui en modo silenciós</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Tracteu de vibrar al modo silenciós</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Marqueu el vostre recurs com \"No molesteu\" quan el dispositiu estigui en vibració</string>
|
||||
<string name="pref_show_connection_options">Configuració de connexió estesa</string>
|
||||
<string name="pref_show_connection_options_summary">Mostra el nom de la màquina i la configuració del port quan configureu un compte</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -316,7 +316,6 @@
|
|||
<string name="account_status_bind_failure">Bind chyba</string>
|
||||
<string name="server_info_broken">Rozbité</string>
|
||||
<string name="pref_away_when_screen_off">Pryč při vypnuté obrazovce</string>
|
||||
<string name="pref_away_when_screen_off_summary">Při vypnuté obrazovce označí váš stav jako pryč</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Vibrační mód brát stejně jako tichý</string>
|
||||
<string name="pref_show_connection_options">Rozšířená nastavení připojení</string>
|
||||
<string name="pref_show_connection_options_summary">Zobrazovat nastavení hostname a port při vytváření účtu</string>
|
||||
|
|
|
@ -460,12 +460,12 @@
|
|||
<string name="account_status_host_unknown">Der Server ist nicht für diese Domain verantwortlich</string>
|
||||
<string name="server_info_broken">Fehlerhaft</string>
|
||||
<string name="pref_presence_settings">Status</string>
|
||||
<string name="pref_away_when_screen_off">Abwesend bei abgeschaltetem Bildschirm</string>
|
||||
<string name="pref_away_when_screen_off_summary">Setzt deinen Status auf \"abwesend\", solange dein Bildschirm abgeschaltet ist</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Bitte nicht stören\" bei Stummschaltung</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Setzt deinen Status auf \"Bitte nicht stören\", solange dein Gerät stummgeschaltet ist </string>
|
||||
<string name="pref_away_when_screen_off">Abwesend bei ausgeschaltetem Bildschirm</string>
|
||||
<string name="pref_away_when_screen_off_summary">Als abwesend anzeigen, wenn der Bildschirm ausgeschaltet ist</string>
|
||||
<string name="pref_dnd_on_silent_mode">Beschäftigt im lautlosen Modus</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Als Beschäftigt anzeigen, wenn sich das Gerät im lautlosen Modus befindet</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Vibration als Lautlos behandeln</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Setzt deinen Status auf \"Bitte nicht stören\", solange das Gerät auf Vibration geschaltet ist</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Als Beschäftigt anzeigen, wenn das Gerät auf Vibration eingestellt ist</string>
|
||||
<string name="pref_show_connection_options">Erweiterte Verbindungsoptionen</string>
|
||||
<string name="pref_show_connection_options_summary">Hostname- und Port-Optionen bei Kontoeinrichtung anzeigen</string>
|
||||
<string name="hostname_example">xmpp.domain.de</string>
|
||||
|
@ -923,6 +923,8 @@
|
|||
<string name="could_not_switch_camera">Kamera konnte nicht gewechselt werden</string>
|
||||
<string name="add_to_favorites">Zu Favoriten hinzufügen</string>
|
||||
<string name="remove_from_favorites">Von Favoriten entfernen</string>
|
||||
<string name="gpx_track">GPX-Strecke</string>
|
||||
<string name="could_not_correct_message">Nachricht konnte nicht korrigiert werden</string>
|
||||
<plurals name="view_users">
|
||||
<item quantity="one">%1$d Teilnehmer anzeigen</item>
|
||||
<item quantity="other">%1$d Teilnehmer anzeigen</item>
|
||||
|
|
|
@ -402,11 +402,7 @@
|
|||
<string name="server_info_broken">Χαλασμένος</string>
|
||||
<string name="pref_presence_settings">Διαθεσιμότητα</string>
|
||||
<string name="pref_away_when_screen_off">Εκτός χρήσης όταν η οθόνη είναι σβηστή</string>
|
||||
<string name="pref_away_when_screen_off_summary">Σημειώνει την παρουσία σας ως εκτός χρήσης όταν σβήνει η οθόνη</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Μην ενοχλείτε\" όταν βρίσκεται σε σιωπηρή λειτουργία</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Σημειώνει την παρουσία σας ως \"Μην ενοχλείτε\" όταν η συσκευή είναι σε κατάσταση σιωπής</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Χρήση της κατάστασης δόνησης ως σιωπηρή κατάσταση</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Σημειώνει την παρουσία σας ως \"Μην ενοχλείτε\" όταν η συσκευή είναι σε κατάσταση δόνησης</string>
|
||||
<string name="pref_show_connection_options">Περισσότερες ρυθμίσεις σύνδεσης</string>
|
||||
<string name="pref_show_connection_options_summary">Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων πόρτας όταν δημιουργείται ένας νέος λογαριασμός</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -461,11 +461,11 @@
|
|||
<string name="server_info_broken">Error</string>
|
||||
<string name="pref_presence_settings">Disponibilidad</string>
|
||||
<string name="pref_away_when_screen_off">Ausente con pantalla apagada</string>
|
||||
<string name="pref_away_when_screen_off_summary">Cambia tu estado a ausente cuando la pantalla está apagada</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"No molestar\" en modo silencio</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Cambia tu estado a \"no molestar\" cuando el dispositivo está en modo silencio</string>
|
||||
<string name="pref_away_when_screen_off_summary">Mostrar como Ausente cuando la pantalla esté apagada</string>
|
||||
<string name="pref_dnd_on_silent_mode">Ocupado en modo silencio</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Mostrar como Ocupado cuando el dispositivo esté en modo silencio</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Modo vibración como modo silencio</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Cambia tu estado a \"no molestar\" cuando el dispositivo está en modo vibración</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Mostrar como Ocupado cuando el dispositivo esté en modo vibración</string>
|
||||
<string name="pref_show_connection_options">Opciones de conexión</string>
|
||||
<string name="pref_show_connection_options_summary">Mostrar el hostname y el puerto cuando se está creando una cuenta</string>
|
||||
<string name="hostname_example">xmpp.ejemplo.com</string>
|
||||
|
@ -923,6 +923,8 @@
|
|||
<string name="could_not_switch_camera">No se ha podido cambiar de cámara</string>
|
||||
<string name="add_to_favorites">Añadir a los favoritos</string>
|
||||
<string name="remove_from_favorites">Eliminar de favoritos</string>
|
||||
<string name="gpx_track">Recorrido GPX</string>
|
||||
<string name="could_not_correct_message">No se pudo corregir el mensaje</string>
|
||||
<plurals name="view_users">
|
||||
<item quantity="one">Ver %1$d Participante</item>
|
||||
<item quantity="other">Ver %1$d Participantes</item>
|
||||
|
|
|
@ -399,11 +399,7 @@
|
|||
<string name="server_info_broken">Hondatuta</string>
|
||||
<string name="pref_presence_settings">Eskuragarritasuna</string>
|
||||
<string name="pref_away_when_screen_off">Urrun pantaila itzalita dagoenean</string>
|
||||
<string name="pref_away_when_screen_off_summary">Zure baliabidea urrun bezala markatzen du pantaila itzalita dagoenean</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Ez gogaitu\" modu isilean</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Zure baliabidea \"Ez gogaitu\" bezala markatzen du gailua modu isilean dagoenean</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Dardara modu isila bezala tratatu</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Zure baliabidea \"Ez gogaitu\" bezala markatzen du gailua dardara moduan dagoenean</string>
|
||||
<string name="pref_show_connection_options">Konexioaren ezarpen luzatuak</string>
|
||||
<string name="pref_show_connection_options_summary">Ostalariaren izena eta ataka ezarpenak erakutsi kontu bat ezartzerakoan</string>
|
||||
<string name="hostname_example">xmpp.adibidea.com</string>
|
||||
|
|
|
@ -460,11 +460,7 @@
|
|||
<string name="server_info_broken">Détraqué</string>
|
||||
<string name="pref_presence_settings">Disponibilité</string>
|
||||
<string name="pref_away_when_screen_off">Absent quand l\'écran est éteint</string>
|
||||
<string name="pref_away_when_screen_off_summary">Marquer cette ressource comme absente quand l\'écran est éteint.</string>
|
||||
<string name="pref_dnd_on_silent_mode">Indisponible en mode silencieux</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Marquer cette ressource comme Indisponible quand l\'appareil est en mode silencieux</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Indisponible en mode vibreur</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Marquer cette ressource comme Indisponible quand l\'appareil est en mode vibreur</string>
|
||||
<string name="pref_show_connection_options">Paramètres de connexion avancés</string>
|
||||
<string name="pref_show_connection_options_summary">Montrer le nom d\'hôte et le port lors du paramétrage d\'un compte</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -461,11 +461,11 @@
|
|||
<string name="server_info_broken">Roto</string>
|
||||
<string name="pref_presence_settings">Disponibilidade</string>
|
||||
<string name="pref_away_when_screen_off">Non dispoñible cando se apaga a pantalla</string>
|
||||
<string name="pref_away_when_screen_off_summary">Marca o seu recurso como non dipoñíble cando se apaga a pantalla</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Non molestar\" en modo silencioso</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Marca o seu recurso como \"Non molestar\" cando o dispositivo está en modo silencioso</string>
|
||||
<string name="pref_away_when_screen_off_summary">Mostrar como Fóra cando se apaga a pantalla</string>
|
||||
<string name="pref_dnd_on_silent_mode">En modolo silencioso, Ocupado</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Mostrar como Ocupado se o dispositivo está en silencio</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Trata a vibración como modo silencioso</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Marca o seu recurso como \"Non molestar\" cando o dispositivo está en modo vibración</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Mostrar como Ocupado cando o dispositivo está en vibración</string>
|
||||
<string name="pref_show_connection_options">Axustes ampliados de conexión</string>
|
||||
<string name="pref_show_connection_options_summary">Mostar axustes de servidor e porto cando se configura unha conta</string>
|
||||
<string name="hostname_example">xmpp.exemplo.com</string>
|
||||
|
@ -923,6 +923,8 @@
|
|||
<string name="could_not_switch_camera">Non se puido activar a cámara</string>
|
||||
<string name="add_to_favorites">Engadir a favoritas</string>
|
||||
<string name="remove_from_favorites">Eliminar das favoritas</string>
|
||||
<string name="gpx_track">Ruta GPX</string>
|
||||
<string name="could_not_correct_message">No se pode correxir a mensaxe</string>
|
||||
<plurals name="view_users">
|
||||
<item quantity="one">Ver %1$d Participante</item>
|
||||
<item quantity="other">Ver %1$d Participantes</item>
|
||||
|
|
|
@ -443,11 +443,7 @@
|
|||
<string name="server_info_broken">Törött</string>
|
||||
<string name="pref_presence_settings">Elérhetőség</string>
|
||||
<string name="pref_away_when_screen_off">„Távol”, ha a kijelző ki van kapcsolva</string>
|
||||
<string name="pref_away_when_screen_off_summary">„Távol” állapotként jelöli az erőforrást, ha a kijelző ki van kapcsolva</string>
|
||||
<string name="pref_dnd_on_silent_mode">„Ne zavarjon” csendes módban</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">„Ne zavarjon” állapotként jelöli az erőforrást, ha az eszköz csendes módban van</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Rezgés kezelése csendes módként</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">„Ne zavarjon” állapotként jelöli az erőforrást, ha az eszköz rezgő módban van</string>
|
||||
<string name="pref_show_connection_options">Kiterjesztett kapcsolati beállítások</string>
|
||||
<string name="pref_show_connection_options_summary">Gépnév és port beállításainak megjelenítése egy fiók beállításakor</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -401,6 +401,7 @@
|
|||
<string name="mark_as_read">Segna come già letto</string>
|
||||
<string name="pref_input_options">Input</string>
|
||||
<string name="pref_enter_is_send">Invio spedisce</string>
|
||||
<string name="pref_enter_is_send_summary">Usa il tasto Invio per spedire il messaggio. Puoi sempre usare Ctrl+Invio per spedire, anche se questa opzione è disattivata.</string>
|
||||
<string name="pref_display_enter_key">Mostra il tasto invio</string>
|
||||
<string name="pref_display_enter_key_summary">Cambia il tasto delle faccine nel tasto di invio</string>
|
||||
<string name="audio">audio</string>
|
||||
|
@ -460,11 +461,7 @@
|
|||
<string name="server_info_broken">Rotto</string>
|
||||
<string name="pref_presence_settings">Disponibilità</string>
|
||||
<string name="pref_away_when_screen_off">\"Non disponibile\" a schermo spento</string>
|
||||
<string name="pref_away_when_screen_off_summary">Imposta la tua risorsa come non disponibile quando lo schermo è spento</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Non disturbare\" in modalità silenziosa</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Segna la tua risorsa come \"Non disturbare\" quando il dispositivo è in modalità silenziosa</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Tratta vibrazione come modalità silenziosa</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Segna la tua risorsa come \"Non disturbare\" quando il dispositivo ha solo la vibrazione</string>
|
||||
<string name="pref_show_connection_options">Impostazioni estese di connessione</string>
|
||||
<string name="pref_show_connection_options_summary">Mostra nome host e impostazioni della porta quando configuri un account</string>
|
||||
<string name="hostname_example">xmpp.esempio.it</string>
|
||||
|
@ -915,6 +912,7 @@
|
|||
<string name="audio_call">Chiamata vocale</string>
|
||||
<string name="video_call">Chiamata video</string>
|
||||
<string name="help">Aiuto</string>
|
||||
<string name="switch_to_conversation">Passa alla conversazione</string>
|
||||
<string name="microphone_unavailable">Il tuo microfono non è disponibile</string>
|
||||
<string name="only_one_call_at_a_time">Puoi fare solo una chiamata alla volta.</string>
|
||||
<string name="return_to_ongoing_call">Torna alla chiamata in corso</string>
|
||||
|
|
|
@ -266,7 +266,6 @@
|
|||
<string name="download_failed_could_not_connect">ההורדה נכשלה: נכשל ביצוע חיבור לשרת</string>
|
||||
<string name="server_info_broken">לא עובד</string>
|
||||
<string name="pref_away_when_screen_off">העבר למצב \"לא נמצא\" כאשר המסך כבוי</string>
|
||||
<string name="pref_away_when_screen_off_summary">מעביר את המכשיר לסטטוס \"לא נמצא\" כאשר המסך כבוי</string>
|
||||
<string name="action_renew_certificate">חידוש תעודה</string>
|
||||
<string name="error_fetching_omemo_key">שגיאה בתפיסת OMEMO!</string>
|
||||
<string name="pref_use_tor">התחבר דרך Tor</string>
|
||||
|
|
|
@ -367,11 +367,7 @@
|
|||
<string name="server_info_broken">壊れています</string>
|
||||
<string name="pref_presence_settings">可用性</string>
|
||||
<string name="pref_away_when_screen_off">画面がオフのときは離席</string>
|
||||
<string name="pref_away_when_screen_off_summary">画面がオフになっているとき、リソースを離席としてマークします</string>
|
||||
<string name="pref_dnd_on_silent_mode">サイレントモード時 “邪魔しないで”</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">デバイスがサイレントモードの時に、リソースを “邪魔しないで” としてマークします</string>
|
||||
<string name="pref_treat_vibrate_as_silent">バイブレートをサイレントモードとして扱う</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">デバイスがバイブレートの時に、リソースを “邪魔しないで” としてマークします</string>
|
||||
<string name="pref_show_connection_options">拡張接続設定</string>
|
||||
<string name="pref_show_connection_options_summary">アカウントを設定するときにホスト名とポートの設定を表示します</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -306,7 +306,6 @@
|
|||
<string name="account_status_bind_failure">바인드 실패</string>
|
||||
<string name="server_info_broken">손상됨</string>
|
||||
<string name="pref_away_when_screen_off">화면이 꺼져있을 경우 자리 비움으로 표시</string>
|
||||
<string name="pref_away_when_screen_off_summary">화면이 꺼져있을 경우에 자리 비움으로 상태를 표시함</string>
|
||||
<string name="pref_treat_vibrate_as_silent">진동을 자동으로 처리</string>
|
||||
<string name="pref_show_connection_options">확장 연결 설정</string>
|
||||
<string name="pref_show_connection_options_summary">계정을 설정할 때 호스트 이름과 포트 설정을 표시합니다</string>
|
||||
|
|
|
@ -335,11 +335,7 @@
|
|||
<string name="account_status_bind_failure">Klarte ikke å binde</string>
|
||||
<string name="server_info_broken">Knekt</string>
|
||||
<string name="pref_away_when_screen_off">Borte når skjermen er av</string>
|
||||
<string name="pref_away_when_screen_off_summary">Markerer din ressurs som borte når skjermen er avskrudd</string>
|
||||
<string name="pref_dnd_on_silent_mode">“Ikke forstyrr” i stillemodus.</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Merker din ressurs som \"Ikke forstyrr\" når enheten er i stillemodus.</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Behandle vibrering som stille-modus</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Merker din ressurs som \"Ikke forstyrr\" når enheten er skrudd til vibrering</string>
|
||||
<string name="pref_show_connection_options">Utvidede tilkoblingsinnst.</string>
|
||||
<string name="pref_show_connection_options_summary">Vis vertsnavn og portinnstillinger når du setter opp en ny konto</string>
|
||||
<string name="hostname_example">xmpp.eksempel.no</string>
|
||||
|
|
|
@ -411,11 +411,7 @@
|
|||
<string name="server_info_broken">Gebroken</string>
|
||||
<string name="pref_presence_settings">Aanwezigheid</string>
|
||||
<string name="pref_away_when_screen_off">Even weg wanneer scherm uit staat</string>
|
||||
<string name="pref_away_when_screen_off_summary">Stelt je bron in als even weg wanneer het scherm uitgeschakeld is</string>
|
||||
<string name="pref_dnd_on_silent_mode">“Niet storen” in stille modus</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Stelt je bron in als “Niet storen” wanneer je apparaat in stille modus staat</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Trillen behandelen als stille modus</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Stelt je bron in als “Niet storen” wanneer je apparaat in trilmodus staat</string>
|
||||
<string name="pref_show_connection_options">Uitgebreide verbindingsinstellingen</string>
|
||||
<string name="pref_show_connection_options_summary">Toon hostnaam- en poortinstellingen bij instellen van een account</string>
|
||||
<string name="hostname_example">xmpp.voorbeeld.be</string>
|
||||
|
|
|
@ -462,11 +462,7 @@
|
|||
<string name="server_info_broken">Zepsute</string>
|
||||
<string name="pref_presence_settings">Dostępność</string>
|
||||
<string name="pref_away_when_screen_off">Status \"Oddalony\" gdy wyświetlacz jest wyłączony</string>
|
||||
<string name="pref_away_when_screen_off_summary">Oznacza twój zasób jako \"Oddalony\", gdy wyświetlacz jest wyłączony</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Nie przeszkadzać\" w trybie cichym</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Oznacza twój zasób jako \"Nie przeszkadzać\", gdy urządzenie jest w trybie cichym</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Traktuj tryb wibracji jak tryb cichy</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Oznacza twój zasób jako \"Nie przeszkadzać\", gdy urządzenie jest w trybie wibracji</string>
|
||||
<string name="pref_show_connection_options">Rozszerzone ustawienia połączenia</string>
|
||||
<string name="pref_show_connection_options_summary">Pokaż nazwę hosta i ustawienia portu przy dodawaniu konta</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -401,6 +401,7 @@
|
|||
<string name="mark_as_read">Marcar como lida</string>
|
||||
<string name="pref_input_options">Entrada</string>
|
||||
<string name="pref_enter_is_send">Enter envia</string>
|
||||
<string name="pref_enter_is_send_summary">Use a tecla Enter para enviar mensagens. Você sempre pode usar Ctrl+Enter para enviar mensagens, mesmo se essa opção estiver desabilitada.</string>
|
||||
<string name="pref_display_enter_key">Exibir o botão Enter</string>
|
||||
<string name="pref_display_enter_key_summary">Altera o botão de emoticons para um botão Enter.</string>
|
||||
<string name="audio">áudio</string>
|
||||
|
@ -459,12 +460,12 @@
|
|||
<string name="account_status_host_unknown">O servidor não responde por esse domínio</string>
|
||||
<string name="server_info_broken">Quebrado</string>
|
||||
<string name="pref_presence_settings">Disponibilidade</string>
|
||||
<string name="pref_away_when_screen_off">Afastado quando a tela estiver desligada</string>
|
||||
<string name="pref_away_when_screen_off_summary">Define o seu status como afastado quando a tela estiver desligada.</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Não perturbe\" em modo silencioso</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Define o seu status como \"Não perturbe\" quando o dispositivo estiver em modo silencioso</string>
|
||||
<string name="pref_away_when_screen_off">\"Afastado\" quando a tela estiver desligada</string>
|
||||
<string name="pref_away_when_screen_off_summary">Exibe como Afastado quando a tela for desligada</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Ocupado\" no modo silencioso</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Exibe como Ocupado quando o dispositivo estiver em modo silencioso</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Considerar o modo de vibração como silencioso</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Define o seu status como \"Não perturbe\" quando o dispositivo estiver no modo de vibração</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Exibe como Ocupado quando o dispositivo estiver em vibratório</string>
|
||||
<string name="pref_show_connection_options">Configurações detalhadas da conexão</string>
|
||||
<string name="pref_show_connection_options_summary">Exibe o nome de host e configurações da porta ao configurar uma conta.</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
@ -900,6 +901,7 @@
|
|||
<string name="rtp_state_ringing">Tocando</string>
|
||||
<string name="rtp_state_declined_or_busy">Ocupado</string>
|
||||
<string name="rtp_state_connectivity_error">Não foi possível conectar à chamada</string>
|
||||
<string name="rtp_state_connectivity_lost_error">Conexão perdida</string>
|
||||
<string name="rtp_state_retracted">Chamada rejeitada</string>
|
||||
<string name="rtp_state_application_failure">Falha no aplicativo</string>
|
||||
<string name="hang_up">Desligar</string>
|
||||
|
@ -913,12 +915,16 @@
|
|||
<string name="missed_call">Chamada perdida</string>
|
||||
<string name="audio_call">Chamada de áudio</string>
|
||||
<string name="video_call">Chamada de vídeo</string>
|
||||
<string name="help">Ajuda</string>
|
||||
<string name="switch_to_conversation">Alternar para a conversa</string>
|
||||
<string name="microphone_unavailable">Seu microfone não está disponível</string>
|
||||
<string name="only_one_call_at_a_time">Você só pode ter uma chamada de cada vez</string>
|
||||
<string name="return_to_ongoing_call">Retornar para a chamada em andamento</string>
|
||||
<string name="could_not_switch_camera">Não foi possível trocar a câmera</string>
|
||||
<string name="add_to_favorites">Adicionar aos favoritos</string>
|
||||
<string name="remove_from_favorites">Remover dos favoritos</string>
|
||||
<string name="gpx_track">Trilha GPX</string>
|
||||
<string name="could_not_correct_message">Não foi possível corrigir a mensagem</string>
|
||||
<plurals name="view_users">
|
||||
<item quantity="one">Ver %1$d participante</item>
|
||||
<item quantity="other">Ver %1$d participantes</item>
|
||||
|
|
|
@ -330,8 +330,6 @@
|
|||
<string name="server_info_broken">Existe um problema</string>
|
||||
<string name="pref_presence_settings">Disponibilidade</string>
|
||||
<string name="pref_away_when_screen_off">Ausente quando o ecrã está desligado</string>
|
||||
<string name="pref_away_when_screen_off_summary">Define o seu recurso como ausente quando o ecrã está desligado</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Não incomodar\" em modo silencioso</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Tratar vibrar como modo silencioso</string>
|
||||
<string name="pref_show_connection_options">Definições de conexão</string>
|
||||
<string name="pref_show_connection_options_summary">Mostrar as definições do hostname e do porto ao configurar uma conta</string>
|
||||
|
|
|
@ -463,10 +463,10 @@
|
|||
<string name="pref_presence_settings">Setări de disponibilitate</string>
|
||||
<string name="pref_away_when_screen_off">Plecat când ecranul este oprit</string>
|
||||
<string name="pref_away_when_screen_off_summary">Prezintă clientul drept \"Plecat\" atunci când ecranul este oprit</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Nu deranja\" în modul silențios</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Prezintă clientul drept \"Nu deranja\" atunci când dispozitivul este în mod silențios</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Ocupat\" în modul silențios</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Prezintă clientul drept \"Ocupat\" atunci când dispozitivul este în mod silențios</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Tratează modul vibrație ca silențios</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Prezintă clientul drept \"Nu deranja\" atunci când dispozitivul este în mod vibrație</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Prezintă clientul drept \"Ocupat\" atunci când dispozitivul este în mod vibrație</string>
|
||||
<string name="pref_show_connection_options">Opțiuni avansate conexiune</string>
|
||||
<string name="pref_show_connection_options_summary">Arată opțiunea de setare a numelui de gazdă și a portului, atunci când se configurează un cont</string>
|
||||
<string name="hostname_example">xmpp.exemplu.ro</string>
|
||||
|
@ -931,6 +931,8 @@
|
|||
<string name="could_not_switch_camera">Nu s-a putut face comutarea camerei foto</string>
|
||||
<string name="add_to_favorites">Adaugă la favorite</string>
|
||||
<string name="remove_from_favorites">Înlătură din favorite</string>
|
||||
<string name="gpx_track">Traseu GPX</string>
|
||||
<string name="could_not_correct_message">Nu s-a putut corecta mesajul</string>
|
||||
<plurals name="view_users">
|
||||
<item quantity="one">Arată %1$d participant</item>
|
||||
<item quantity="few">Arată %1$d participanți</item>
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
<string name="change_password_on_server">Изменить пароль на сервере</string>
|
||||
<string name="share_with">Поделиться с</string>
|
||||
<string name="start_conversation">Начать беседу</string>
|
||||
<string name="invite_contact">Пригласить собеседника</string>
|
||||
<string name="invite_contact">Пригласить контакт</string>
|
||||
<string name="invite">Пригласить</string>
|
||||
<string name="contacts">Контакты</string>
|
||||
<string name="contact">Контакт</string>
|
||||
|
@ -298,6 +298,8 @@
|
|||
<string name="hosted_on">размещено на %s</string>
|
||||
<string name="checking_x">Проверка %s на сервере HTTP</string>
|
||||
<string name="not_connected_try_again">Вы неподключены. Попробуйте позже</string>
|
||||
<string name="check_x_filesize">Проверить размер %s</string>
|
||||
<string name="check_x_filesize_on_host">Проверить размер %1$s на %2$s</string>
|
||||
<string name="message_options">Опции сообщения</string>
|
||||
<string name="quote">Цитировать</string>
|
||||
<string name="paste_as_quote">Вставить как цитату</string>
|
||||
|
@ -399,6 +401,7 @@
|
|||
<string name="mark_as_read">Прочитано</string>
|
||||
<string name="pref_input_options">Ввод</string>
|
||||
<string name="pref_enter_is_send">Отправить на \"Enter\"</string>
|
||||
<string name="pref_enter_is_send_summary">Отправлять сообщения клавишей Enter. Даже если эта опция отключена, сообщение можно отправить, нажав Ctrl+Enter.</string>
|
||||
<string name="pref_display_enter_key">Показывать клавишу ввода</string>
|
||||
<string name="pref_display_enter_key_summary">Поменять кнопку смайликов на кнопку ввода</string>
|
||||
<string name="audio">аудио</string>
|
||||
|
@ -460,11 +463,7 @@
|
|||
<string name="server_info_broken">Повреждено</string>
|
||||
<string name="pref_presence_settings">Доступность</string>
|
||||
<string name="pref_away_when_screen_off">\"Отошёл\" когда экран выключен</string>
|
||||
<string name="pref_away_when_screen_off_summary">Устанавливает статус \"Отошёл\", когда экран выключен</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Не беспокоить\" в беззвучном режиме</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Устанавливает статус \"Не беспокоить\", когда устройство в беззвучном режиме</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Не доступен в режиме вибрации</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Устанавливает статус \"Не беспокоить\", когда устройство на вибрации</string>
|
||||
<string name="pref_show_connection_options">Расширенные настройки подключения</string>
|
||||
<string name="pref_show_connection_options_summary">Показывать имя сервера и порт в настройках аккаунтов</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -349,11 +349,7 @@
|
|||
<string name="server_info_broken">Оштећен</string>
|
||||
<string name="pref_presence_settings">Доступност</string>
|
||||
<string name="pref_away_when_screen_off">Одсутан кад је екран искључен</string>
|
||||
<string name="pref_away_when_screen_off_summary">Означавање вашег ресурса као одсутан кад је екран искључен</string>
|
||||
<string name="pref_dnd_on_silent_mode">„Не ометај“ у нечујном режиму</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Означавање вашег ресурса као „не ометај“ кад је уређај у нечујном режиму</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Вибрација је нечујни режим</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Означавање вашег ресурса као „не ометај“ кад је уређај у режиму вибрирања</string>
|
||||
<string name="pref_show_connection_options">Проширене поставке повезивања</string>
|
||||
<string name="pref_show_connection_options_summary">Приказ домаћина и порта у поставкама налога</string>
|
||||
<string name="hostname_example">xmpp.primer.com</string>
|
||||
|
|
|
@ -370,8 +370,6 @@
|
|||
<string name="server_info_broken">Sönder</string>
|
||||
<string name="pref_presence_settings">Tillgänglighet</string>
|
||||
<string name="pref_away_when_screen_off">Status borta när skärmen är av</string>
|
||||
<string name="pref_away_when_screen_off_summary">Sätter din tillgänglighet till borta när skrämen är av</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Stör ej\" i tyst läge</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Hantera vibrationsläge som tyst läge</string>
|
||||
<string name="pref_show_connection_options">Utökade anslutningsinställningar</string>
|
||||
<string name="pref_show_connection_options_summary">Visa val av servernamn och port vid inställning av konto</string>
|
||||
|
|
|
@ -321,7 +321,6 @@
|
|||
<string name="account_status_bind_failure">Bağlantı başarısız</string>
|
||||
<string name="server_info_broken">Bozuk</string>
|
||||
<string name="pref_away_when_screen_off">Ekran kapandığında uzakta</string>
|
||||
<string name="pref_away_when_screen_off_summary">Ekran kapandığında çevrim içi durum bildiriminizi uzakta olarak değiştirir</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Titreşim kipini sessiz kip olarak değerlendir</string>
|
||||
<string name="pref_show_connection_options">Genişletilmiş bağlantı seçenekleri</string>
|
||||
<string name="pref_show_connection_options_summary">Hesap oluştururken sunucu adıyla bağlantı noktası seçeneğini göster</string>
|
||||
|
|
|
@ -367,7 +367,7 @@
|
|||
<string name="enable_all_accounts">Увімкнути всі облікові записи</string>
|
||||
<string name="disable_all_accounts">Вимкнути всі облікові записи</string>
|
||||
<string name="perform_action_with">Здійснити дію з</string>
|
||||
<string name="no_affiliation">Непов\'язаний</string>
|
||||
<string name="no_affiliation">Учасник</string>
|
||||
<string name="no_role">Поза мережею</string>
|
||||
<string name="outcast">Вигнанець</string>
|
||||
<string name="member">Учасник</string>
|
||||
|
@ -380,7 +380,7 @@
|
|||
<string name="remove_owner_privileges">Відкликати права власника</string>
|
||||
<string name="remove_from_room">Вилучити з групи</string>
|
||||
<string name="remove_from_channel">Прибрати з каналу</string>
|
||||
<string name="could_not_change_affiliation">Неможливо змінити статус приєднання з %s</string>
|
||||
<string name="could_not_change_affiliation">Неможливо змінити статус участі %s</string>
|
||||
<string name="ban_from_conference">Заборонити доступ до групи</string>
|
||||
<string name="ban_from_channel">Вилучити з каналу</string>
|
||||
<string name="removing_from_public_conference">Ви намагаєтеся вилучити %s з публічного каналу. Єдиним способом для цього є заблокувати користувача назавжди.</string>
|
||||
|
@ -401,6 +401,7 @@
|
|||
<string name="mark_as_read">Позначити як прочитане</string>
|
||||
<string name="pref_input_options">Введення</string>
|
||||
<string name="pref_enter_is_send">Enter для надсилання</string>
|
||||
<string name="pref_enter_is_send_summary">Використовувати кнопку Enter для надсилання повідомлень. Якщо цей параметр вимкнено, повідомлення можна надсилати за допомогою комбінації Ctrl-Enter. </string>
|
||||
<string name="pref_display_enter_key">Показувати кнопку Enter</string>
|
||||
<string name="pref_display_enter_key_summary">Змінити клавішу емоційок на кнопку Enter</string>
|
||||
<string name="audio">аудіо</string>
|
||||
|
@ -462,11 +463,7 @@
|
|||
<string name="server_info_broken">Поламано</string>
|
||||
<string name="pref_presence_settings">Доступність</string>
|
||||
<string name="pref_away_when_screen_off">Відійшов, якщо екран вимкнено</string>
|
||||
<string name="pref_away_when_screen_off_summary">Показувати стан \"відійшов\", якщо екран вимкнено</string>
|
||||
<string name="pref_dnd_on_silent_mode">\"Не турбувати\" в режимі тиші</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Додавати \"Не турбувати\" до імені вашого пристрою, коли пристрій в режимі тиші</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Вважати вібро за безшумний режим</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Додавати \"Не турбувати\" до імені вашого пристрою, коли пристрій в режимі вібрації</string>
|
||||
<string name="pref_show_connection_options">Розширені налаштування з\'єднання</string>
|
||||
<string name="pref_show_connection_options_summary">Показати налаштування імені вузла та порту при налаштуванні облікового запису</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
|
|
@ -290,7 +290,6 @@
|
|||
<string name="account_status_tor_unavailable">Mạng Tor chưa sẵn sàng</string>
|
||||
<string name="server_info_broken">Bị hỏng</string>
|
||||
<string name="pref_away_when_screen_off">Vắng mặt khi màn hình tắt</string>
|
||||
<string name="pref_away_when_screen_off_summary">Hiện ứng dụng là \'vắng mặt\' khi màn hình tắt</string>
|
||||
<string name="action_renew_certificate">Gia hạn chứng nhận</string>
|
||||
<string name="error_fetching_omemo_key">Lỗi nhập khoá OMEMO!</string>
|
||||
<string name="verified_omemo_key_with_certificate">Khoá OMEMO đã xác minh với chứng nhận!</string>
|
||||
|
|
|
@ -401,6 +401,7 @@
|
|||
<string name="mark_as_read">标记为已读</string>
|
||||
<string name="pref_input_options">输入</string>
|
||||
<string name="pref_enter_is_send">点击回车发送</string>
|
||||
<string name="pref_enter_is_send_summary">使用Enter键发送消息。即使禁用此选项,也可以使用Ctrl+Enter发送消息。</string>
|
||||
<string name="pref_display_enter_key">显示回车键</string>
|
||||
<string name="pref_display_enter_key_summary">将表情键改为回车键</string>
|
||||
<string name="audio">音频</string>
|
||||
|
@ -459,11 +460,7 @@
|
|||
<string name="server_info_broken">损坏</string>
|
||||
<string name="pref_presence_settings">可用性</string>
|
||||
<string name="pref_away_when_screen_off">锁屏时显示离开</string>
|
||||
<string name="pref_away_when_screen_off_summary">锁屏时标记为离开状态</string>
|
||||
<string name="pref_dnd_on_silent_mode">静音模式时设为“请勿打扰”</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">当设备静音时标记为“请勿打扰”状态</string>
|
||||
<string name="pref_treat_vibrate_as_silent">将振动看作静音</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">使用振动模式时标记为“请勿打扰”状态</string>
|
||||
<string name="pref_show_connection_options">高级连接设置</string>
|
||||
<string name="pref_show_connection_options_summary">注册账户时显示主机名和端口</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
@ -907,6 +904,7 @@
|
|||
<string name="audio_call">语音通话</string>
|
||||
<string name="video_call">视频通话</string>
|
||||
<string name="help">帮助</string>
|
||||
<string name="switch_to_conversation">切换到对话</string>
|
||||
<string name="microphone_unavailable">麦克风不可用</string>
|
||||
<string name="only_one_call_at_a_time">只能同时打一通电话</string>
|
||||
<string name="return_to_ongoing_call">返回正在进行的通话</string>
|
||||
|
|
|
@ -309,7 +309,6 @@
|
|||
<string name="account_status_bind_failure">綁定失敗</string>
|
||||
<string name="server_info_broken">損壞</string>
|
||||
<string name="pref_away_when_screen_off">關閉螢幕時離開</string>
|
||||
<string name="pref_away_when_screen_off_summary">當螢幕關閉時將標記您的資源為離開狀態</string>
|
||||
<string name="pref_treat_vibrate_as_silent">靜音模式開啟振動</string>
|
||||
<string name="pref_show_connection_options">高級連接設置</string>
|
||||
<string name="pref_show_connection_options_summary">註冊帳戶時顯示主機名稱和埠</string>
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
<attr name="media_preview_recording" format="reference" />
|
||||
<attr name="media_preview_audio" format="reference" />
|
||||
<attr name="media_preview_location" format="reference" />
|
||||
<attr name="media_preview_tour" format="reference" />
|
||||
<attr name="media_preview_contact" format="reference" />
|
||||
<attr name="media_preview_app" format="reference" />
|
||||
<attr name="media_preview_calendar" format="reference" />
|
||||
|
|
|
@ -461,11 +461,11 @@
|
|||
<string name="server_info_broken">Broken</string>
|
||||
<string name="pref_presence_settings">Availability</string>
|
||||
<string name="pref_away_when_screen_off">Away when screen is off</string>
|
||||
<string name="pref_away_when_screen_off_summary">Marks your resource as away when the screen is turned off</string>
|
||||
<string name="pref_dnd_on_silent_mode">“Do not disturb” in silent mode</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Marks your resource as “Do not disturb” when device is in silent mode</string>
|
||||
<string name="pref_away_when_screen_off_summary">Show as Away when the screen is turned off</string>
|
||||
<string name="pref_dnd_on_silent_mode">Busy in silent mode</string>
|
||||
<string name="pref_dnd_on_silent_mode_summary">Show as Busy when device is in silent mode</string>
|
||||
<string name="pref_treat_vibrate_as_silent">Treat vibrate as silent mode</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Marks your resource as “Do not disturb” when device is on vibrate</string>
|
||||
<string name="pref_treat_vibrate_as_dnd_summary">Show as Busy when device is on vibrate</string>
|
||||
<string name="pref_show_connection_options">Extended connection settings</string>
|
||||
<string name="pref_show_connection_options_summary">Show hostname and port settings when setting up an account</string>
|
||||
<string name="hostname_example">xmpp.example.com</string>
|
||||
|
@ -925,6 +925,8 @@
|
|||
<string name="could_not_switch_camera">Could not switch camera</string>
|
||||
<string name="add_to_favorites">Add to favorites</string>
|
||||
<string name="remove_from_favorites">Remove from favorites</string>
|
||||
<string name="gpx_track">GPX track</string>
|
||||
<string name="could_not_correct_message">Could not correct message</string>
|
||||
<plurals name="view_users">
|
||||
<item quantity="one">View %1$d Participant</item>
|
||||
<item quantity="other">View %1$d Participants</item>
|
||||
|
|
|
@ -85,6 +85,7 @@
|
|||
<item name="media_preview_recording" type="reference">@drawable/ic_mic_black_48dp</item>
|
||||
<item name="media_preview_audio" type="reference">@drawable/ic_headset_black_48dp</item>
|
||||
<item name="media_preview_location" type="reference">@drawable/ic_room_black_48dp</item>
|
||||
<item name="media_preview_tour" type="reference">@drawable/baseline_tour_black_48</item>
|
||||
<item name="media_preview_contact" type="reference">@drawable/ic_person_black_48dp</item>
|
||||
<item name="media_preview_app" type="reference">@drawable/ic_android_black_48dp</item>
|
||||
<item name="media_preview_calendar" type="reference">@drawable/ic_event_black_48dp</item>
|
||||
|
@ -240,6 +241,7 @@
|
|||
<item name="media_preview_recording" type="reference">@drawable/ic_mic_white_48dp</item>
|
||||
<item name="media_preview_audio" type="reference">@drawable/ic_headset_white_48dp</item>
|
||||
<item name="media_preview_location" type="reference">@drawable/ic_room_white_48dp</item>
|
||||
<item name="media_preview_tour" type="reference">@drawable/baseline_tour_white_48</item>
|
||||
<item name="media_preview_contact" type="reference">@drawable/ic_person_white_48dp</item>
|
||||
<item name="media_preview_app" type="reference">@drawable/ic_android_white_48dp</item>
|
||||
<item name="media_preview_calendar" type="reference">@drawable/ic_event_white_48dp</item>
|
||||
|
|