diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28bf27656..ae267086e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
###Changelog
+####Version 1.3.0
+* swipe conversations to end them
+* quickly enable / disable account via slider
+* share multiple images at once
+* expert option to distrust system CAs
+* mlink compatibility
+* bug fixes
+
####Version 1.2.0
* Send current location. (requires [plugin](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation))
* Invite multiple contacts at once
diff --git a/README.md b/README.md
index ac075fd3f..5519e47f6 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Conversations: the very last word in instant messaging
-[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations)
+[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) [![Amazon App Store](https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png)](http://www.amazon.com/dp/B00WD35AAC/)
![screenshots](https://raw.githubusercontent.com/siacs/Conversations/master/screenshots.png)
@@ -17,7 +17,8 @@ Conversations: the very last word in instant messaging
## Features
* End-to-end encryption with either [OTR](https://otr.cypherpunks.ca/) or [OpenPGP](http://www.openpgp.org/about_openpgp/)
-* Sending and receiving images
+* Send and receive images as well as other kind of files
+* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation)
* Indication when your contact has read your message
* Intuitive UI that follows Android Design guidelines
* Pictures / Avatars for your Contacts
diff --git a/build.gradle b/build.gradle
index 8f7bb914a..a4062ec32 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,6 +34,7 @@ dependencies {
compile 'com.google.zxing:core:3.1.0'
compile 'com.google.zxing:android-integration:3.1.0'
compile 'de.measite.minidns:minidns:0.1.3'
+ compile 'de.timroes.android:EnhancedListView:0.3.4'
}
android {
@@ -43,8 +44,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
- versionCode 56
- versionName "1.2.0"
+ versionCode 60
+ versionName "1.3.0"
}
compileOptions {
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index e4e91d801..9fe370171 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -122,6 +122,13 @@
+
+
+
+
+
+
+
0) {
- filename = pathParts[pathParts.length - 1].toLowerCase();
- } else {
- return false;
- }
- String[] extensionParts = filename.split("\\.");
+
+ int iSlashIndex = sUrlPath.lastIndexOf('/') + 1;
+
+ String sLastUrlPath = sUrlPath.substring(iSlashIndex).toLowerCase();
+
+ String[] extensionParts = sLastUrlPath.split("\\.");
if (extensionParts.length == 2
&& Arrays.asList(Downloadable.VALID_IMAGE_EXTENSIONS).contains(
extensionParts[extensionParts.length - 1])) {
diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java
index 8f6a90b99..474a3e1dc 100644
--- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java
+++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java
@@ -71,6 +71,7 @@ public class MessageGenerator extends AbstractGenerator {
MessagePacket packet = preparePacket(message, addDelay);
packet.addChild("private", "urn:xmpp:carbons:2");
packet.addChild("no-copy", "urn:xmpp:hints");
+ packet.addChild("no-permanent-store", "urn:xmpp:hints");
try {
packet.setBody(otrSession.transformSending(message.getBody())[0]);
return packet;
@@ -172,7 +173,7 @@ public class MessageGenerator extends AbstractGenerator {
return receivedPacket;
}
- public MessagePacket generateOtrError(Jid to, String id) {
+ public MessagePacket generateOtrError(Jid to, String id, String errorText) {
MessagePacket packet = new MessagePacket();
packet.setType(MessagePacket.TYPE_ERROR);
packet.setAttribute("id",id);
@@ -181,7 +182,7 @@ public class MessageGenerator extends AbstractGenerator {
error.setAttribute("code","406");
error.setAttribute("type","modify");
error.addChild("not-acceptable","urn:ietf:params:xml:ns:xmpp-stanzas");
- error.addChild("text").setContent("unreadable OTR message received");
+ error.addChild("text").setContent("?OTR Error:" + errorText);
return packet;
}
}
diff --git a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java
index 1e8967244..526005f33 100644
--- a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java
+++ b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java
@@ -54,4 +54,11 @@ public class PresenceGenerator extends AbstractGenerator {
}
return packet;
}
+
+ public PresencePacket sendOfflinePresence(Account account) {
+ PresencePacket packet = new PresencePacket();
+ packet.setFrom(account.getJid());
+ packet.setAttribute("type","unavailable");
+ return packet;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
index 8ae9b642a..76d014688 100644
--- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
@@ -391,15 +391,17 @@ public class MessageParser extends AbstractParser implements
private void parseNonMessage(Element packet, Account account) {
final Jid from = packet.getAttributeAsJid("from");
+ if (account.getJid().equals(from)) {
+ return;
+ }
if (extractChatState(from == null ? null : mXmppConnectionService.find(account,from), packet)) {
mXmppConnectionService.updateConversationUi();
}
- Element invite = extractInvite(packet);
- if (invite != null) {
- Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, from, true);
+ Invite invite = extractInvite(packet);
+ if (invite != null && invite.jid != null) {
+ Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, invite.jid, true);
if (!conversation.getMucOptions().online()) {
- Element password = invite.findChild("password");
- conversation.getMucOptions().setPassword(password == null ? null : password.getContent());
+ conversation.getMucOptions().setPassword(invite.password);
mXmppConnectionService.databaseBackend.updateConversation(conversation);
mXmppConnectionService.joinMuc(conversation);
mXmppConnectionService.updateConversationUi();
@@ -439,16 +441,30 @@ public class MessageParser extends AbstractParser implements
}
}
- private Element extractInvite(Element message) {
+ private class Invite {
+ Jid jid;
+ String password;
+ Invite(Jid jid, String password) {
+ this.jid = jid;
+ this.password = password;
+ }
+ }
+
+ private Invite extractInvite(Element message) {
Element x = message.findChild("x","http://jabber.org/protocol/muc#user");
- if (x == null) {
- x = message.findChild("x","jabber:x:conference");
- }
- if (x != null && x.hasChild("invite")) {
- return x;
+ if (x != null) {
+ Element invite = x.findChild("invite");
+ if (invite != null) {
+ Element pw = x.findChild("password");
+ return new Invite(message.getAttributeAsJid("from"), pw != null ? pw.getContent(): null);
+ }
} else {
- return null;
+ x = message.findChild("x","jabber:x:conference");
+ if (x != null) {
+ return new Invite(x.getAttributeAsJid("jid"),x.getAttribute("password"));
+ }
}
+ return null;
}
private void parseEvent(final Element event, final Jid from, final Account account) {
diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
index c499d499a..e120adbd1 100644
--- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
@@ -1,6 +1,7 @@
package eu.siacs.conversations.persistance;
import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@@ -42,8 +43,7 @@ public class FileBackend {
private static int IMAGE_SIZE = 1920;
- private SimpleDateFormat imageDateFormat = new SimpleDateFormat(
- "yyyyMMdd_HHmmssSSS", Locale.US);
+ private final SimpleDateFormat imageDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US);
private XmppConnectionService mXmppConnectionService;
@@ -110,9 +110,7 @@ public class FileBackend {
scalledW = size;
scalledH = (int) (h / ((double) w / size));
}
- Bitmap scalledBitmap = Bitmap.createScaledBitmap(originalBitmap,
- scalledW, scalledH, true);
- return scalledBitmap;
+ return Bitmap.createScaledBitmap(originalBitmap, scalledW, scalledH, true);
} else {
return originalBitmap;
}
@@ -148,31 +146,35 @@ public class FileBackend {
}
public DownloadableFile copyFileToPrivateStorage(Message message, Uri uri) throws FileCopyException {
+ Log.d(Config.LOGTAG, "copy " + uri.toString() + " to private storage");
+ String mime = mXmppConnectionService.getContentResolver().getType(uri);
+ String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime);
+ message.setRelativeFilePath(message.getUuid() + "." + extension);
+ DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message);
+ file.getParentFile().mkdirs();
+ OutputStream os = null;
+ InputStream is = null;
try {
- Log.d(Config.LOGTAG, "copy " + uri.toString() + " to private storage");
- String mime = mXmppConnectionService.getContentResolver().getType(uri);
- String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime);
- message.setRelativeFilePath(message.getUuid() + "." + extension);
- DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message);
- file.getParentFile().mkdirs();
file.createNewFile();
- OutputStream os = new FileOutputStream(file);
- InputStream is = mXmppConnectionService.getContentResolver().openInputStream(uri);
+ os = new FileOutputStream(file);
+ is = mXmppConnectionService.getContentResolver().openInputStream(uri);
byte[] buffer = new byte[1024];
- int length;
- while ((length = is.read(buffer)) > 0) {
+ int length;
+ while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
- }
+ }
os.flush();
- os.close();
- is.close();
- Log.d(Config.LOGTAG, "output file name " + mXmppConnectionService.getFileBackend().getFile(message));
- return file;
- } catch (FileNotFoundException e) {
+ } catch(FileNotFoundException e) {
throw new FileCopyException(R.string.error_file_not_found);
} catch (IOException e) {
+ e.printStackTrace();
throw new FileCopyException(R.string.error_io_exception);
+ } finally {
+ close(os);
+ close(is);
}
+ Log.d(Config.LOGTAG, "output file name " + mXmppConnectionService.getFileBackend().getFile(message));
+ return file;
}
public DownloadableFile copyImageToPrivateStorage(Message message, Uri image)
@@ -182,49 +184,48 @@ public class FileBackend {
private DownloadableFile copyImageToPrivateStorage(Message message,
Uri image, int sampleSize) throws FileCopyException {
+ DownloadableFile file = getFile(message);
+ file.getParentFile().mkdirs();
+ InputStream is = null;
+ OutputStream os = null;
try {
- InputStream is = mXmppConnectionService.getContentResolver()
- .openInputStream(image);
- DownloadableFile file = getFile(message);
- file.getParentFile().mkdirs();
file.createNewFile();
+ is = mXmppConnectionService.getContentResolver().openInputStream(image);
+ os = new FileOutputStream(file);
+
Bitmap originalBitmap;
BitmapFactory.Options options = new BitmapFactory.Options();
int inSampleSize = (int) Math.pow(2, sampleSize);
- Log.d(Config.LOGTAG, "reading bitmap with sample size "
- + inSampleSize);
+ Log.d(Config.LOGTAG, "reading bitmap with sample size " + inSampleSize);
options.inSampleSize = inSampleSize;
originalBitmap = BitmapFactory.decodeStream(is, null, options);
is.close();
if (originalBitmap == null) {
throw new FileCopyException(R.string.error_not_an_image_file);
}
- Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE);
- originalBitmap = null;
+ Bitmap scaledBitmap = resize(originalBitmap, IMAGE_SIZE);
int rotation = getRotation(image);
if (rotation > 0) {
- scalledBitmap = rotate(scalledBitmap, rotation);
+ scaledBitmap = rotate(scaledBitmap, rotation);
}
- OutputStream os = new FileOutputStream(file);
- boolean success = scalledBitmap.compress(
- Bitmap.CompressFormat.WEBP, 75, os);
+
+ boolean success = scaledBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os);
if (!success) {
throw new FileCopyException(R.string.error_compressing_image);
}
os.flush();
- os.close();
long size = file.getSize();
- int width = scalledBitmap.getWidth();
- int height = scalledBitmap.getHeight();
+ int width = scaledBitmap.getWidth();
+ int height = scaledBitmap.getHeight();
message.setBody(Long.toString(size) + ',' + width + ',' + height);
return file;
} catch (FileNotFoundException e) {
throw new FileCopyException(R.string.error_file_not_found);
} catch (IOException e) {
+ e.printStackTrace();
throw new FileCopyException(R.string.error_io_exception);
} catch (SecurityException e) {
- throw new FileCopyException(
- R.string.error_security_exception_during_image_copy);
+ throw new FileCopyException(R.string.error_security_exception_during_image_copy);
} catch (OutOfMemoryError e) {
++sampleSize;
if (sampleSize <= 3) {
@@ -232,23 +233,24 @@ public class FileBackend {
} else {
throw new FileCopyException(R.string.error_out_of_memory);
}
+ } finally {
+ close(os);
+ close(is);
}
}
private int getRotation(Uri image) {
+ InputStream is = null;
try {
- InputStream is = mXmppConnectionService.getContentResolver()
- .openInputStream(image);
+ is = mXmppConnectionService.getContentResolver().openInputStream(image);
return ExifHelper.getOrientation(is);
} catch (FileNotFoundException e) {
return 0;
+ } finally {
+ close(is);
}
}
- public Bitmap getImageFromMessage(Message message) {
- return BitmapFactory.decodeFile(getFile(message).getAbsolutePath());
- }
-
public Bitmap getThumbnail(Message message, int size, boolean cacheOnly)
throws FileNotFoundException {
Bitmap thumbnail = mXmppConnectionService.getBitmapCache().get(
@@ -257,8 +259,7 @@ public class FileBackend {
File file = getFile(message);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = calcSampleSize(file, size);
- Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath(),
- options);
+ Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath(),options);
if (fullsize == null) {
throw new FileNotFoundException();
}
@@ -271,13 +272,11 @@ public class FileBackend {
public Uri getTakePhotoUri() {
StringBuilder pathBuilder = new StringBuilder();
- pathBuilder.append(Environment
- .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
+ pathBuilder.append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
pathBuilder.append('/');
pathBuilder.append("Camera");
pathBuilder.append('/');
- pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date())
- + ".jpg");
+ pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date()) + ".jpg");
Uri uri = Uri.parse("file://" + pathBuilder.toString());
File file = new File(uri.toString());
file.getParentFile().mkdirs();
@@ -325,13 +324,13 @@ public class FileBackend {
String filename = getAvatarPath(avatar.getFilename());
file = new File(filename + ".tmp");
file.getParentFile().mkdirs();
+ OutputStream os = null;
try {
file.createNewFile();
- FileOutputStream mFileOutputStream = new FileOutputStream(file);
+ os = new FileOutputStream(file);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.reset();
- DigestOutputStream mDigestOutputStream = new DigestOutputStream(
- mFileOutputStream, digest);
+ DigestOutputStream mDigestOutputStream = new DigestOutputStream(os, digest);
mDigestOutputStream.write(avatar.getImageAsBytes());
mDigestOutputStream.flush();
mDigestOutputStream.close();
@@ -349,6 +348,8 @@ public class FileBackend {
return false;
} catch (NoSuchAlgorithmException e) {
return false;
+ } finally {
+ close(os);
}
}
avatar.size = file.length();
@@ -356,8 +357,7 @@ public class FileBackend {
}
public String getAvatarPath(String avatar) {
- return mXmppConnectionService.getFilesDir().getAbsolutePath()
- + "/avatars/" + avatar;
+ return mXmppConnectionService.getFilesDir().getAbsolutePath()+ "/avatars/" + avatar;
}
public Uri getAvatarUri(String avatar) {
@@ -368,10 +368,11 @@ public class FileBackend {
if (image == null) {
return null;
}
+ InputStream is = null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = calcSampleSize(image, size);
- InputStream is = mXmppConnectionService.getContentResolver().openInputStream(image);
+ is = mXmppConnectionService.getContentResolver().openInputStream(image);
Bitmap input = BitmapFactory.decodeStream(is, null, options);
if (input == null) {
return null;
@@ -384,6 +385,8 @@ public class FileBackend {
}
} catch (FileNotFoundException e) {
return null;
+ } finally {
+ close(is);
}
}
@@ -391,12 +394,15 @@ public class FileBackend {
if (image == null) {
return null;
}
+ InputStream is = null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = calcSampleSize(image,Math.max(newHeight, newWidth));
- InputStream is = mXmppConnectionService.getContentResolver().openInputStream(image);
+ is = mXmppConnectionService.getContentResolver().openInputStream(image);
Bitmap source = BitmapFactory.decodeStream(is, null, options);
-
+ if (source == null) {
+ return null;
+ }
int sourceWidth = source.getWidth();
int sourceHeight = source.getHeight();
float xScale = (float) newWidth / sourceWidth;
@@ -408,14 +414,15 @@ public class FileBackend {
float top = (newHeight - scaledHeight) / 2;
RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
- Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig());
+ Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dest);
canvas.drawBitmap(source, null, targetRect, null);
return dest;
} catch (FileNotFoundException e) {
return null;
+ } finally {
+ close(is);
}
-
}
public Bitmap cropCenterSquare(Bitmap input, int size) {
@@ -430,7 +437,7 @@ public class FileBackend {
float top = (size - outHeight) / 2;
RectF target = new RectF(left, top, left + outWidth, top + outHeight);
- Bitmap output = Bitmap.createBitmap(size, size, input.getConfig());
+ Bitmap output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
canvas.drawBitmap(input, null, target, null);
return output;
@@ -522,4 +529,13 @@ public class FileBackend {
public boolean isFileAvailable(Message message) {
return getFile(message).exists();
}
+
+ public static void close(Closeable stream) {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ }
+ }
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java
index 7269a559b..fc40ce756 100644
--- a/src/main/java/eu/siacs/conversations/services/NotificationService.java
+++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java
@@ -454,7 +454,7 @@ public class NotificationService {
// nick (matched in case-insensitive manner), followed by optional
// punctuation (for example "bob: i disagree" or "how are you alice?"),
// followed by another word boundary.
- return Pattern.compile("\\b" + nick + "\\p{Punct}?\\b",
+ return Pattern.compile("\\b" + Pattern.quote(nick) + "\\p{Punct}?\\b",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
}
@@ -493,7 +493,7 @@ public class NotificationService {
final int cancelIcon;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBuilder.setCategory(Notification.CATEGORY_SERVICE);
- mBuilder.setSmallIcon(R.drawable.ic_import_export_white_48dp);
+ mBuilder.setSmallIcon(R.drawable.ic_import_export_white_24dp);
cancelIcon = R.drawable.ic_cancel_white_24dp;
} else {
mBuilder.setSmallIcon(R.drawable.ic_stat_communication_import_export);
@@ -540,7 +540,7 @@ public class NotificationService {
mBuilder.setOngoing(true);
//mBuilder.setLights(0xffffffff, 2000, 4000);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- mBuilder.setSmallIcon(R.drawable.ic_warning_white_36dp);
+ mBuilder.setSmallIcon(R.drawable.ic_warning_white_24dp);
} else {
mBuilder.setSmallIcon(R.drawable.ic_stat_alert_warning);
}
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index ca182867a..ec0b3f928 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -36,6 +36,7 @@ import org.openintents.openpgp.util.OpenPgpServiceConnection;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -174,13 +175,22 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
public void onContactStatusChanged(Contact contact, boolean online) {
Conversation conversation = find(getConversations(), contact);
if (conversation != null) {
- if (online && contact.getPresences().size() > 1) {
+ if (online) {
conversation.endOtrIfNeeded();
+ if (contact.getPresences().size() == 1) {
+ sendUnsentMessages(conversation);
+ }
} else {
- conversation.resetOtrSession();
- }
- if (online && (contact.getPresences().size() == 1)) {
- sendUnsentMessages(conversation);
+ if (contact.getPresences().size() >= 1) {
+ if (conversation.hasValidOtrSession()) {
+ String otrResource = conversation.getOtrSession().getSessionID().getUserID();
+ if (!(Arrays.asList(contact.getPresences().asStringArray()).contains(otrResource))) {
+ conversation.endOtrIfNeeded();
+ }
+ }
+ } else {
+ conversation.endOtrIfNeeded();
+ }
}
}
}
@@ -532,9 +542,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
ExceptionHelper.init(getApplicationContext());
PRNGFixes.apply();
this.mRandom = new SecureRandom();
- this.mMemorizingTrustManager = new MemorizingTrustManager(
- getApplicationContext());
-
+ updateMemorizingTrustmanager();
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
this.mBitmapCache = new LruCache(cacheSize) {
@@ -1129,6 +1137,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
public void archiveConversation(Conversation conversation) {
+ getNotificationService().clear(conversation);
conversation.setStatus(Conversation.STATUS_ARCHIVED);
conversation.setNextEncryption(-1);
synchronized (this.conversations) {
@@ -1538,6 +1547,9 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
for (Jid invite : jids) {
invite(conversation, invite);
}
+ if (account.countPresences() > 1) {
+ directInvite(conversation, account.getJid().toBareJid());
+ }
if (callback != null) {
callback.success(conversation);
}
@@ -1700,6 +1712,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
}
}
+ sendOfflinePresence(account);
}
account.getXmppConnection().disconnect(force);
}
@@ -2022,6 +2035,11 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
sendMessagePacket(conversation.getAccount(), packet);
}
+ public void directInvite(Conversation conversation, Jid jid) {
+ MessagePacket packet = mMessageGenerator.directInvite(conversation,jid);
+ sendMessagePacket(conversation.getAccount(),packet);
+ }
+
public void resetSendingToWaiting(Account account) {
for (Conversation conversation : getConversations()) {
if (conversation.getAccount() == account) {
@@ -2185,6 +2203,21 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
return this.mMemorizingTrustManager;
}
+ public void setMemorizingTrustManager(MemorizingTrustManager trustManager) {
+ this.mMemorizingTrustManager = trustManager;
+ }
+
+ public void updateMemorizingTrustmanager() {
+ final MemorizingTrustManager tm;
+ final boolean dontTrustSystemCAs = getPreferences().getBoolean("dont_trust_system_cas", false);
+ if (dontTrustSystemCAs) {
+ tm = new MemorizingTrustManager(getApplicationContext(), null);
+ } else {
+ tm = new MemorizingTrustManager(getApplicationContext());
+ }
+ setMemorizingTrustManager(tm);
+ }
+
public PowerManager getPowerManager() {
return this.pm;
}
@@ -2260,6 +2293,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
sendPresencePacket(account, mPresenceGenerator.sendPresence(account));
}
+ public void sendOfflinePresence(final Account account) {
+ sendPresencePacket(account, mPresenceGenerator.sendOfflinePresence(account));
+ }
+
public MessageGenerator getMessageGenerator() {
return this.mMessageGenerator;
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
index e4bfd6ff3..8c4f6eafe 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
@@ -237,6 +237,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
MenuItem menuItemDeleteBookmark = menu.findItem(R.id.action_delete_bookmark);
MenuItem menuItemAdvancedMode = menu.findItem(R.id.action_advanced_mode);
menuItemAdvancedMode.setChecked(mAdvancedMode);
+ if (mConversation == null) {
+ return true;
+ }
Account account = mConversation.getAccount();
if (account.hasBookmarkFor(mConversation.getJid().toBareJid())) {
menuItemSaveBookmark.setVisible(false);
diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
index 40a4587c5..f7156d7a7 100644
--- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
@@ -256,16 +256,19 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
MenuItem unblock = menu.findItem(R.id.action_unblock);
MenuItem edit = menu.findItem(R.id.action_edit_contact);
MenuItem delete = menu.findItem(R.id.action_delete_contact);
+ if (contact == null) {
+ return true;
+ }
final XmppConnection connection = contact.getAccount().getXmppConnection();
if (connection != null && connection.getFeatures().blocking()) {
if (this.contact.isBlocked()) {
- menu.findItem(R.id.action_block).setVisible(false);
+ block.setVisible(false);
} else {
- menu.findItem(R.id.action_unblock).setVisible(false);
+ unblock.setVisible(false);
}
} else {
- menu.findItem(R.id.action_unblock).setVisible(false);
- menu.findItem(R.id.action_block).setVisible(false);
+ unblock.setVisible(false);
+ block.setVisible(false);
}
if (!contact.showInRoster()) {
edit.setVisible(false);
@@ -275,6 +278,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
}
private void populateView() {
+ invalidateOptionsMenu();
setTitle(contact.getDisplayName());
if (contact.showInRoster()) {
send.setVisibility(View.VISIBLE);
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
index 82afda073..aec755fce 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
@@ -5,6 +5,7 @@ import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.app.PendingIntent;
+import android.content.ClipData;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
@@ -22,14 +23,15 @@ import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
-import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.Toast;
import net.java.otr4j.session.SessionStatus;
+import de.timroes.android.listview.EnhancedListView;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import eu.siacs.conversations.R;
@@ -69,15 +71,16 @@ public class ConversationActivity extends XmppActivity
private String mOpenConverstaion = null;
private boolean mPanelOpen = true;
- private Uri mPendingImageUri = null;
- private Uri mPendingFileUri = null;
+ final private List mPendingImageUris = new ArrayList<>();
+ final private List mPendingFileUris = new ArrayList<>();
private Uri mPendingGeoUri = null;
private View mContentView;
private List conversationList = new ArrayList<>();
+ private Conversation swipedConversation = null;
private Conversation mSelectedConversation = null;
- private ListView listView;
+ private EnhancedListView listView;
private ConversationFragment mConversationFragment;
private ArrayAdapter listAdapter;
@@ -140,13 +143,14 @@ public class ConversationActivity extends XmppActivity
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (savedInstanceState != null) {mOpenConverstaion = savedInstanceState.getString(
- STATE_OPEN_CONVERSATION, null);
- mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true);
- String pending = savedInstanceState.getString(STATE_PENDING_URI, null);
- if (pending != null) {
- mPendingImageUri = Uri.parse(pending);
- }
+ if (savedInstanceState != null) {
+ mOpenConverstaion = savedInstanceState.getString(STATE_OPEN_CONVERSATION, null);
+ mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true);
+ String pending = savedInstanceState.getString(STATE_PENDING_URI, null);
+ if (pending != null) {
+ mPendingImageUris.clear();
+ mPendingImageUris.add(Uri.parse(pending));
+ }
}
setContentView(R.layout.fragment_conversations_overview);
@@ -156,7 +160,7 @@ public class ConversationActivity extends XmppActivity
transaction.replace(R.id.selected_conversation, this.mConversationFragment, "conversation");
transaction.commit();
- listView = (ListView) findViewById(R.id.list);
+ listView = (EnhancedListView) findViewById(R.id.list);
this.listAdapter = new ConversationAdapter(this, conversationList);
listView.setAdapter(this.listAdapter);
@@ -178,6 +182,73 @@ public class ConversationActivity extends XmppActivity
openConversation();
}
});
+
+ listView.setDismissCallback(new EnhancedListView.OnDismissCallback() {
+
+ @Override
+ public EnhancedListView.Undoable onDismiss(final EnhancedListView enhancedListView, final int position) {
+
+ final int index = listView.getFirstVisiblePosition();
+ View v = listView.getChildAt(0);
+ final int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop());
+
+ swipedConversation = listAdapter.getItem(position);
+ listAdapter.remove(swipedConversation);
+ swipedConversation.markRead();
+ xmppConnectionService.getNotificationService().clear(swipedConversation);
+
+ final boolean formerlySelected = (getSelectedConversation() == swipedConversation);
+ if (position == 0 && listAdapter.getCount() == 0) {
+ endConversation(swipedConversation, false, true);
+ return null;
+ } else if (formerlySelected) {
+ setSelectedConversation(listAdapter.getItem(0));
+ ConversationActivity.this.mConversationFragment
+ .reInit(getSelectedConversation());
+ }
+
+ return new EnhancedListView.Undoable() {
+
+ @Override
+ public void undo() {
+ listAdapter.insert(swipedConversation, position);
+ if (formerlySelected) {
+ setSelectedConversation(swipedConversation);
+ ConversationActivity.this.mConversationFragment
+ .reInit(getSelectedConversation());
+ }
+ swipedConversation = null;
+ listView.setSelectionFromTop(index + (listView.getChildCount() < position ? 1 : 0), top);
+ }
+
+ @Override
+ public void discard() {
+ if (!swipedConversation.isRead()
+ && swipedConversation.getMode() == Conversation.MODE_SINGLE) {
+ swipedConversation = null;
+ return;
+ }
+ endConversation(swipedConversation, false, false);
+ swipedConversation = null;
+ }
+
+ @Override
+ public String getTitle() {
+ if (swipedConversation.getMode() == Conversation.MODE_MULTI) {
+ return getResources().getString(R.string.title_undo_swipe_out_muc);
+ } else {
+ return getResources().getString(R.string.title_undo_swipe_out_conversation);
+ }
+ }
+ };
+ }
+ });
+ listView.enableSwipeToDismiss();
+ listView.setSwipingLayout(R.id.swipeable_item);
+ listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP);
+ listView.setUndoHideDelay(5000);
+ listView.setRequireTouchBeforeDismiss(false);
+
mContentView = findViewById(R.id.content_view_spl);
if (mContentView == null) {
mContentView = findViewById(R.id.content_view_ll);
@@ -204,6 +275,7 @@ public class ConversationActivity extends XmppActivity
@Override
public void onPanelClosed(View arg0) {
+ listView.discardUndo();
openConversation();
}
@@ -303,7 +375,7 @@ public class ConversationActivity extends XmppActivity
if (this.getSelectedConversation().getLatestMessage()
.getEncryption() != Message.ENCRYPTION_NONE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- menuSecure.setIcon(R.drawable.ic_lock_outline_white_48dp);
+ menuSecure.setIcon(R.drawable.ic_lock_white_24dp);
} else {
menuSecure.setIcon(R.drawable.ic_action_secure);
}
@@ -340,13 +412,18 @@ public class ConversationActivity extends XmppActivity
switch (attachmentChoice) {
case ATTACHMENT_CHOICE_CHOOSE_IMAGE:
intent.setAction(Intent.ACTION_GET_CONTENT);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
+ }
intent.setType("image/*");
chooser = true;
break;
case ATTACHMENT_CHOICE_TAKE_PHOTO:
- mPendingImageUri = xmppConnectionService.getFileBackend().getTakePhotoUri();
+ Uri uri = xmppConnectionService.getFileBackend().getTakePhotoUri();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, mPendingImageUri);
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
+ mPendingImageUris.clear();
+ mPendingImageUris.add(uri);
break;
case ATTACHMENT_CHOICE_CHOOSE_FILE:
chooser = true;
@@ -485,13 +562,21 @@ public class ConversationActivity extends XmppActivity
}
public void endConversation(Conversation conversation) {
- showConversationsOverview();
+ endConversation(conversation, true, true);
+ }
+
+ public void endConversation(Conversation conversation, boolean showOverview, boolean reinit) {
+ if (showOverview) {
+ showConversationsOverview();
+ }
xmppConnectionService.archiveConversation(conversation);
- if (conversationList.size() > 0) {
- setSelectedConversation(conversationList.get(0));
- this.mConversationFragment.reInit(getSelectedConversation());
- } else {
- setSelectedConversation(null);
+ if (reinit) {
+ if (conversationList.size() > 0) {
+ setSelectedConversation(conversationList.get(0));
+ this.mConversationFragment.reInit(getSelectedConversation());
+ } else {
+ setSelectedConversation(null);
+ }
}
}
@@ -744,6 +829,7 @@ public class ConversationActivity extends XmppActivity
@Override
public void onPause() {
+ listView.discardUndo();
super.onPause();
this.mActivityPaused = true;
if (this.xmppConnectionServiceBound) {
@@ -779,8 +865,8 @@ public class ConversationActivity extends XmppActivity
}
savedInstanceState.putBoolean(STATE_PANEL_OPEN,
isConversationsOverviewVisable());
- if (this.mPendingImageUri != null) {
- savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUri.toString());
+ if (this.mPendingImageUris.size() >= 1) {
+ savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUris.get(0).toString());
}
super.onSaveInstanceState(savedInstanceState);
}
@@ -819,21 +905,23 @@ public class ConversationActivity extends XmppActivity
this.mConversationFragment.reInit(getSelectedConversation());
} else {
showConversationsOverview();
- mPendingImageUri = null;
- mPendingFileUri = null;
+ mPendingImageUris.clear();
+ mPendingFileUris.clear();
mPendingGeoUri = null;
setSelectedConversation(conversationList.get(0));
this.mConversationFragment.reInit(getSelectedConversation());
}
- if (mPendingImageUri != null) {
- attachImageToConversation(getSelectedConversation(),mPendingImageUri);
- mPendingImageUri = null;
- } else if (mPendingFileUri != null) {
- attachFileToConversation(getSelectedConversation(),mPendingFileUri);
- mPendingFileUri = null;
- } else if (mPendingGeoUri != null) {
- attachLocationToConversation(getSelectedConversation(),mPendingGeoUri);
+ for(Iterator i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) {
+ attachImageToConversation(getSelectedConversation(),i.next());
+ }
+
+ for(Iterator i = mPendingFileUris.iterator(); i.hasNext(); i.remove()) {
+ attachFileToConversation(getSelectedConversation(),i.next());
+ }
+
+ if (mPendingGeoUri != null) {
+ attachLocationToConversation(getSelectedConversation(), mPendingGeoUri);
mPendingGeoUri = null;
}
ExceptionHelper.checkForCrash(this, this.xmppConnectionService);
@@ -841,10 +929,10 @@ public class ConversationActivity extends XmppActivity
}
private void handleViewConversationIntent(final Intent intent) {
- final String uuid = (String) intent.getExtras().get(CONVERSATION);
- final String downloadUuid = (String) intent.getExtras().get(MESSAGE);
- final String text = intent.getExtras().getString(TEXT, "");
- final String nick = intent.getExtras().getString(NICK, null);
+ final String uuid = intent.getStringExtra(CONVERSATION);
+ final String downloadUuid = intent.getStringExtra(MESSAGE);
+ final String text = intent.getStringExtra(TEXT);
+ final String nick = intent.getStringExtra(NICK);
if (selectConversationByUuid(uuid)) {
this.mConversationFragment.reInit(getSelectedConversation());
if (nick != null) {
@@ -885,6 +973,21 @@ public class ConversationActivity extends XmppActivity
xmppConnectionService.getNotificationService().setOpenConversation(null);
}
+ @SuppressLint("NewApi")
+ private static List extractUriFromIntent(final Intent intent) {
+ List uris = new ArrayList<>();
+ Uri uri = intent.getData();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && uri == null) {
+ ClipData clipData = intent.getClipData();
+ for(int i = 0; i < clipData.getItemCount(); ++i) {
+ uris.add(clipData.getItemAt(i).getUri());
+ }
+ } else {
+ uris.add(uri);
+ }
+ return uris;
+ }
+
@Override
protected void onActivityResult(int requestCode, int resultCode,
final Intent data) {
@@ -894,25 +997,34 @@ public class ConversationActivity extends XmppActivity
mConversationFragment.hideSnackbar();
mConversationFragment.updateMessages();
} else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_IMAGE) {
- mPendingImageUri = data.getData();
+ mPendingImageUris.clear();
+ mPendingImageUris.addAll(extractUriFromIntent(data));
if (xmppConnectionServiceBound) {
- attachImageToConversation(getSelectedConversation(),mPendingImageUri);
- mPendingImageUri = null;
+ for(Iterator i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) {
+ attachImageToConversation(getSelectedConversation(),i.next());
+ }
}
} else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_FILE || requestCode == ATTACHMENT_CHOICE_RECORD_VOICE) {
- mPendingFileUri = data.getData();
+ mPendingFileUris.clear();
+ mPendingFileUris.addAll(extractUriFromIntent(data));
if (xmppConnectionServiceBound) {
- attachFileToConversation(getSelectedConversation(),mPendingFileUri);
- mPendingFileUri = null;
+ for(Iterator i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) {
+ attachFileToConversation(getSelectedConversation(), i.next());
+ }
}
- } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO && mPendingImageUri != null) {
- if (xmppConnectionServiceBound) {
- attachImageToConversation(getSelectedConversation(),mPendingImageUri);
- mPendingImageUri = null;
+ } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) {
+ if (mPendingImageUris.size() == 1) {
+ Uri uri = mPendingImageUris.get(0);
+ if (xmppConnectionServiceBound) {
+ attachImageToConversation(getSelectedConversation(), uri);
+ mPendingImageUris.clear();
+ }
+ Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
+ intent.setData(uri);
+ sendBroadcast(intent);
+ } else {
+ mPendingImageUris.clear();
}
- Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
- intent.setData(mPendingImageUri);
- sendBroadcast(intent);
} else if (requestCode == ATTACHMENT_CHOICE_LOCATION) {
double latitude = data.getDoubleExtra("latitude",0);
double longitude = data.getDoubleExtra("longitude",0);
@@ -923,9 +1035,8 @@ public class ConversationActivity extends XmppActivity
}
}
} else {
- if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) {
- mPendingImageUri = null;
- }
+ mPendingImageUris.clear();
+ mPendingFileUris.clear();
}
}
@@ -1013,6 +1124,13 @@ public class ConversationActivity extends XmppActivity
public void updateConversationList() {
xmppConnectionService
.populateWithOrderedConversations(conversationList);
+ if (swipedConversation != null) {
+ if (swipedConversation.isRead()) {
+ conversationList.remove(swipedConversation);
+ } else {
+ listView.discardUndo();
+ }
+ }
listAdapter.notifyDataSetChanged();
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index d5f20e417..5b1e9b4d6 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -8,7 +8,6 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
-import android.net.Uri;
import android.os.Bundle;
import android.text.InputType;
import android.view.ContextMenu;
@@ -268,7 +267,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
if (conversation.getNextCounterpart() != null) {
message.setCounterpart(conversation.getNextCounterpart());
message.setType(Message.TYPE_PRIVATE);
- conversation.setNextCounterpart(null);
}
}
if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_OTR) {
@@ -316,8 +314,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
@Override
public View onCreateView(final LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
- final View view = inflater.inflate(R.layout.fragment_conversation,
- container, false);
+ final View view = inflater.inflate(R.layout.fragment_conversation,container, false);
+ view.setOnClickListener(null);
mEditMessage = (EditMessage) view.findViewById(R.id.textinput);
setupIme();
mEditMessage.setOnClickListener(new OnClickListener() {
@@ -720,21 +718,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
final ConversationActivity activity = (ConversationActivity) getActivity();
if (this.conversation != null) {
updateSnackBar(this.conversation);
- final Contact contact = this.conversation.getContact();
- if (this.conversation.isBlocked()) {
-
- } else if (!contact.showInRoster()
- && contact
- .getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
-
- } else if (conversation.getMode() == Conversation.MODE_SINGLE) {
- makeFingerprintWarning();
- } else if (!conversation.getMucOptions().online()
- && conversation.getAccount().getStatus() == Account.State.ONLINE) {
-
- } else if (this.conversation.isMuted()) {
-
- }
conversation.populateWithMessages(ConversationFragment.this.messageList);
for (final Message message : this.messageList) {
if (message.getEncryption() == Message.ENCRYPTION_PGP
@@ -781,6 +764,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
} catch (final NoSuchElementException ignored) {
}
+ askForPassphraseIntent = null;
activity.xmppConnectionService.updateMessage(message);
}
@@ -880,10 +864,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
}
}
- protected void makeFingerprintWarning() {
-
- }
-
protected void showSnackbar(final int message, final int action,
final OnClickListener clickListener) {
snackbar.setVisibility(View.VISIBLE);
@@ -1020,6 +1000,9 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
}
public void appendText(String text) {
+ if (text == null) {
+ return;
+ }
String previous = this.mEditMessage.getText().toString();
if (previous.length() != 0 && !previous.endsWith(" ")) {
text = " " + text;
diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
index 27dfc4922..7aa7b1c2e 100644
--- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
@@ -67,7 +67,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
@Override
public void onClick(final View v) {
- if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED) {
+ if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !accountInfoEdited()) {
mAccount.setOption(Account.OPTION_DISABLED, false);
xmppConnectionService.updateAccount(mAccount);
return;
@@ -237,7 +237,11 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
}
protected void updateSaveButton() {
- if (mAccount != null && (mAccount.getStatus() == Account.State.CONNECTING || mFetchingAvatar)) {
+ if (accountInfoEdited() && jidToEdit != null) {
+ this.mSaveButton.setText(R.string.save);
+ this.mSaveButton.setEnabled(true);
+ this.mSaveButton.setTextColor(getPrimaryTextColor());
+ } else if (mAccount != null && (mAccount.getStatus() == Account.State.CONNECTING || mFetchingAvatar)) {
this.mSaveButton.setEnabled(false);
this.mSaveButton.setTextColor(getSecondaryTextColor());
this.mSaveButton.setText(R.string.account_status_connecting);
@@ -265,9 +269,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
}
protected boolean accountInfoEdited() {
- return (!this.mAccount.getJid().toBareJid().toString().equals(
- this.mAccountJid.getText().toString()))
- || (!this.mAccount.getPassword().equals(
+ return this.mAccount != null && (!this.mAccount.getJid().toBareJid().toString().equals(
+ this.mAccountJid.getText().toString())
+ || !this.mAccount.getPassword().equals(
this.mPassword.getText().toString()));
}
@@ -464,7 +468,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
} else {
this.mServerInfoSm.setText(R.string.server_info_unavailable);
}
- if (features.pubsub()) {
+ if (features.pep()) {
this.mServerInfoPep.setText(R.string.server_info_available);
} else {
this.mServerInfoPep.setText(R.string.server_info_unavailable);
diff --git a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java
index b2d5ddfd7..56dbc55e0 100644
--- a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java
@@ -168,6 +168,14 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
}
}
+ public void onClickTglAccountState(Account account, boolean enable) {
+ if (enable) {
+ enableAccount(account);
+ } else {
+ disableAccount(account);
+ }
+ }
+
private void publishAvatar(Account account) {
Intent intent = new Intent(getApplicationContext(),
PublishProfilePictureActivity.class);
diff --git a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java
index 3f72b7233..e8ab8dae7 100644
--- a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java
@@ -163,8 +163,7 @@ public class PublishProfilePictureActivity extends XmppActivity {
if (jid != null) {
this.account = xmppConnectionService.findAccountByJid(jid);
if (this.account.getXmppConnection() != null) {
- this.support = this.account.getXmppConnection()
- .getFeatures().pubsub();
+ this.support = this.account.getXmppConnection().getFeatures().pep();
}
if (this.avatarUri == null) {
if (this.account.getAvatar() != null
diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
index 39e215f2b..eb5d9b2e0 100644
--- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
@@ -1,17 +1,29 @@
package eu.siacs.conversations.ui;
+import java.security.KeyStoreException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Locale;
-import eu.siacs.conversations.entities.Account;
+import de.duenndns.ssl.MemorizingTrustManager;
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.xmpp.XmppConnection;
+
+import android.app.AlertDialog;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Build;
import android.os.Bundle;
import android.preference.ListPreference;
+import android.preference.Preference;
import android.preference.PreferenceManager;
+import android.widget.Toast;
public class SettingsActivity extends XmppActivity implements
OnSharedPreferenceChangeListener {
@@ -20,9 +32,12 @@ public class SettingsActivity extends XmppActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mSettingsFragment = new SettingsFragment();
- getFragmentManager().beginTransaction()
- .replace(android.R.id.content, mSettingsFragment).commit();
+ FragmentManager fm = getFragmentManager();
+ mSettingsFragment = (SettingsFragment) fm.findFragmentById(android.R.id.content);
+ if (mSettingsFragment == null || !mSettingsFragment.getClass().equals(SettingsFragment.class)) {
+ mSettingsFragment = new SettingsFragment();
+ fm.beginTransaction().replace(android.R.id.content, mSettingsFragment).commit();
+ }
}
@Override
@@ -33,19 +48,78 @@ public class SettingsActivity extends XmppActivity implements
@Override
public void onStart() {
super.onStart();
- PreferenceManager.getDefaultSharedPreferences(this)
- .registerOnSharedPreferenceChangeListener(this);
- ListPreference resources = (ListPreference) mSettingsFragment
- .findPreference("resource");
+ PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
+ ListPreference resources = (ListPreference) mSettingsFragment.findPreference("resource");
if (resources != null) {
- ArrayList entries = new ArrayList(
- Arrays.asList(resources.getEntries()));
- entries.add(0, Build.MODEL);
- resources.setEntries(entries.toArray(new CharSequence[entries
- .size()]));
- resources.setEntryValues(entries.toArray(new CharSequence[entries
- .size()]));
+ ArrayList entries = new ArrayList<>(Arrays.asList(resources.getEntries()));
+ if (!entries.contains(Build.MODEL)) {
+ entries.add(0, Build.MODEL);
+ resources.setEntries(entries.toArray(new CharSequence[entries.size()]));
+ resources.setEntryValues(entries.toArray(new CharSequence[entries.size()]));
+ }
}
+
+ final Preference removeCertsPreference = mSettingsFragment.findPreference("remove_trusted_certificates");
+ removeCertsPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ final MemorizingTrustManager mtm = xmppConnectionService.getMemorizingTrustManager();
+ final ArrayList aliases = Collections.list(mtm.getCertificates());
+ if (aliases.size() == 0) {
+ displayToast(getString(R.string.toast_no_trusted_certs));
+ return true;
+ }
+ final ArrayList selectedItems = new ArrayList();
+ final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this);
+ dialogBuilder.setTitle(getResources().getString(R.string.dialog_manage_certs_title));
+ dialogBuilder.setMultiChoiceItems(aliases.toArray(new CharSequence[aliases.size()]), null,
+ new DialogInterface.OnMultiChoiceClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int indexSelected,
+ boolean isChecked) {
+ if (isChecked) {
+ selectedItems.add(indexSelected);
+ } else if (selectedItems.contains(indexSelected)) {
+ selectedItems.remove(Integer.valueOf(indexSelected));
+ }
+ if (selectedItems.size() > 0)
+ ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true);
+ else {
+ ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
+ }
+ }
+ });
+
+ dialogBuilder.setPositiveButton(
+ getResources().getString(R.string.dialog_manage_certs_positivebutton), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ int count = selectedItems.size();
+ if (count > 0) {
+ for (int i = 0; i < count; i++) {
+ try {
+ Integer item = Integer.valueOf(selectedItems.get(i).toString());
+ String alias = aliases.get(item);
+ mtm.deleteCertificate(alias);
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ displayToast("Error: " + e.getLocalizedMessage());
+ }
+ }
+ if (xmppConnectionServiceBound) {
+ reconnectAccounts();
+ }
+ displayToast(getResources().getQuantityString(R.plurals.toast_delete_certificates, count, count));
+ }
+ }
+ });
+ dialogBuilder.setNegativeButton(getResources().getString(R.string.dialog_manage_certs_negativebutton), null);
+ AlertDialog removeCertsDialog = dialogBuilder.create();
+ removeCertsDialog.show();
+ removeCertsDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
+ return true;
+ }
+ });
}
@Override
@@ -63,9 +137,14 @@ public class SettingsActivity extends XmppActivity implements
.toLowerCase(Locale.US);
if (xmppConnectionServiceBound) {
for (Account account : xmppConnectionService.getAccounts()) {
- account.setResource(resource);
- if (!account.isOptionSet(Account.OPTION_DISABLED)) {
- xmppConnectionService.reconnectAccountInBackground(account);
+ if (account.setResource(resource)) {
+ if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+ XmppConnection connection = account.getXmppConnection();
+ if (connection != null) {
+ connection.resetStreamId();
+ }
+ xmppConnectionService.reconnectAccountInBackground(account);
+ }
}
}
}
@@ -79,6 +158,27 @@ public class SettingsActivity extends XmppActivity implements
}
}
}
+ } else if (name.equals("dont_trust_system_cas")) {
+ xmppConnectionService.updateMemorizingTrustmanager();
+ reconnectAccounts();
+ }
+
+ }
+
+ private void displayToast(final String msg) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(SettingsActivity.this, msg, Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+
+ private void reconnectAccounts() {
+ for (Account account : xmppConnectionService.getAccounts()) {
+ if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+ xmppConnectionService.reconnectAccountInBackground(account);
+ }
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java
index 6be238dca..200a577e7 100644
--- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java
@@ -18,6 +18,7 @@ import java.net.URLConnection;
import java.net.URLDecoder;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import eu.siacs.conversations.Config;
@@ -32,7 +33,7 @@ import eu.siacs.conversations.xmpp.jid.Jid;
public class ShareWithActivity extends XmppActivity {
private class Share {
- public Uri uri;
+ public List uris = new ArrayList<>();
public boolean image;
public String account;
public String contact;
@@ -104,7 +105,7 @@ public class ShareWithActivity extends XmppActivity {
int position, long arg3) {
Conversation conversation = mConversations.get(position);
if (conversation.getMode() == Conversation.MODE_SINGLE
- || share.uri == null) {
+ || share.uris.size() == 0) {
share(mConversations.get(position));
}
}
@@ -133,18 +134,32 @@ public class ShareWithActivity extends XmppActivity {
@Override
public void onStart() {
- final String type = getIntent().getType();
- final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
- if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) {
- this.share.uri = uri;
- this.share.image = type.startsWith("image/") || isImage(uri);
- } else {
- this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
+ super.onStart();
+ Intent intent = getIntent();
+ if (intent == null) {
+ return;
+ }
+ final String type = intent.getType();
+ if (Intent.ACTION_SEND.equals(intent.getAction())) {
+ final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
+ if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) {
+ this.share.uris.add(uri);
+ this.share.image = type.startsWith("image/") || isImage(uri);
+ } else {
+ this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
+ }
+ } else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) {
+ this.share.image = type != null && type.startsWith("image/");
+ if (!this.share.image) {
+ return;
+ }
+
+ this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
}
if (xmppConnectionServiceBound) {
- xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uri == null);
+ xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.image);
}
- super.onStart();
+
}
protected boolean isImage(Uri uri) {
@@ -164,7 +179,7 @@ public class ShareWithActivity extends XmppActivity {
return;
}
xmppConnectionService.populateWithOrderedConversations(mConversations,
- this.share != null && this.share.uri == null);
+ this.share != null && this.share.uris.size() == 0);
}
private void share() {
@@ -188,7 +203,7 @@ public class ShareWithActivity extends XmppActivity {
}
private void share(final Conversation conversation) {
- if (share.uri != null) {
+ if (share.uris.size() != 0) {
selectPresence(conversation, new OnPresenceSelected() {
@Override
public void onPresenceSelected() {
@@ -196,22 +211,23 @@ public class ShareWithActivity extends XmppActivity {
Toast.makeText(getApplicationContext(),
getText(R.string.preparing_image),
Toast.LENGTH_LONG).show();
- ShareWithActivity.this.xmppConnectionService
- .attachImageToConversation(conversation, share.uri,
- attachFileCallback);
+ for (Iterator i = share.uris.iterator(); i.hasNext(); i.remove()) {
+ ShareWithActivity.this.xmppConnectionService
+ .attachImageToConversation(conversation, i.next(),
+ attachFileCallback);
+ }
} else {
Toast.makeText(getApplicationContext(),
getText(R.string.preparing_file),
Toast.LENGTH_LONG).show();
ShareWithActivity.this.xmppConnectionService
- .attachFileToConversation(conversation, share.uri,
- attachFileCallback);
+ .attachFileToConversation(conversation, share.uris.get(0),
+ attachFileCallback);
}
switchToConversation(conversation, null, true);
finish();
}
});
-
} else {
switchToConversation(conversation, this.share.text, true);
finish();
diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
index 7eaec10c1..392e57a70 100644
--- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
@@ -90,6 +90,7 @@ public abstract class XmppActivity extends Activity {
protected int mPrimaryTextColor;
protected int mSecondaryTextColor;
+ protected int mPrimaryBackgroundColor;
protected int mSecondaryBackgroundColor;
protected int mColorRed;
protected int mColorOrange;
@@ -331,6 +332,7 @@ public abstract class XmppActivity extends Activity {
mColorOrange = getResources().getColor(R.color.orange);
mColorGreen = getResources().getColor(R.color.green);
mPrimaryColor = getResources().getColor(R.color.primary);
+ mPrimaryBackgroundColor = getResources().getColor(R.color.primarybackground);
mSecondaryBackgroundColor = getResources().getColor(R.color.secondarybackground);
this.mTheme = findTheme();
setTheme(this.mTheme);
@@ -740,7 +742,11 @@ public abstract class XmppActivity extends Activity {
public int getOnlineColor() {
return this.mColorGreen;
}
-
+
+ public int getPrimaryBackgroundColor() {
+ return this.mPrimaryBackgroundColor;
+ }
+
public int getSecondaryBackgroundColor() {
return this.mSecondaryBackgroundColor;
}
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java
index 29730914f..95c0524d0 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java
@@ -5,13 +5,16 @@ import java.util.List;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.ui.XmppActivity;
+import eu.siacs.conversations.ui.ManageAccountActivity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
+import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
+import android.widget.Switch;
public class AccountAdapter extends ArrayAdapter {
@@ -24,7 +27,7 @@ public class AccountAdapter extends ArrayAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
- Account account = getItem(position);
+ final Account account = getItem(position);
if (view == null) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -34,21 +37,32 @@ public class AccountAdapter extends ArrayAdapter {
jid.setText(account.getJid().toBareJid().toString());
TextView statusView = (TextView) view.findViewById(R.id.account_status);
ImageView imageView = (ImageView) view.findViewById(R.id.account_image);
- imageView.setImageBitmap(activity.avatarService().get(account,
- activity.getPixel(48)));
- statusView.setText(getContext().getString(account.getStatus().getReadableId()));
- switch (account.getStatus()) {
- case ONLINE:
- statusView.setTextColor(activity.getOnlineColor());
- break;
- case DISABLED:
- case CONNECTING:
- statusView.setTextColor(activity.getSecondaryTextColor());
- break;
- default:
- statusView.setTextColor(activity.getWarningTextColor());
- break;
- }
+ imageView.setImageBitmap(activity.avatarService().get(account, activity.getPixel(48)));
+ statusView.setText(getContext().getString(account.getStatus().getReadableId()));
+ switch (account.getStatus()) {
+ case ONLINE:
+ statusView.setTextColor(activity.getOnlineColor());
+ break;
+ case DISABLED:
+ case CONNECTING:
+ statusView.setTextColor(activity.getSecondaryTextColor());
+ break;
+ default:
+ statusView.setTextColor(activity.getWarningTextColor());
+ break;
+ }
+ final Switch tglAccountState = (Switch) view.findViewById(R.id.tgl_account_status);
+ final boolean isDisabled = (account.getStatus() == Account.State.DISABLED) ? true : false;
+ tglAccountState.setOnCheckedChangeListener(null);
+ tglAccountState.setChecked(!isDisabled);
+ tglAccountState.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b == isDisabled && activity instanceof ManageAccountActivity) {
+ ((ManageAccountActivity) activity).onClickTglAccountState(account,b);
+ }
+ }
+ });
return view;
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
index a48f6ae43..d5b7e4c05 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
@@ -46,17 +46,10 @@ public class ConversationAdapter extends ArrayAdapter {
}
Conversation conversation = getItem(position);
if (this.activity instanceof ConversationActivity) {
- ConversationActivity activity = (ConversationActivity) this.activity;
- if (!activity.isConversationsOverviewHideable()) {
- if (conversation == activity.getSelectedConversation()) {
- view.setBackgroundColor(activity
- .getSecondaryBackgroundColor());
- } else {
- view.setBackgroundColor(Color.TRANSPARENT);
- }
- } else {
- view.setBackgroundColor(Color.TRANSPARENT);
- }
+ View swipeableItem = view.findViewById(R.id.swipeable_item);
+ ConversationActivity a = (ConversationActivity) this.activity;
+ int c = !a.isConversationsOverviewHideable() && conversation == a.getSelectedConversation() ? a.getSecondaryBackgroundColor() : a.getPrimaryBackgroundColor();
+ swipeableItem.setBackgroundColor(c);
}
TextView convName = (TextView) view.findViewById(R.id.conversation_name);
if (conversation.getMode() == Conversation.MODE_SINGLE || activity.useSubjectToIdentifyConference()) {
diff --git a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
index eb7e2c3c6..466bc4098 100644
--- a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
@@ -91,6 +91,9 @@ public final class CryptoHelper {
}
public static String prettifyFingerprint(String fingerprint) {
+ if (fingerprint.length() < 40) {
+ return fingerprint;
+ }
StringBuilder builder = new StringBuilder(fingerprint);
builder.insert(8, " ");
builder.insert(17, " ");
diff --git a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java
index f7dda936f..b31b90182 100644
--- a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java
@@ -20,7 +20,7 @@ public class GeoHelper {
}
public static ArrayList createGeoIntentsFromMessage(Message message) {
- final ArrayList intents = new ArrayList();
+ final ArrayList intents = new ArrayList<>();
Matcher matcher = GEO_URI.matcher(message.getBody());
if (!matcher.matches()) {
return intents;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index b8e25d4b0..0b6bb15b7 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -90,7 +90,7 @@ public class XmppConnection implements Runnable {
private boolean shouldBind = true;
private boolean shouldAuthenticate = true;
private Element streamFeatures;
- private final HashMap> disco = new HashMap<>();
+ private final HashMap disco = new HashMap<>();
private String streamId = null;
private int smVersion = 3;
@@ -334,16 +334,23 @@ public class XmppConnection implements Runnable {
} catch (final NumberFormatException ignored) {
}
sendServiceDiscoveryInfo(account.getServer());
+ sendServiceDiscoveryInfo(account.getJid().toBareJid());
sendServiceDiscoveryItems(account.getServer());
sendInitialPing();
} else if (nextTag.isStart("r")) {
tagReader.readElement(nextTag);
+ if (Config.EXTENDED_SM_LOGGING) {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": acknowledging stanza #" + this.stanzasReceived);
+ }
final AckPacket ack = new AckPacket(this.stanzasReceived, smVersion);
tagWriter.writeStanzaAsync(ack);
} else if (nextTag.isStart("a")) {
final Element ack = tagReader.readElement(nextTag);
lastPacketReceived = SystemClock.elapsedRealtime();
final int serverSequence = Integer.parseInt(ack.getAttribute("h"));
+ if (Config.EXTENDED_SM_LOGGING) {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server acknowledged stanza #" + serverSequence);
+ }
final String msgId = this.messageReceipts.get(serverSequence);
if (msgId != null) {
if (this.acknowledgedListener != null) {
@@ -597,8 +604,10 @@ public class XmppConnection implements Runnable {
} else if (this.streamFeatures.hasChild("sm", "urn:xmpp:sm:"
+ smVersion)
&& streamId != null) {
- final ResumePacket resume = new ResumePacket(this.streamId,
- stanzasReceived, smVersion);
+ if (Config.EXTENDED_SM_LOGGING) {
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": resuming after stanza #"+stanzasReceived);
+ }
+ final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion);
this.tagWriter.writeStanzaAsync(resume);
} else if (this.streamFeatures.hasChild("bind") && shouldBind) {
sendBindRequest();
@@ -734,6 +743,7 @@ public class XmppConnection implements Runnable {
features.blockListRequested = false;
disco.clear();
sendServiceDiscoveryInfo(account.getServer());
+ sendServiceDiscoveryInfo(account.getJid().toBareJid());
sendServiceDiscoveryItems(account.getServer());
if (bindListener != null) {
bindListener.onBind(account);
@@ -741,34 +751,35 @@ public class XmppConnection implements Runnable {
sendInitialPing();
}
- private void sendServiceDiscoveryInfo(final Jid server) {
- if (disco.containsKey(server.toDomainJid().toString())) {
- if (account.getServer().equals(server.toDomainJid())) {
+ private void sendServiceDiscoveryInfo(final Jid jid) {
+ if (disco.containsKey(jid)) {
+ if (account.getServer().equals(jid)) {
enableAdvancedStreamFeatures();
}
} else {
final IqPacket iq = new IqPacket(IqPacket.TYPE.GET);
- iq.setTo(server.toDomainJid());
+ iq.setTo(jid);
iq.query("http://jabber.org/protocol/disco#info");
this.sendIqPacket(iq, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
final List elements = packet.query().getChildren();
- final List features = new ArrayList<>();
+ final Info info = new Info();
for (final Element element : elements) {
if (element.getName().equals("identity")) {
- if ("irc".equals(element.getAttribute("type"))) {
- //add fake feature to not confuse irc and real muc
- features.add("siacs:no:muc");
+ String type = element.getAttribute("type");
+ String category = element.getAttribute("category");
+ if (type != null && category != null) {
+ info.identities.add(new Pair<>(category,type));
}
} else if (element.getName().equals("feature")) {
- features.add(element.getAttribute("var"));
+ info.features.add(element.getAttribute("var"));
}
}
- disco.put(server.toDomainJid().toString(), features);
+ disco.put(jid, info);
- if (account.getServer().equals(server.toDomainJid())) {
+ if (account.getServer().equals(jid)) {
enableAdvancedStreamFeatures();
for (final OnAdvancedStreamFeaturesLoaded listener : advancedStreamFeaturesLoadedListeners) {
listener.onAdvancedStreamFeaturesAvailable(account);
@@ -784,7 +795,7 @@ public class XmppConnection implements Runnable {
sendEnableCarbons();
}
if (getFeatures().blocking() && !features.blockListRequested) {
- Log.d(Config.LOGTAG, "Requesting block list");
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": Requesting block list");
this.sendIqPacket(getIqGenerator().generateGetBlockList(), mXmppConnectionService.getIqParser());
}
}
@@ -891,7 +902,9 @@ public class XmppConnection implements Runnable {
}
tagWriter.writeStanzaAsync(packet);
if (packet instanceof MessagePacket && packet.getId() != null && this.streamId != null) {
- Log.d(Config.LOGTAG, "request delivery report for stanza " + stanzasSent);
+ if (Config.EXTENDED_SM_LOGGING) {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": requesting ack for message stanza #" + stanzasSent);
+ }
this.messageReceipts.put(stanzasSent, packet.getId());
tagWriter.writeStanzaAsync(new RequestPacket(this.smVersion));
}
@@ -981,11 +994,15 @@ public class XmppConnection implements Runnable {
}
}
+ public void resetStreamId() {
+ this.streamId = null;
+ }
+
public List findDiscoItemsByFeature(final String feature) {
final List items = new ArrayList<>();
- for (final Entry> cursor : disco.entrySet()) {
- if (cursor.getValue().contains(feature)) {
- items.add(cursor.getKey());
+ for (final Entry cursor : disco.entrySet()) {
+ if (cursor.getValue().features.contains(feature)) {
+ items.add(cursor.getKey().toString());
}
}
return items;
@@ -1004,10 +1021,12 @@ public class XmppConnection implements Runnable {
}
public String getMucServer() {
- for (final Entry> cursor : disco.entrySet()) {
- final List value = cursor.getValue();
- if (value.contains("http://jabber.org/protocol/muc") && !value.contains("jabber:iq:gateway") && !value.contains("siacs:no:muc")) {
- return cursor.getKey();
+ for (final Entry cursor : disco.entrySet()) {
+ final Info value = cursor.getValue();
+ if (value.features.contains("http://jabber.org/protocol/muc")
+ && !value.features.contains("jabber:iq:gateway")
+ && !value.identities.contains(new Pair<>("conference","irc"))) {
+ return cursor.getKey().toString();
}
}
return null;
@@ -1062,6 +1081,11 @@ public class XmppConnection implements Runnable {
this.lastConnect = 0;
}
+ private class Info {
+ public final ArrayList features = new ArrayList<>();
+ public final ArrayList> identities = new ArrayList<>();
+ }
+
public class Features {
XmppConnection connection;
private boolean carbonsEnabled = false;
@@ -1073,8 +1097,8 @@ public class XmppConnection implements Runnable {
}
private boolean hasDiscoFeature(final Jid server, final String feature) {
- return connection.disco.containsKey(server.toDomainJid().toString()) &&
- connection.disco.get(server.toDomainJid().toString()).contains(feature);
+ return connection.disco.containsKey(server) &&
+ connection.disco.get(server).features.contains(feature);
}
public boolean carbons() {
@@ -1090,24 +1114,35 @@ public class XmppConnection implements Runnable {
}
public boolean sm() {
- return streamId != null;
+ return streamId != null
+ || (connection.streamFeatures != null && connection.streamFeatures.hasChild("sm"));
}
public boolean csi() {
return connection.streamFeatures != null && connection.streamFeatures.hasChild("csi", "urn:xmpp:csi:0");
}
- public boolean pubsub() {
- return hasDiscoFeature(account.getServer(),
- "http://jabber.org/protocol/pubsub#publish");
+ public boolean pep() {
+ final Pair needle = new Pair<>("pubsub","pep");
+ Info info = disco.get(account.getServer());
+ if (info != null && info.identities.contains(needle)) {
+ return true;
+ } else {
+ info = disco.get(account.getJid().toBareJid());
+ return info != null && info.identities.contains(needle);
+ }
}
public boolean mam() {
- return hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0");
+ if (hasDiscoFeature(account.getJid().toBareJid(), "urn:xmpp:mam:0")) {
+ return true;
+ } else {
+ return hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0");
+ }
}
public boolean advancedStreamFeaturesLoaded() {
- return disco.containsKey(account.getServer().toString());
+ return disco.containsKey(account.getServer());
}
public boolean rosterVersioning() {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
index 2d949e21e..e448f9477 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -192,7 +192,7 @@ public class JingleConnection implements Downloadable {
} else {
response = packet.generateResponse(IqPacket.TYPE.ERROR);
}
- account.getXmppConnection().sendIqPacket(response, null);
+ mXmppConnectionService.sendIqPacket(account,response,null);
}
public void init(Message message) {
@@ -317,7 +317,7 @@ public class JingleConnection implements Downloadable {
message.setBody(Long.toString(size));
conversation.add(message);
mXmppConnectionService.updateConversationUi();
- if (size <= this.mJingleConnectionManager
+ if (size < this.mJingleConnectionManager
.getAutoAcceptFileSize()) {
Log.d(Config.LOGTAG, "auto accepting file from "
+ packet.getFrom());
@@ -459,11 +459,11 @@ public class JingleConnection implements Downloadable {
}
private void sendJinglePacket(JinglePacket packet) {
- account.getXmppConnection().sendIqPacket(packet, responseListener);
+ mXmppConnectionService.sendIqPacket(account,packet,responseListener);
}
private void sendJinglePacket(JinglePacket packet, OnIqPacketReceived callback) {
- account.getXmppConnection().sendIqPacket(packet,callback);
+ mXmppConnectionService.sendIqPacket(account,packet,callback);
}
private boolean receiveAccept(JinglePacket packet) {
@@ -556,7 +556,7 @@ public class JingleConnection implements Downloadable {
.setAttribute("sid", this.getSessionId());
activation.query().addChild("activate")
.setContent(this.getCounterPart().toString());
- this.account.getXmppConnection().sendIqPacket(activation,
+ mXmppConnectionService.sendIqPacket(account,activation,
new OnIqPacketReceived() {
@Override
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java
index 174f70faa..9866af03d 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java
@@ -11,6 +11,7 @@ import android.util.Base64;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.DownloadableFile;
+import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
@@ -172,6 +173,7 @@ public class JingleInbandTransport extends JingleTransport {
connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100));
}
} catch (IOException e) {
+ FileBackend.close(fileInputStream);
this.onFileTransmissionStatusChanged.onFileTransferAborted();
}
}
@@ -198,6 +200,7 @@ public class JingleInbandTransport extends JingleTransport {
connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100));
}
} catch (IOException e) {
+ FileBackend.close(fileOutputStream);
this.onFileTransmissionStatusChanged.onFileTransferAborted();
}
}
@@ -207,6 +210,7 @@ public class JingleInbandTransport extends JingleTransport {
if (!established) {
established = true;
connected = true;
+ this.receiveNextBlock("");
this.account.getXmppConnection().sendIqPacket(
packet.generateResponse(IqPacket.TYPE.RESULT), null);
} else {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java
index c34195804..72015a058 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java
@@ -11,6 +11,7 @@ import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import eu.siacs.conversations.entities.DownloadableFile;
+import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.utils.CryptoHelper;
public class JingleSocks5Transport extends JingleTransport {
@@ -126,25 +127,19 @@ public class JingleSocks5Transport extends JingleTransport {
} catch (NoSuchAlgorithmException e) {
callback.onFileTransferAborted();
} finally {
- try {
- if (fileInputStream != null) {
- fileInputStream.close();
- }
- } catch (IOException e) {
- callback.onFileTransferAborted();
- }
+ FileBackend.close(fileInputStream);
}
}
}).start();
}
- public void receive(final DownloadableFile file,
- final OnFileTransmissionStatusChanged callback) {
+ public void receive(final DownloadableFile file, final OnFileTransmissionStatusChanged callback) {
new Thread(new Runnable() {
@Override
public void run() {
+ OutputStream fileOutputStream = null;
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.reset();
@@ -152,7 +147,7 @@ public class JingleSocks5Transport extends JingleTransport {
socket.setSoTimeout(30000);
file.getParentFile().mkdirs();
file.createNewFile();
- OutputStream fileOutputStream = file.createOutputStream();
+ fileOutputStream = file.createOutputStream();
if (fileOutputStream == null) {
callback.onFileTransferAborted();
return;
@@ -183,6 +178,8 @@ public class JingleSocks5Transport extends JingleTransport {
callback.onFileTransferAborted();
} catch (NoSuchAlgorithmException e) {
callback.onFileTransferAborted();
+ } finally {
+ FileBackend.close(fileOutputStream);
}
}
}).start();
diff --git a/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..481643ecd
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_add_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png b/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png
new file mode 100644
index 000000000..66299b881
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_chat_white_48dp.png b/src/main/res/drawable-hdpi/ic_chat_white_48dp.png
deleted file mode 100644
index 71cac75af..000000000
Binary files a/src/main/res/drawable-hdpi/ic_chat_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_content_copy_grey600_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_content_copy_grey600_36dp.png
rename to src/main/res/drawable-hdpi/ic_content_copy_grey600_24dp.png
diff --git a/src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png
deleted file mode 100644
index bd2c60b86..000000000
Binary files a/src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png
new file mode 100644
index 000000000..b72a9f3c6
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/src/main/res/drawable-hdpi/ic_delete_white_24dp.png
new file mode 100644
index 000000000..a9eac0ca7
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_delete_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_edit_grey600_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_edit_grey600_36dp.png
rename to src/main/res/drawable-hdpi/ic_edit_grey600_24dp.png
diff --git a/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png
deleted file mode 100644
index f8970cb25..000000000
Binary files a/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_edit_white_24dp.png b/src/main/res/drawable-hdpi/ic_edit_white_24dp.png
new file mode 100644
index 000000000..730416c96
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_edit_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png
new file mode 100644
index 000000000..d96c584ca
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_group_white_24dp.png b/src/main/res/drawable-hdpi/ic_group_white_24dp.png
new file mode 100644
index 000000000..dada448fb
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_group_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_import_export_white_24dp.png b/src/main/res/drawable-hdpi/ic_import_export_white_24dp.png
new file mode 100644
index 000000000..705a4cc70
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_import_export_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png b/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png
new file mode 100644
index 000000000..1f582254f
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png
deleted file mode 100644
index d0c25290b..000000000
Binary files a/src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_lock_white_24dp.png b/src/main/res/drawable-hdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..b94735ecb
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_lock_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png
new file mode 100644
index 000000000..533419085
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png
deleted file mode 100644
index 72128fe69..000000000
Binary files a/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png
deleted file mode 100644
index aeb1cea9a..000000000
Binary files a/src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/src/main/res/drawable-hdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..a2fc5b2e7
Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_search_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_settings_grey600_36dp.png
rename to src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png
diff --git a/src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png
deleted file mode 100644
index cff84744f..000000000
Binary files a/src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_warning_white_36dp.png b/src/main/res/drawable-hdpi/ic_warning_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_warning_white_36dp.png
rename to src/main/res/drawable-hdpi/ic_warning_white_24dp.png
diff --git a/src/main/res/drawable-hdpi/ic_warning_white_36dp.png b/src/main/res/drawable-hdpi/ic_warning_white_36dp.png
deleted file mode 100644
index c8b7140a9..000000000
Binary files a/src/main/res/drawable-hdpi/ic_warning_white_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_add_white_24dp.png
new file mode 100644
index 000000000..977dd3427
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_add_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png b/src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png
new file mode 100644
index 000000000..fc62a5bf9
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_chat_white_48dp.png b/src/main/res/drawable-mdpi/ic_chat_white_48dp.png
deleted file mode 100644
index 526ebec6d..000000000
Binary files a/src/main/res/drawable-mdpi/ic_chat_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png
new file mode 100644
index 000000000..bab9b4d66
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png
new file mode 100644
index 000000000..e757fdb07
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/src/main/res/drawable-mdpi/ic_delete_white_24dp.png
new file mode 100644
index 000000000..e4ea52ef2
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_delete_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png
new file mode 100644
index 000000000..bae3480cb
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_edit_white_24dp.png b/src/main/res/drawable-mdpi/ic_edit_white_24dp.png
new file mode 100644
index 000000000..85cff0b91
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_edit_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_group_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_group_add_white_24dp.png
new file mode 100644
index 000000000..d0ef7ee83
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_group_add_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_group_white_24dp.png b/src/main/res/drawable-mdpi/ic_group_white_24dp.png
new file mode 100644
index 000000000..ff2a916b4
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_group_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png b/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png
new file mode 100644
index 000000000..5f6e11bc8
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png b/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png
new file mode 100644
index 000000000..ab9efde0b
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png
deleted file mode 100644
index 2d2c9417d..000000000
Binary files a/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_lock_white_24dp.png b/src/main/res/drawable-mdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..381b6a118
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_lock_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png
new file mode 100644
index 000000000..d0857a492
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png
deleted file mode 100644
index 5f89fc257..000000000
Binary files a/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png
deleted file mode 100644
index efc9560ed..000000000
Binary files a/src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/src/main/res/drawable-mdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..dff1e3a8a
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_search_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png
new file mode 100644
index 000000000..5a1b41f03
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_warning_white_24dp.png b/src/main/res/drawable-mdpi/ic_warning_white_24dp.png
new file mode 100644
index 000000000..385c0f68a
Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_warning_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_add_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_add_white_24dp.png
diff --git a/src/main/res/drawable-mdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xhdpi/ic_attach_file_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_attach_file_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_attach_file_white_24dp.png
diff --git a/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png
deleted file mode 100644
index 1230ab392..000000000
Binary files a/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png
new file mode 100644
index 000000000..68ccece61
Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png differ
diff --git a/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png
new file mode 100644
index 000000000..c6bb43e8b
Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_delete_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_delete_white_24dp.png
diff --git a/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png
new file mode 100644
index 000000000..4c95bd577
Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xhdpi/ic_edit_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_edit_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_edit_white_24dp.png
diff --git a/src/main/res/drawable-mdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_group_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_group_add_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_group_add_white_24dp.png
diff --git a/src/main/res/drawable-mdpi/ic_group_white_48dp.png b/src/main/res/drawable-xhdpi/ic_group_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_group_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_group_white_24dp.png
diff --git a/src/main/res/drawable-mdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xhdpi/ic_import_export_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_import_export_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_import_export_white_24dp.png
diff --git a/src/main/res/drawable-mdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_lock_open_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png
diff --git a/src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png
deleted file mode 100644
index 3de35f9b9..000000000
Binary files a/src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png b/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..c5e9d0b49
Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png differ
diff --git a/src/main/res/drawable-mdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_person_add_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png
diff --git a/src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png
deleted file mode 100644
index d271d8e03..000000000
Binary files a/src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png
deleted file mode 100644
index 3d5136fef..000000000
Binary files a/src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-mdpi/ic_search_white_48dp.png b/src/main/res/drawable-xhdpi/ic_search_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-mdpi/ic_search_white_48dp.png
rename to src/main/res/drawable-xhdpi/ic_search_white_24dp.png
diff --git a/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png
new file mode 100644
index 000000000..2251d2bbb
Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png differ
diff --git a/src/main/res/drawable-xhdpi/ic_warning_white_24dp.png b/src/main/res/drawable-xhdpi/ic_warning_white_24dp.png
new file mode 100644
index 000000000..6eb7943cd
Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_warning_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_add_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png
deleted file mode 100644
index b12e040e0..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_attach_file_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_attach_file_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_attach_file_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png
deleted file mode 100644
index b50e51612..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png
deleted file mode 100644
index bb39d1573..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_content_copy_grey600_36dp.png
rename to src/main/res/drawable-xxhdpi/ic_content_copy_grey600_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png
deleted file mode 100644
index 72b3474b0..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png
new file mode 100644
index 000000000..4886ab1e9
Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_delete_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png
deleted file mode 100644
index a8d8ca84d..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_edit_grey600_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_edit_grey600_36dp.png
rename to src/main/res/drawable-xxhdpi/ic_edit_grey600_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png
deleted file mode 100644
index 21b617a9f..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_edit_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_edit_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_edit_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png
deleted file mode 100644
index fe5bd13fb..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_group_add_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_group_add_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png
deleted file mode 100644
index 7ff60d6f4..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_group_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_group_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_white_48dp.png
deleted file mode 100644
index fffa6a6a2..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_group_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_import_export_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_import_export_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_import_export_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png
deleted file mode 100644
index cabd50c05..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_lock_open_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png
deleted file mode 100644
index 031eb06e2..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png
deleted file mode 100644
index f57082d8b..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png b/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..0dcada814
Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png differ
diff --git a/src/main/res/drawable-hdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_person_add_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png
deleted file mode 100644
index ba2424876..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png
deleted file mode 100644
index 87ab2d640..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png
deleted file mode 100644
index 4b1003db0..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-hdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-hdpi/ic_search_white_48dp.png
rename to src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_search_white_48dp.png
deleted file mode 100644
index 75d9aa69f..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_search_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_settings_grey600_36dp.png
rename to src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png
deleted file mode 100644
index d47d042e6..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxhdpi/ic_warning_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_warning_white_36dp.png
rename to src/main/res/drawable-xxhdpi/ic_warning_white_24dp.png
diff --git a/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png
deleted file mode 100644
index a6e5788ba..000000000
Binary files a/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_add_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png
deleted file mode 100644
index cd32f0a82..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_attach_file_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_attach_file_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_attach_file_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png
deleted file mode 100644
index 55464b7eb..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png
deleted file mode 100644
index 68f14af6d..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png
new file mode 100644
index 000000000..1eb62d42c
Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png
deleted file mode 100644
index 435c087ab..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png
new file mode 100644
index 000000000..e4e218123
Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png differ
diff --git a/src/main/res/drawable-xhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_delete_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png
deleted file mode 100644
index 47fef5aab..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png
new file mode 100644
index 000000000..0c0fd76f6
Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png
deleted file mode 100644
index 1361eedcd..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_edit_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_edit_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png
deleted file mode 100644
index 736806495..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_group_add_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_group_add_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png
deleted file mode 100644
index 7e9d67f63..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_group_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_group_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png
deleted file mode 100644
index 2a27316be..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_import_export_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_import_export_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_import_export_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png
deleted file mode 100644
index ea80bc00a..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_lock_open_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png
deleted file mode 100644
index f7652e609..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png
deleted file mode 100644
index 440070a11..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..a70c55b7e
Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png differ
diff --git a/src/main/res/drawable-xhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_person_add_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png
deleted file mode 100644
index 89c1aef24..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png
deleted file mode 100644
index fe0ae13aa..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png
deleted file mode 100644
index 524cc0a09..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xhdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png
similarity index 100%
rename from src/main/res/drawable-xhdpi/ic_search_white_48dp.png
rename to src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png
diff --git a/src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png
deleted file mode 100644
index 7caf6c9b7..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png
new file mode 100644
index 000000000..5eba9e8ec
Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png
deleted file mode 100644
index 8fea47f60..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png and /dev/null differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png
new file mode 100644
index 000000000..b80446e7a
Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png differ
diff --git a/src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png
deleted file mode 100644
index abc5c7a5f..000000000
Binary files a/src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png and /dev/null differ
diff --git a/src/main/res/layout-w960dp/fragment_conversations_overview.xml b/src/main/res/layout-w945dp/fragment_conversations_overview.xml
similarity index 93%
rename from src/main/res/layout-w960dp/fragment_conversations_overview.xml
rename to src/main/res/layout-w945dp/fragment_conversations_overview.xml
index 2744f38ef..50039c03a 100644
--- a/src/main/res/layout-w960dp/fragment_conversations_overview.xml
+++ b/src/main/res/layout-w945dp/fragment_conversations_overview.xml
@@ -12,7 +12,7 @@
android:background="@color/primarybackground"
android:orientation="vertical" >
-
+ android:paddingLeft="8dp"
+ android:paddingBottom="8dp"
+ android:paddingTop="8dp">
+ android:paddingLeft="8dp"
+ android:layout_toLeftOf="@+id/tgl_account_status"
+ android:layout_toStartOf="@+id/tgl_account_status">
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml
index 750c28e0b..7d84a4af3 100644
--- a/src/main/res/layout/activity_edit_account.xml
+++ b/src/main/res/layout/activity_edit_account.xml
@@ -337,7 +337,7 @@
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?android:selectableItemBackground"
- android:padding="8dp"
+ android:padding="@dimen/image_button_padding"
android:src="?attr/icon_copy"
android:visibility="visible"
android:contentDescription="@string/copy_otr_clipboard_description"/>
diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml
index 36873654e..116026512 100644
--- a/src/main/res/layout/activity_muc_details.xml
+++ b/src/main/res/layout/activity_muc_details.xml
@@ -75,7 +75,7 @@
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?android:selectableItemBackground"
- android:padding="8dp"
+ android:padding="@dimen/image_button_padding"
android:src="?attr/icon_edit_dark"/>
@@ -102,7 +102,7 @@
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?android:selectableItemBackground"
- android:padding="8dp"
+ android:padding="@dimen/image_button_padding"
android:src="?attr/icon_settings"/>
diff --git a/src/main/res/layout/contact_key.xml b/src/main/res/layout/contact_key.xml
index 755728776..b7817b383 100644
--- a/src/main/res/layout/contact_key.xml
+++ b/src/main/res/layout/contact_key.xml
@@ -34,7 +34,7 @@
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?android:selectableItemBackground"
- android:padding="8dp"
+ android:padding="@dimen/image_button_padding"
android:src="?attr/icon_remove"
android:visibility="invisible" />
diff --git a/src/main/res/layout/conversation_list_row.xml b/src/main/res/layout/conversation_list_row.xml
index 21147b4a0..69abb2256 100644
--- a/src/main/res/layout/conversation_list_row.xml
+++ b/src/main/res/layout/conversation_list_row.xml
@@ -1,68 +1,86 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
-
-
+
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/fragment_conversations_overview.xml b/src/main/res/layout/fragment_conversations_overview.xml
index 695700288..24c653ae6 100644
--- a/src/main/res/layout/fragment_conversations_overview.xml
+++ b/src/main/res/layout/fragment_conversations_overview.xml
@@ -10,7 +10,7 @@
android:background="@color/primarybackground"
android:orientation="vertical" >
- لايمكن تغيير كلمة السر
ارسل رساله لبدأ محادثة مشفّرة
أسال سؤال
- إذا كنت و جهة اتصالك لديكم سر مشترك غير معروف لأحد آخر (مثل جملة مكرره بينكم او تاريخ ما يخصكم كتاريخ آخر لقاء بينكم ) استخدماه للتحقق من بصمات الأصابع \n\n عليك توفير تلميحا أو سؤال لجهة الإتصال بك للحصول على تلك الإجابه وبدأ التواصل
سترغب جهة الإتصال بتأكيد بصمتك عبر السر المشترك بينكما لذلك أخبره تلميحا أو إسأله سؤالا يذكره بالسر ليكتبه برده
التلميح الذي يراه صديقك لا يمكن ان يكون فارغ
السر المشترك بينكما لا يمكن ان يترك فارغا !!
diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml
index 2f89f3ae6..b27481dd7 100644
--- a/src/main/res/values-bg/strings.xml
+++ b/src/main/res/values-bg/strings.xml
@@ -359,7 +359,7 @@
Неуспешна промяна на паролата
Изпратете съобщение, за да започнете нешифрован разговор
Задаване на въпрос
- Ако Вие и контакта Ви имате някаква тайна информация, която никой друг не знае (като някаква шега или пък просто какво сте обядвали, когато сте се срещнали за последно), можете да я използвате, за да проверите отпечатъците си един на друг.\n\nМожете да подсигурите подсказка или въпрос, на който контакта Ви да отговори, като има предвид, че главните и малките букви се броят за различни.
+ Ако Вие и контактът Ви имате някаква тайна информация, която никой друг не знае (като някаква шега или пък просто какво сте обядвали, когато сте се срещнали за последно), можете да я използвате, за да проверите отпечатъците си един на друг.\n\nМожете да подсигурите подсказка или въпрос, на който контактът Ви да отговори, като има предвид, че главните и малките букви се броят за различни.
Вашият контакт би искал да провери отпечатъка Ви, като Ви попита за обща тайна информация. Контактът Ви предостави следната подсказка или въпрос, който да Ви насочи към тази тайна.
Подсказката Ви не трябва да е празна
Общата Ви тайна не може да е празна
@@ -427,6 +427,21 @@
Няма намерено приложение за показване на местоположението
Местоположение
Получено местоположение
+ Conversation се затвори
+ Напуснахте беседата
+ Настройки на сертификата
+ Да не се вярва на системните сертификати
+ Всички сертификати трябва да бъдат одобрени на ръка
+ Премахване на сертификатите
+ Изтриване на сертификатите, одобрени на ръка
+ Няма сертификати, одобрени на ръка
+ Премахване на сертификатите
+ Изтриване на избраните
+ Отказ
+
+ - %d сертификат е изтрит
+ - %d сертификата са изтрити
+
- Изберете %d контакт
- Изберете %d контакта
diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml
index e50fa740e..a0861b167 100644
--- a/src/main/res/values-ca/strings.xml
+++ b/src/main/res/values-ca/strings.xml
@@ -359,7 +359,6 @@
No s\'ha pogut canviar la contrasenya
Començar a enviar un missatge de conversació xifrat
Fer una pregunta
- Si vosté i el seu contacte tenen un secret en comú que ningú més sap (com una broma o simplement el que tenia per dinar l\'última vegada que es va trobar) pot utilitzar aquest secret per comprovar les empremtes dactilars de cadascú. \ n\ n Proporcionarás una pista o una pregunta per a la seu contacte que respondrà amb una resposta entre majúscules i minúscules.
El seu contacte l\'hi agradaria verificar la seva empremta digital per un repte amb un secret compartit.El seu contacte proporciona el següent suggeriment o pregunta per aquest secret.
El seu suggeriment no pot estar buit
El teu secret compartit no pot estar buit
diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml
index 0c08fa7aa..f49cb1b98 100644
--- a/src/main/res/values-cs/strings.xml
+++ b/src/main/res/values-cs/strings.xml
@@ -427,6 +427,22 @@
Nebyla nalezena aplikace pro zobrazení pozice
Pozice
Přijmout pozici
+ Conversation zavřena
+ Opustil(a) konferenci
+ Nastavení certifikátu
+ Nedůvěřovat systémovým CA
+ Všechny certifikáty musí být schváleny ručně
+ Odstranit certifikáty
+ Smazat ručně povolené certifikáty
+ Žádné ručně povolené certifikáty
+ Odstranit certifikáty
+ Smazat výběr
+ Zrušit
+
+ - %d certifikát smazán
+ - %d certifikáty smazány
+ - %d certifikátů smazáno
+
- Vybrat %d kontakt
- Vybrat %d kontakty
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 0dd9f4011..08b0d4a5b 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -121,13 +121,13 @@
Annehmen
Ein unbekannter Fehler ist aufgetreten
Online-Status
- Erlaube neu hinzugefügten Kontakten deinen online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen
+ Erlaube neu hinzugefügten Kontakten meinen Online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen
Abonnements
Dein Konto
Schlüssel
- Anwesenheitsbenachrichtigungen senden
- Empfange Anwesenheitsbenachrichtigungen
- Frage um Erlaubnis, Anwesenheitsbenachrichtigungen sehen zu dürfen
+ Online-Status senden
+ Online-Status empfangen
+ Online-Status anfragen
Bild auswählen
Bild aufnehmen
Erlaube Statusanfrage vorab
@@ -255,12 +255,12 @@
Konferenz ist passwortgeschützt
Passwort eingeben
Fehlender Online-Status vom Kontakt
- Bitte erst Anwesenheitsbenachrichtigungen vom Kontakt anfordern.\n\n
+ Bitte erst Online-Status vom Kontakt anfragen.\n\nDies wird verwendet, um festzustellen, welche Client(s) der Kontakt benutzt.
Jetzt anfordern
Fingerabdruck löschen
Soll dieser Fingerabdruck gelöscht werden?
Ignorieren
- Achtung: Es kann zu unerwarteten Problemen führen, dies ohne gegenseitige Anwesenheitsbenachrichtigungen abzusenden.\n\nBitte die Online-Status-Abonnements in den Kontaktdetails prüfen.
+ Achtung: Ohne gegenseitig den Online-Status zu kennen, kann es zu unerwarteten Problemen kommen.\n\nBitte die Einstellungen in den Kontakt-Details prüfen.
Verschlüsselungs-Einstellungen
Ende-zu-Ende-Verschlüsselung erzwingen
Nachrichten immer verschlüsseln (außer für Konferenzen)
@@ -427,6 +427,21 @@
Keine App für die Standort-Anzeige gefunden
Standort
Standort empfangen
+ Unterhaltung beendet
+ Konferenz verlassen
+ Zertifikats-Optionen
+ Misstraue Zertifizierungsstellen
+ Alle Zertifikate müssen manuell bestätigt werden
+ Zertifikate löschen
+ Als vertrauenswürdig bestätigte Zertifikate löschen
+ Keine manuell bestätigten Zertifikate
+ Zertifikate löschen
+ Auswahl löschen
+ Abbrechen
+
+ - %d Zertifikat gelöscht
+ - %d Zertifikate gelöscht
+
- %d Kontakt ausgewählt
- %d Kontakte ausgewählt
diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml
index 48dc40341..01b33908d 100644
--- a/src/main/res/values-el/strings.xml
+++ b/src/main/res/values-el/strings.xml
@@ -359,7 +359,7 @@
Δεν ήταν δυνατή η αλλαγή του συνθηματικού
Αποστολή μηνύματος για την έναρξη κρυπτογραφημένης συνομιλίας
Ερώτηση
- Αν εσείς και η επαφή σας έχετε ένα κοινό μυστικό που κανείς άλλος δεν γνωρίζει (κάτι σαν δικό σας αστείο ή απλώς τι φάγατε την τελευταία φορά που συναντηθήκατε) μπορείτε να χρησιμοποιήσετε αυτό το μυστικό για νε επαληθεύσετε τα αποτυπώματά σας.\n\nΠροσφέρετε έναν υπαινιγμό ή μια ερώτηση για την επαφή σας, που θα απαντήσει με μια φράση στην οποία έχουν διαφοροποίηση τα πεζά από τα κεφαλαία.
+ Αν εσείς και η επαφή σας έχετε ένα κοινό μυστικό που κανείς άλλος δεν γνωρίζει (κάτι σαν δικό σας αστείο ή απλώς τι φάγατε την τελευταία φορά που συναντηθήκατε) μπορείτε να χρησιμοποιήσετε αυτό το μυστικό για να επαληθεύσετε τα αποτυπώματά σας.\n\nΠροσφέρετε έναν υπαινιγμό ή μια ερώτηση για την επαφή σας, που θα απαντήσει με μια φράση στην οποία έχουν διαφοροποίηση τα πεζά από τα κεφαλαία.
Η επαφή σας θα ήθελε να επαληθεύσει το αποτύπωμά σας χρησιμοποιώντας ένα κοινό μυστικό. Η επαφή σας προμήθευση τον παρακάτω υπαινιγμό ή ερώτηση για το μυστικό αυτό.
Ο υπαινιγμός σας δεν μπορεί να είναι κενός
Το κοινό μυστικό σας δεν μπορεί να είναι κενό
@@ -427,4 +427,23 @@
Δεν βρέθηκε εφαρμογή για την απεικόνιση τοποθεσίας
Τοποθεσία
Ελήφθη τοποθεσία
+ Η συζήτηση έκλεισε
+ Έφυγε από την συνδιάσκεψη
+ Επιλογές πιστοποιητικών
+ Μη έμπιστες αρχές πιστοποίησης συστήματος
+ Όλα τα πιστοποιητικά πρέπει να εγκριθούν χειροκίνητα
+ Αφαίρεση πιστοποιητικών
+ Διαγραφή με μη αυτόματο τρόπο των αναγνωρισμένων πιστοποιητικών
+ Δεν υπάρχουν με μη αυτόματο τρόπο αναγνωρισμένα πιστοποιητικα
+ Αφαίρεση πιστοποιητικών
+ Διαγραφή επιλογής
+ Ακύρωση
+
+ - %d πιστοποιητικο διαγραφθηκε
+ - %d πιστοποιητικά διαγραφθηκαν
+
+
+ - Επιλογή %d επαφής
+ - Επιλογή %d επαφών
+
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 639eddfaf..109715e30 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -359,7 +359,7 @@
No se puede cambiar la contraseña
Enviar mensaje para empezar una conversación cifrada
Haz una pregunta
- Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como un pequeño juego o broma o simplemente lo que tomasteis para comer la última vez os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas.
+ Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como una broma o simplemente lo que tomasteis para comer la última vez que os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas.
Tu contacto quiere verificar tu huella digital a través de un secreto compartido. Te hace la siguiente sugerencia o pregunta para ese secreto.
La pregunta no puede ser vacía
El secreto compartido no puede ser vacío
@@ -427,4 +427,23 @@
No se ha encontrado ninguna aplicación para mostrar la ubicación
Ubicación
Ubicación recibida
+ Conversación cerrada
+ Has salido de la conversación
+ Opciones de Certificados
+ No confiar en los CAs del sistema
+ Todos los certificados deben ser aprobados manualmente
+ Eliminar Certificados
+ Eliminar manualmente certificados aceptados
+ No aceptar certificados manualmente
+ Eliminar Certificados
+ Eliminar seleccionados
+ Cancelar
+
+ - %d certificado eliminado
+ - %d certificados eliminados
+
+
+ - Seleccionado %d contacto
+ - Seleccionados %d contactos
+
diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml
index 4d81c1bfa..ac66bfc1e 100644
--- a/src/main/res/values-eu/strings.xml
+++ b/src/main/res/values-eu/strings.xml
@@ -427,4 +427,23 @@
Kokapena erakutsi dezakeen aplikaziorik ez da aurkitu
Kokapena
Kokapena jaso da
+ Elkarrizketa itxi egin da
+ Konferentzia utzi egin da
+ Ziurtagirien aukerak
+ Sistemaren CAtaz ez fidatu
+ Ziurtagiri guztiak eskuz onartu behar dira
+ Ziurtagiriak kendu
+ Eskuz ezabatu onartutako ziurtagiriak
+ Ez dago eskuz onartutako ziurtagiririk
+ Ziurtagiriak kendu
+ Aukeratutakoak ezabatu
+ Utzi
+
+ - Ziurtagiri %d ezabatua
+ - %d ziurtagiri ezabatuak
+
+
+ - Hautatu kontaktu %d
+ - Hautatu %d kontaktu
+
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 69440362c..4baef67f6 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -359,7 +359,6 @@
Impossible de changer le mot de passe
Envoyez un message pour commencer la conversation chiffrée
Poser une question
- Si vous et votre contact avez un secret en commun connu par vous deux uniquement (comme une histoire personnelle ou même comme ce que vous avez mangé lors de votre dernière rencontre) vous pouvez utiliser ce secret pour vérifier vos empreintes respectives.\n\nVous envoyez un indice ou une question à votre contact qui devra répondre en faisant attention à la casse.
Votre contact voudrait vous identifier de manière sûre grâce à un secret commun. Il vous envoie le message ou la question suivante.
Votre indice ne devrait pas être vide
Votre secret ne peut être vide
@@ -427,4 +426,8 @@
Aucune application trouvée pour afficher la position
Position
Position reçue
+
+ - %d contact séléctionné
+ - %d contacts séléctionnés
+
diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml
new file mode 100644
index 000000000..69bd09112
--- /dev/null
+++ b/src/main/res/values-id/strings.xml
@@ -0,0 +1,447 @@
+
+
+ Pengaturan
+ Percakapan Baru
+ Pengaturan Akun
+ Akhiri Percakapan
+ Detil Kontak
+ Detil conference
+ Amankan Percakapan
+ Tambah Akun
+ Ubah Nama
+ Tambah ke buku telepon
+ Hapus dari roster
+ Blokir kontak
+ Batal blokir kontak
+ Blokir domain
+ Batal blokir domain
+ Pengaturan Akun
+ Pengaturan
+ Conference Detil
+ Kontak Detil
+ Bagikan dengan Conversation
+ Mulai Percakapan
+ Pilih kontak
+ Daftar blokir
+ sekarang
+ 1 min lalu
+ %d min lalu
+ Percakapan belum dibaca
+ mengirim...
+ Menerjemahkan pesan. Tunggu sebentar...
+ Nick ini sudah digunakan
+ Administrator
+ Pemilik
+ Moderator
+ Peserta
+ Pengunjung
+ Apakah Anda ingin menghapus %s dari roster Anda? Percakapan yang terkait dengan kontak ini tidak akan dihapus.
+ Apakah Anda ingin memblokir pesan dari %s?
+ Apakah Anda ingin membuka blokir %s dan membolehkannya untuk mengirim pesan?
+ Blokir semua kontak dari %s?
+ Batalkan blokir semua kontak dari %s?
+ Kontak terblokir
+ Apakah Anda ingin menghapus %s dari bookmark? Percakapan yang terkait dengan bookmark ini tidak akan dihapus.
+ Daftarkan akun baru di server
+ Ganti password di server
+ Bagikan dengan...
+ Mulai Percakapan
+ Undang Kontak
+ Kontak
+ Batal
+ Atur
+ Tambah
+ Ubah
+ Hapus
+ Blokir
+ Batalkan blokir
+ Simpan
+ YA
+ Percakapan terhenti
+ Dengan mengirimkan laporan kesalahan Anda membantu pengembangan Conversations\n<b>Perhatian:</>Conversations akan menggunakan akun XMPP Anda untuk mengirim laporan kesalahan untuk pengembang.
+ Kirim sekarang
+ Jangan tanya lagi
+ Tidak terhubung ke akun
+ Tidak bisa terhubung ke banyak akun
+ Sentuh untuk mengatur akun
+ Sisipkan berkas
+ Kontak tidak ada dalam roster Anda. Ingin menambahkannya?
+ Tambah kontak
+ pengiriman gagal
+ ditolak
+ Mempersiapkan gambar untuk transmisi
+ Bersihkan riwayat
+ Hapus Riwayat Percakapan
+ Apakah Anda ingin menghapus semua pesan dalam Percakapan ini\n\nPeringatan:ini tidak akan mempengaruhi pesan yang disimpan pada perangkat atau server lain.
+ Hapus pesan
+ Akhiri percakapan setelahnya
+ Pilih kehadiran untuk kontak
+ Kirim pesan teks biasa
+ Kirim pesan terenskripsi OTR
+ Kirim pesan terenskripsi OpenPGP
+ Nick kamu telah dirubah
+ Unduh Gambar
+ Kirim tidak terenkripsi
+ Dekripsi gagal. Mungkin Anda tidak memiliki kunci pribadi yang tepat.
+ OpenKeychain
+ Conversations menggunakan app pihak ke-3 bernama OpenKeychain untuk mengenkripsi dan menerjemahkan pesan dan mengorganisir kunci anda.\n\nOpenKeychain berlisensi GPLv3 dan tersedia fi F-Droid dan Google play.\n\n(Silahkan mulai ulang Conversations setelah menginstall.)
+ Mulai ulang
+ Pasang
+ menawarkan...
+ menunggu...
+ Tidak ada kunci OpenPGP ditemukan
+ Conversations tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publiknya.\n\nSilakan meminta kontak Anda untuk menyetel OpenPGP
+ Tidak ada kunci OpenPGP ditemukan
+ Percakapan tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publik mereka.\n\nSilakan meminta kontak Anda untuk setup OpenPGP.
+ Pesan terenkripsi diterima. Sentuh untuk membongkar dan melihatnya.
+ Umum
+ XMPP resource
+ Identifikasi nama klien ini dengan
+ Terima berkas
+ Otomatis menerima berkas lebih kecil dari...
+ Pengaturan Notifikasi
+ Notifikasi
+ Notifikasikan jika pesan baru tiba
+ Getar
+ Juga aktifkan getaran bila pesan baru tiba
+ Suara
+ mainkan suara saat menerima notifikasi
+ Notifikasi Conference
+ Selalu memberitahukan bila pesan conference baru diterima daripada hanya dicetak tebal
+ Tenggang waktu pemberitahuan
+ Nonaktifkan pemberitahuan untuk waktu yang singkat setelah salinan diterima
+ Opsi Lanjutan
+ Jangan kirim laporan kerusakan
+ Dengan mengirimkan kesalahan Anda membantu pengembangan Aplikasi Conversations
+ Konfirmasi Pesan
+ Biarkan kontak Anda tahu kapan Anda telah menerima dan membaca pesan
+ Opsi Tampilan
+ OpenKeychain melaporkan kesalahan
+ I/O Error menerjemahkan berkas
+ Menerima
+ Sebuah kesalahan terjadi
+ Memberikan perubahan kehadiran
+ Terlebih dahulu meminta dan berlangganan kehadiran untuk kontak Anda buat
+ Langganan
+ Akun anda
+ Kunci
+ Kirim pembaruan kehadiran
+ Terima pembaruan kehadiran
+ Tanya untuk pembaruan kehadiran
+ Pilih gambar
+ Ambil gambar
+ Ijinkan permintaan berlangganan
+ Berkas yang anda pilih bukan gambar
+ Terjadi kesalahan saat mengubah berkas gambar
+ Berkas tidak ditemukan
+ Kesalahan Umum I/O. Mungkin Anda kehabisan ruang penyimpanan?
+ Aplikasi yang digunakan untuk memilih gambar tidak memberikan izin untuk membaca file.\n\n Gunakan file manager yang berbeda untuk memilih gambar
+ Tidak diketahui
+ Sementara dimatikan
+ Online
+ Menghubungkan\u2026
+ Offline
+ Tidak mendapat izin
+ Server tidak ditemukan
+ Tidak ada koneksi
+ Registrasi gagal
+ Username telah digunakan
+ Registrasi berhasil
+ Server tidak mendukung pendaftaran akun.
+ Kesalahan keamanan
+ Server tidak cocok
+ Teks biasa
+ OTR
+ OpenPGP
+ Ubah akun
+ Hapus akun
+ Sementara dimatikan
+ Publikasikan avatar
+ Publikasikan kunci OpenPGP
+ Aktifkan Akun
+ Apakah Anda yakin.?
+ Jika Anda menghapus akun, semua data percakapan Anda di Conversation akan hilang.
+ Rekam suara
+ Jabber ID
+ Password
+ username@example.com
+ Ketik ulang password
+ Password
+ Ketik ulang password
+ Password tidak sama
+ Jabber ID tidak valid
+ Memori habis. Gambar terlalu besar
+ Apakah anda ingin menambahkan %s ke daftar kontak anda?
+ online
+ bebas untuk chatting
+ pergi
+ pergi lama
+ jangan ganggu
+ offline
+ Conference
+ Member lainnya
+ Info Server
+ XEP-0313: MAM
+ XEP-0280: Message Carbons
+ XEP-0352: Client State Indication
+ XEP-0191: Blocking Command
+ XEP-0237: Roster Versioning
+ XEP-0198: Stream Management
+ XEP-0163: PEP (Avatars)
+ tersedia
+ tidak tersedia
+ Pemberitahuan kunci publik tidak ditemukan
+ terakhir terlihat sekarang
+ terakhir terlihat 1 menit lalu
+ terlihat %d menit lalu
+ terlihat 1 jam lalu
+ terlihat %d jam lalu
+ terlihat 1 hari lalu
+ terlihat %d hari lalu
+ tidak pernah terlihat
+ Pesan terenskripsi. Pasang OpenKeychain untuk menerjemahkan
+ Sidik OTR tidak diketahui
+ pesan terkunci OpenPGP ditemukan
+ Penerimaan gagal
+ Fingerprint Anda
+ OTR fingerprint
+ Verifikasi
+ Deskripsi
+ Conferences
+ Cari
+ Buat Kontak
+ Gabung Conference
+ Hapus Kontak
+ Lihat detil kontak
+ Blokir kontak
+ Lepas blokir kontak
+ Buat
+ Kontak ini sudah ada
+ Gabung
+ Alamat conference
+ room@conference.example.com
+ Simpan sebagai bookmark
+ Hapus bookmark
+ Bookmark ini sudah ada
+ Anda
+ Ubah subjek conference
+ Conference tidak ditemukan
+ Tinggalkan
+ Kontak ditambahkan ke daftar anda
+ Tambah kembali
+ %s telah membaca hingga disini
+ Publikasi
+ Sentuh Avatar untuk memilih gambar dari gallery
+ Harap dicatat: Setiap orang yang berlangganan update kehadiran Anda akan diizinkan untuk melihat gambar ini.
+ Mempublikasi...
+ Server tidak mengijinkan publikasi Anda
+ Sesuatu yang salah terjadi ketika mengkonversi gambar anda
+ Tidak dapat menyimpan Avatar ke memori
+ (Tekan yang lama untuk mengembalikan semula)
+ Server Anda tidak mendukung publikasi Avatar
+ berbisik
+ kepada %s
+ Kirim pesan pribadi ke %s
+ Hubungkan
+ Akun ini sudah ada
+ Selanjutnya
+ Sesi saat didirikan
+ Informasi tambahan
+ Lewati
+ Nonaktifkan notifikasi
+ Nonaktifkan notifikasi untuk percakapan ini
+ Notifikasi telah dimatikan
+ Aktifkan
+ Conference membutuhkan password
+ Masukan password
+ Pembaruan kehadiran hilang dari kontak
+ Silakan meminta pembaruan kehadiran dari kontak Anda lebih dulu.\n\nIni akan digunakan untuk menentukan (klien) mana yang digunakan dikontak Anda.
+ Request sekarang
+ Hapus sidik jari
+ Apakah anda yakin menghapus sidik jari?
+ Abaikan
+ Perhatian Mengirim ini tanpa kehadiran sesama pembaruan bisa menyebabkan masalah tak terduga.\n\nPergi ke kontak untuk memverifikasi langganan kehadiran anda.
+ Pengaturan enskripsi
+ Paksa enskripsi end-to-end
+ Selalu mengirim pesan terenkripsi (kecuali untuk conferences)
+ jangan simpan pesan terenskripsi
+ Peringatan: Hal ini bisa mengakibatkan hilangnya pesan
+ Pengaturan lanjutan
+ Harap berhati-hati dengan ini
+ Tentang Conversations
+ Build dan informasi lisensi
+ Waktu sunyi
+ Waktu mulai
+ Waktu selesai
+ Aktifkan waktu sunyi
+ Pemberitahuan akan disunyukan ketika jam sunyi.
+ Perbesar ukuran huruf
+ Gunakan ukuran huruf lebih besar diseluruh aplikasi
+ Tombol kirim menunjukan statusnya
+ Permintaan penerimaan pesan
+ Pesan yang diterima akan ditambahkan centang hijau jika didukung
+ Warnai tombol kirim untuk mengindikasikan status kontak
+ Lainnya
+ nama Conference
+ Gunakan subjek \'room\' daripada JID untuk mengidentifikasi conferences
+ sidik jari OTR disalin ke clipboard!
+ Anda ditendang dari conference ini
+ Conference ini hanya untuk member terdaftar
+ Anda telah ditendang dari conference ini
+ menggunakan akun %s
+ Mengecek gambar di host HTTP
+ Berkas gambar telah dihapus
+ Anda tidak terhubung. Coba lagi nanti
+ Cek ukuran berkas gambar
+ Opsi pesan
+ Salin teks
+ Salin URL asli
+ Kirim lagi
+ URL gambar
+ Pesan teks
+ URL disalin ke clipboard
+ Pesan disalin ke clipboard
+ pengiriman gambar gagal
+ Pindai kode QR
+ Tampilkan kode QR
+ Tampilkan daftar blokir
+ Detil akun
+ Verifikasi OTR
+ Remote Sidik jari
+ pindai
+ (atau menyentuh telepon)
+ Socialist Millionaire Protocol
+ Petunjuk atau Pertanyaan
+ Rahasia bersama
+ Konfirmasi
+ Sedang diproses
+ Menanggapi
+ Gagal
+ Rahasia tidak match
+ Coba lagi
+ Selesai
+ Terverifikasi!
+ Kontak meminta verifikasi SMP
+ Tidak ada sesi OTR yang valid ditemukan!
+ Percakapan
+ Jaga layanan di latar depan
+ Cegah sistem operasi mematikan koneksi
+ Pilih berkas
+ Menerima %1$s (%2$d%% terselesaikan)
+ Mengunduh %s
+ berkas
+ Buka %s
+ mengirim (%1$d%% terselesaikan)
+ Menyiapkan berkas untuk transmisi
+ %s ditawarkan untuk mengunduh
+ batalkan pengiriman
+ pengiriman berkas gagal
+ Berkas sudah dihapus
+ Tidak ditemukan aplikasi untuk membuka berkas
+ Tidak dapat verifikasi fingerprint
+ Verifikasi secara manual
+ Yakin untuk memferifikasi OTR fingerprint kontak Anda?
+ Tampilkan tag dinamis
+ Tampilan read-only tag di bawah kontak
+ Aktifkan notifikasi
+ Buat conference dengan...
+ Tidak ada server conference ditemukan
+ Pembuatan conference gagal!
+ Conference dibuat!
+ Rahasia disetujui!
+ Ulang
+ Avatar akun
+ Salin OTR fingerprint ke clipboard
+ Mengambil data dari server
+ Tidak ada data lagi di server
+ Merubah...
+ Password diganti!
+ Tidak dapat mengubah password
+ Kirim pesan untuk memulai obrolan dienkripsi
+ Bertanya
+ Jika Anda dan kontak Anda memiliki rahasia yang sama yang tidak ada orang lain yang tahu (seperti sebuah lelucon atau hanya apa yang Anda punya untuk makan siang terakhir kali Anda bertemu) Anda dapat menggunakan rahasia itu untuk memverifikasi sidik jari masing-masing.\n\nAnda memberikan petunjuk atau pertanyaan untuk kontak yang akan merespon dengan jawaban case-sensitive.
+ Kontak Anda ingin memverifikasi sidik jari Anda dengan menantang Anda dengan rahasia bersama. Kontak Anda memberikan petunjuk berikut atau pertanyaan untuk rahasia itu.
+ Petunjuk Anda tidak boleh kosong
+ Rahasia bersama Anda tidak boleh kosong
+ Hati-hati membandingkan sidik jari yang ditunjukkan di bawah dengan sidik jari kontak Anda.\nAnda dapat mengunakan layanan komunikasi terpercaya seperti e-mail terenskripsi atau panggilan telepon untuk menukarkannya.
+ Ubah password
+ Password sekarang
+ Password baru
+ Password tidak boleh kosong
+ Aktifkan semua akun
+ Menonaktifkan semua account
+ Lakukan aksi dengan
+ Tidak ada afiliasi
+ Tidak ada peran
+ Orang buangan
+ Member
+ Mode lanjut
+ Memberikan keanggotaan
+ Cabut keanggotaan
+ Memberikan hak istimewa admin
+ Mencabut hak istimewa admin
+ Hapus dari conference
+ Tidak bisa mengubah afiliasi %s
+ Tendang dari conference
+ Anda mencoba untuk menghapus %s dari sebuah conference publik. Satu-satunya cara untuk melakukannya adalah untuk menendang pengguna ini selamanya.
+ Tendang sekarang
+ Tidak dapat merumah role %s
+ Conference umum
+ Rahasia, hanya member conference
+ Opsi conference
+ Rahasia (Hanya member)
+ Non Anonymous
+ Opsi conference dimodifikasi!
+ Tidak dapat merubah pengaturan conference
+ Tidak pernah
+ 30 menit
+ 1 jam
+ 2 jam
+ 8 jam
+ Sampai pemberitahuan selanjutnya
+ Opsi input
+ Enter untuk mengirim
+ Gunakan enter untuk mengrim pesan
+ Tampilkan masukan kunci
+ Mengubah kunci emoji untuk memasukan kunci
+ audio
+ video
+ Gambar
+ Berkas PDF
+ Apl Android
+ Kontak
+ Diterima %s
+ Nonaktifkan layanan latar belakang
+ Sentuh untuk membuka Conversations
+ Avatar telah diterbitkan!
+ Mengirim %s
+ Menawarkan %s
+ Sembunyikan Offline
+ Nonaktifkan Akun
+ %s sedang mengetik...
+ %s telah berhenti mengetik
+ Notifikasi ketik pesan
+ Biarkan kontak Anda tahu ketika Anda sedang menulis pesan baru
+ Kirim lokasi
+ Tampilkan lokasi
+ Tidak ada aplikasi ditemukan untuk menampilkan lokasi
+ Lokasi
+ Lokasi yang diterima
+ Percakapan tertutup
+ Tinggalkan conference
+ Opsi Sertifikat
+ Jangan percaya sistem CA
+ Semua sertifikat harus disetujui secara manual
+ Hapus sertifikat
+ Hapus sertifikat yang disahkan secara manual
+ Tidak ada sertifikat yang disahkan secara manual
+ Hapus sertifikat
+ Hapus seleksi
+ Batal
+
+ - %d sertifikat dihapus
+
+
+ - Pilih %d kontak
+
+
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index c32e95854..8960f60b5 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -304,6 +304,7 @@
Trasmissione dell’immagine fallita
Scansiona codice QR
Mostra codice QR
+ Mostra la black list
Dettagli utente
Verifica OTR
Impronta remota
@@ -328,6 +329,7 @@
Scegli file
Ricezione di %1$s file (%2$d%% completato)
Scarica %s
+ file
Apri %s
invio (%1$d%% completato)
Preparazione alla trasmissione del file
@@ -357,7 +359,7 @@
Impossibile cambiare la password
Invia un messaggio per avviare una conversazione cifrata
Fai una domanda
- Se tu ed il tuo contatto avete un segreto in comune che nessun’altro conosce (come uno scherzo o semplicemente ciò che avete mangiato a pranzo l’ultima volta che vi siete incontrati), potete usare quel segreto per dimostrare la vostra identità reciprocamente.\n\nFornisci un suggerimento o una domanda al tuo contatto che ti risponderà con una domanda Case Sensitive.
+ Se condividi con il tuo contatto un segreto in comune non conosciuto da altri (come uno scherzo privato o semplicemente quel che avete mangiato l\'ultima volta insieme) potete usarlo per verificare le vostre fingerprint.\n\nInvia un suggerimento o una domanda al tuo contatto il quale dovrà rispondere con una risposta controllando le maiuscole.
Il tuo contatto vorrebbe verificare la tua identità. Dovrai rispondere correttamente alla sua domanda con una risposta che condividete. Il tuo contatto ti ha fornito il suggerimento o la domanda seguente.
Il suggerimento non dovrebbe essere vuoto
Il segreto condiviso non può essere vuoto
@@ -400,6 +402,46 @@
Opzioni di ingresso
Invio invia
Il tasto invio spedisce il messaggio
+ Mostra il tasto invio
+ Cambia il tasto delle faccine nel tastodi invio
+ audio
+ video
+ immagine
Documento PDF
+ Applicazione Android
+ Contatto
Ricevuto %s
+ Tocca per avviare Conversations
+ Il tuo avatar è stato pubblicato!
+ Invio %s
+ Inviando %s
+ Nascondi i contatti offline
+ Disabilita l\'account
+ %s sta digitando...
+ %s ha smesso di digitare
+ Permetti al tuo contatto di vedere quando stai digitando
+ Invia la posizione
+ Mostra la posizione
+ Non è stata trovata alcuna applicazione per mostrare la posizione
+ Posizione
+ Posizione ricevuta
+ Conversazione interrotta
+ Conferenza terminata
+ Opzioni per i certificati
+ Non ti fidare delle CA di sistema
+ Tutti i certificati devono essere accettati manualmente
+ Elimina i certificati
+ Cancella manualmente i certificati già accettati
+ Non sono presenti certificati accettati manualmente
+ Elimina i certificati
+ Cancella la selezione
+ Annulla
+
+ - Cancellato il %d certificato
+ - Cancellati %d certificati
+
+
+ - Seleziona il %d contatto
+ - Selezionati %d contatti
+
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
new file mode 100644
index 000000000..35fb5472e
--- /dev/null
+++ b/src/main/res/values-ja/strings.xml
@@ -0,0 +1,447 @@
+
+
+ 設定
+ 新しい会話
+ アカウントの管理
+ この会話を終了
+ 連絡先の詳細
+ 会議の詳細
+ 安全に会話
+ アカウントを追加
+ 名前の編集
+ 電話帳に追加
+ 名簿から削除
+ 連絡先をブロック
+ 連絡先のブロックを解除
+ ドメインをブロック
+ ドメインのブロックを解除
+ アカウントの管理
+ 設定
+ 会議の詳細
+ 連絡先の詳細
+ 会話で共有
+ 会話の開始
+ 連絡先の選択
+ ブロックリスト
+ ちょうど今
+ 1 分前
+ %d 分前
+ 未読の会話
+ 送信中…
+ メッセージを復号しています。しばらくお待ちください…
+ ニックネームは既に使用されています
+ 管理者
+ オーナー
+ モデレーター
+ 参加者
+ ビジター
+ あなたの名簿から %s を削除しますか? この連絡先と関連した会話は削除されません。
+ %s からあなたに送信されるメッセージをブロックしますか?
+ %s のブロックを解除し、あなたにメッセージを送信できるようにしますか?
+ %s からの連絡をすべてブロックしますか?
+ %s からの連絡をすべてブロック解除しますか?
+ 連絡先をブロックしました
+ ブックマークとして %s を削除しますか? このブックマークに関連した会話は削除されません。
+ サーバーに新しいアカウントを登録
+ サーバーのパスワードを変更
+ …で共有
+ 会話を開始
+ 連絡先を招待
+ 連絡先
+ キャンセル
+ 設定
+ 追加
+ 編集
+ 削除
+ ブロック
+ ブロックを解除
+ 保存
+ OK
+ Conversations がクラッシュしました
+ Conversations の継続的な開発を支援するために、スタックトレースをお送りください。\n警告: あなたのXMPPアカウントを使用して、開発者にスタックトレースを送信します。
+ 今すぐ送信
+ 今後表示しない
+ アカウントに接続できません
+ 複数のアカウントに接続できません
+ ここをタッチして、アカウントの管理
+ 添付ファイル
+ 連絡先が名簿にありません。追加しますか?
+ 連絡先を追加
+ 配信に失敗しました
+ 拒否されました
+ 転送用画像の準備中
+ 履歴をクリア
+ 会話履歴をクリア
+ この会話のすべてのメッセージを削除しますか?\n\n警告: これは、他のデバイスやサーバーに保存されているメッセージには影響しません。
+ メッセージを削除
+ その後、この会話を終了
+ 連絡する参加を選択
+ プレーンテキストを送信
+ OTR 暗号化メッセージを送信
+ OpenPGP 暗号化メッセージを送信
+ あなたのニックネームが変更されました
+ 画像のダウンロード
+ 暗号化されていない送信
+ 復号化に失敗しました。おそらく秘密鍵が正しくないようです。
+ OpenKeychain
+ Conversations は OpenKeychain と呼ばれるサードパーティのアプリを利用して、メッセージの暗号化および復号化、そしてあなたの公開鍵を管理します。\n\nOpenKeychain は GPLv3 ライセンスの下で、F-Droid および Google Play から利用可能です。\n\n(後で Conversations を再起動してください。)
+ 再起動
+ インストール
+ 依頼中…
+ 待機中…
+ OpenPGP の鍵はありません
+ 連絡先が公開鍵を通知しないため、Conversations はあなたのメッセージを暗号化することができません。\n\n連絡先に OpenPGP をセットアップするように依頼してください。
+ OpenPGP の鍵はありません
+ 連絡先が公開鍵を通知しないため、Conversations はあなたのメッセージを暗号化することができません。\n\n連絡先に OpenPGP をセットアップするように依頼してください。
+ 暗号化されたメッセージを受信しました。タッチすると、表示および復号化します。
+ 全般
+ XMPP リソース
+ 自分自身を識別するこのクライアントの名前
+ ファイルを受取
+ 自動的に小さいファイルを受取…
+ 通知設定
+ 通知
+ 新しいメッセージが到着したときに通知します
+ 振動
+ 新しいメッセージが到着したときに振動もします
+ サウンド
+ 通知で着信音を再生します
+ 会議通知
+ 新しい会議メッセージが到着したとき、ハイライト表示ではなく、常に通知します
+ 通知猶予期間
+ カーボンコピーを受信した後、短時間、通知を無効にします
+ 詳細オプション
+ クラッシュレポートを送信しない
+ スタックトレースを送信することで、あなたは Conversations の継続的な開発を支援しています
+ メッセージの確認
+ あなたがメッセージを受け取って読んだことを、連絡先に知らせます
+ UI オプション
+ OpenKeychain がエラーを報告しました
+ ファイルの復号化中に I/O エラー
+ 受付
+ エラーが発生しました
+ 参加アップデートの権限を付与
+ 事前に、作成した連絡先に対して権限を付与して、参加のサブスクリプションを求めます
+ サブスクリプション
+ あなたのアカウント
+ 鍵
+ 参加アップデートを送信
+ 参加アップデートを受信
+ 参加アップデートを問合せ
+ 写真の選択
+ 写真の撮影
+ 事前にサブスクリプション要求を許可する
+ 選択したファイルは画像ではありません
+ 画像ファイルの変換中にエラー
+ ファイルが見つかりません
+ 一般的な I/O エラー。おそらく空き容量がなくなっていませんか?
+ 選択した画像ファイルは、読み取りに必要なアクセス権がありません。\n\n別のファイルマネージャを使用して、画像を選択してください。
+ 不明
+ 一時的に無効
+ オンライン
+ 接続中\u2026
+ オフライン
+ 許可されていません
+ サーバーが見つかりません
+ 接続エラー
+ 登録に失敗しました
+ ユーザー名はすでに使用されています
+ 登録が完了しました
+ サーバーが登録をサポートしていません
+ セキュリティ エラー
+ 互換性のないサーバー
+ プレーンテキスト
+ OTR
+ OpenPGP
+ アカウントの編集
+ アカウントを削除
+ 一時的に無効にする
+ アバターを公開
+ OpenPGP 公開鍵を公開
+ アカウントを有効にする
+ よろしいですか?
+ アカウントを削除するとあなたの会話履歴がすべて失われます
+ 音声を録音
+ Jabber ID
+ パスワード
+ username@example.com
+ パスワードを確認
+ パスワード
+ パスワードを確認
+ パスワードが一致しません
+ これは有効な Jabber ID ではありません
+ メモリ不足です。画像が大きすぎます
+ 電話の連絡先リストに %s を追加しますか?
+ オンライン
+ 自由にチャットできます
+ 離席中
+ 長時間離席中
+ じゃましないで
+ オフライン
+ 会議
+ 他のメンバー
+ サーバー情報
+ XEP-0313: メッセージ アーカイブ管理
+ XEP-0280: メッセージ カーボン
+ XEP-0352: クライアント状態表示
+ XEP-0191: ブロッキング コマンド
+ XEP-0237: 名簿バージョニング
+ XEP-0198: ストリーム管理
+ XEP-0163: 個人イベントプロトコル (アバター)
+ 利用可能
+ 利用不可
+ 公開鍵の通知がありません
+ ちょうど今会いました
+ 1 分前に会いました
+ %d 分前に会いました
+ 1 時間前に会いました
+ %d 時間前に会いました
+ 1 日前に会いました
+ %d 日前に会いました
+ 会ったことはありません
+ 暗号化されたメッセージ。復号化するには OpenKeychain をインストールしてください。
+ 不明な OTR フィンガープリント
+ OpenPGP 暗号化されたメッセージが見つかりました
+ 受信に失敗しました
+ あなたのフィンガープリント
+ OTR フィンガープリント
+ 検証
+ 復号化
+ 会議
+ 検索
+ 連絡先を作成
+ 会議に参加
+ 連絡先を削除
+ 連絡先の詳細を表示
+ 連絡先をブロック
+ 連絡先のブロックを解除
+ 作成
+ 連絡先はすでに存在します
+ 参加
+ 会議アドレス
+ room@conference.example.com
+ ブックマークとして保存
+ ブックマークを削除
+ このブックマークはすでに存在します
+ あなた
+ 会議の件名を編集
+ 会議が見つかりません
+ 退出
+ 連絡先があなたを連絡先リストに追加しました
+ 戻りを追加
+ %s はここまで読みました
+ 公開
+ アバターをタッチしてギャラリーから画像を選択します
+ ご注意ください: あなたの参加アップデートを登録している人は、誰でもこの絵を見ることができます。
+ 公開中…
+ サーバーがあなたの公開を拒否しました
+ 写真の変換中に、何か問題が発生しました
+ ディスクにアバターを保存できませんでした
+ (または長押しするとデフォルトに戻します)
+ ご利用のサーバーは、アバターの公開をサポートしていません
+ ささやいた
+ %s に
+ プライベートメッセージを %s に送信
+ 接続
+ このアカウントはすでに存在します
+ 次へ
+ 現在のセッションが確立
+ 追加情報
+ スキップ
+ 通知を無効にする
+ この会話の通知を無効にします
+ 通知を無効にしました
+ 有効
+ 会議はパスワードが必要です
+ パスワードを入力してください
+ 連絡先からの参加アップデートがありません
+ 最初に連絡先から参加アップデートを要求してください。\n\nこれは、連絡先が何のクライアントを使用しているかを決めるために使用されます。
+ 今すぐ要求
+ フィンガープリントを削除
+ このフィンガープリントを削除してもよろしいですか?
+ 無視
+ 警告: 相互の参加アップデートなしにこれを送信すると、予期しない問題が発生する可能性があります。\n\nあなたの参加サブスクリプションを検証するために、連絡先の詳細に移動します。
+ 暗号化設定
+ 強制的にエンドツーエンド暗号化を使用する
+ 常に暗号化されたメッセージを送信します (会議を除く)
+ 暗号化されたメッセージを保存しない
+ 警告: これはメッセージの損失につながる可能性があります
+ 上級者オプション
+ ご利用は注意してください
+ Conversations について
+ ビルドおよびライセンス情報
+ 消音時間
+ 開始時間
+ 終了時間
+ 消音時間を有効にする
+ 消音時間の間、通知は無音になります
+ フォントサイズを拡大
+ アプリ全体にわたって大きなフォントサイズを使用します
+ 送信ボタンにステータスを示す
+ 要求メッセージの受信
+ サポートされている場合、受信したメッセージに緑色のチェックマークが付きます
+ 送信ボタンに連絡先ステータスを示す色が付きます
+ その他
+ 会議名
+ 会議を識別するために JID の代わりにルームのテーマを使用します
+ OTR フィンガープリントをクリップボードにコピーしました!
+ あなたはこの会議から禁止されています
+ この会議はメンバーのみです
+ あなたはこの会議からキックされました
+ アカウント %s を使用
+ HTTP ホストの画像を確認中
+ 画像ファイルは削除されました
+ 接続されていません。後でもう一度お試しください
+ 画像ファイルのサイズを確認
+ メッセージオプション
+ テキストをコピー
+ 元の URL をコピー
+ 再送
+ 画像 URL
+ メッセージテキスト
+ URL をクリップボードにコピーしました
+ メッセージをクリップボードにコピーしました
+ 画像の転送に失敗しました
+ QR コードをスキャン
+ QR コードを表示
+ ブロックリストを表示
+ アカウントの詳細
+ OTR を検証
+ リモート フィンガープリント
+ スキャン
+ (または電話をタッチ)
+ ソーシャリスト ミリオネア プロトコル
+ ヒントまたは質問
+ 共有の秘密
+ 確認
+ 実行中
+ 応答
+ 失敗しました
+ 秘密が一致しません
+ 再度実行してください
+ 完了
+ 検証しました!
+ 連絡先が SMP 検証を要求しました
+ 有効な OTR セッションが見つかりません!
+ Conversations
+ サービスをフォアグラウンドに保持
+ オペレーティングシステムが接続を切断するのを防止します
+ ファイルの選択
+ %1$s 受信中 (%2$d%% 完了)
+ %s のダウンロード
+ ファイル
+ %s を開く
+ 送信中 (%1$d%% 完了)
+ 転送用ファイルの準備中
+ %s ダウンロード依頼中
+ 転送をキャンセル
+ ファイル転送に失敗しました
+ ファイルを削除しました
+ ファイルを開くアプリケーションが見つかりません
+ フィンガープリントを検証できません
+ 手動で検証
+ 連絡先の OTR フィンガープリントを検証してもよろしいですか?
+ ダイナミック タグを表示
+ 連絡先の下に、読み取り専用タグを表示します
+ 通知を有効にする
+ …と会議を作成
+ 会議サーバーが見つかりません
+ 会議の作成に失敗しました!
+ 会議を作成しました!
+ 秘密を受取ました!
+ リセット
+ アカウント アバター
+ OTR フィンガープリントをクリップボードにコピーしました
+ サーバーから履歴を取得中
+ サーバーにこれ以上履歴はありません
+ アップデート中…
+ パスワードを変更しました!
+ パスワードを変更できません
+ メッセージを送信して、暗号化されたチャットを開始します
+ 質問をたずねる
+ あなたと連絡先が、(内輪の冗談や、最後に会って食べた昼食などの) 他の誰も知らない共通の秘密を持っている場合、お互いのフィンガープリントを検証するために、その秘密を使用することができます。\n\nあなたはヒントまたは質問を提供して、連絡先は大文字と小文字を区別した答えで応答します。
+ 連絡先は共有の秘密であなたにチャレンジして、あなたのフィンガープリントを検証したいと思います。連絡先は秘密に対して、次のヒントまたは質問を提供しました。
+ あなたのヒントは空にできません。
+ あなたの共有の秘密は空にできません。
+ 慎重に、連絡先のフィンガープリントと、以下に表示されるフィンガープリントを比較してください。\nこれを交換するためには、暗号化されたメールや、電話のような信頼できる形式の通信を使用することができます。
+ パスワードの変更
+ 現在のパスワード
+ 新しいパスワード
+ パスワードは空にできません
+ すべてのアカウントを有効にする
+ すべてのアカウントを無効にする
+ アクションを実行...
+ 所属なし
+ 役割なし
+ 追放
+ メンバー
+ 詳細モード
+ メンバーシップを付与
+ メンバーシップを取消
+ 管理者権限を付与
+ 管理者権限を取消
+ 会議から削除
+ %s の所属を変更できません
+ 会議から禁止
+ 公開の会議から %s を削除しようとしています。そのための唯一の方法は、永久にそのユーザーを禁止することです。
+ 今すぐ禁止
+ %s の役割を変更できません
+ 公開アクセス可能な会議
+ プライベート、メンバーのみの会議
+ 会議オプション
+ プライベート (メンバーのみ)
+ 匿名でない
+ 会議オプションを変更しました!
+ 会議オプションを変更できません
+ なし
+ 30 分
+ 1 時間
+ 2 時間
+ 8 時間
+ 通知があるまで
+ 入力オプション
+ Enter は送信
+ Enter キーをメッセージの送信に使用します
+ Enter キーを表示
+ 絵文字キーを Enter キーに変更
+ オーディオ
+ ビデオ
+ 画像
+ PDF 文書
+ Android アプリ
+ 連絡先
+ %s を受信しました
+ フォアグラウンド サービスを無効にする
+ タッチして Conversations を開く
+ アバターを公開しました!
+ %s の送信中
+ %s の依頼中
+ オフラインを非表示にする
+ アカウントを無効にする
+ %s は入力中...
+ %s は入力を停止しました
+ 入力中通知
+ あなたが新しいメッセージを書いている時に、連絡先に知らせます
+ 位置を送信
+ 位置を表示
+ 位置を表示するアプリケーションが見つかりません
+ 位置
+ 位置を受信しました
+ 会話が閉じられました
+ 退出した会話
+ 証明書オプション
+ システムの CA を信頼しない
+ すべての証明書を手動で承認する必要があります
+ 証明書を削除
+ 手動で承認された証明書を削除します
+ 手動で承認された証明書はありません
+ 証明書を削除
+ 選択を削除
+ キャンセル
+
+ - %d 証明書を削除しました
+
+
+ - %d 連絡先を選択
+
+
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
new file mode 100644
index 000000000..d00ab0fd0
--- /dev/null
+++ b/src/main/res/values-ko/strings.xml
@@ -0,0 +1,447 @@
+
+
+ 설정
+ 새 대화
+ 계정
+ 이 대화
+ 연락처 정보
+ 회의 정보
+ 안전한 대화
+ 계정 추가
+ 이름 편집
+ 주소록에 추가
+ 명단에서 삭제
+ 연락처
+ 연락처 차단 해제
+ 도메인 차단
+ 도메인 차단 해제
+ 계정 관리
+ 설정
+ 회의 정보
+ 연락처 정보
+ 대화 공유
+ 대화 시작
+ 연락처 선택
+ 목록 차단
+ 방금
+ 1분 전
+ %d 분 전
+ 읽지 않은 대화
+ 보내는중...
+ 메세지 복호화중입니다. 기다리세요...
+ 사용중인 별명입니다
+ 관리자
+ 소유자
+ 중재자
+ 참가자
+ 방문자
+ %s 를 당신의 명단에서 삭제하시겠습니까? 이 연락처와 연관된 대화는 삭제되지 않습니다.
+ %s 이(가) 당신에게 메세지를 보내지 못하도록 차단할까요?
+ %s 로부터 메세지를 받을 수 있도록 차단을 해제할까요?
+ %s 의 모든 연락처를 차단할까요?
+ %s 의 모든 연락처를 차단 해제할까요?
+ 연락처 차단됨
+ %s 를 즐겨찾기에서 삭제할까요? 이 즐겨찾기와 연관된 대화는 삭제되지 않습니다.
+ 서버에서 새 계정을 등록
+ 서버에서 비밀번호 변경
+ 공유
+ 대화 시작
+ 연락처 초대
+ 연락처
+ 취소
+ 설정
+ 추가
+ 편집
+ 삭제
+ 차단
+ 차단 해제
+ 저장
+ 확인
+ Conversations가 작동 중지되었습니다
+ Stack trace 정보를 보냄으로서 Conversations의 개발에 기여할 수 있습니다. 경고: 이것은 Stack trace 정보를 개발자에게 보내기 위해 당신의 XMPP 계정을 사용할 것입니다.
+ 지금 보내기
+ 더이상 묻지 않기
+ 계정에 접속할 수 없습니다
+ 다중 계정에 접속할 수 없습니다
+ 여기를 선택해 당신의 계정을 관리하세요
+ 파일 첨부
+ 연락처가 당신의 명단에 없습니다. 추가하시겠습니까?
+ 연락처 추가
+ 전송 실패
+ 거부됨
+ 이미지 전송 준비중
+ 기록 삭제
+ 대화 기록 삭제
+ 이 대화의 모든 메세지를 삭제하시겠습니까? 경고: 이것은 다른 기기나 서버에 있는 메세지에는 영향을 미치지 않습니다.
+ 메세지 삭제
+ 나중에 이 대화 끝내기
+ 연락할 프레즌스 선택
+ 평문 메세지 전송
+ OTR 암호화된 메세지 전송
+ OpenPGP 암호화된 메세지 전송
+ 닉네임이 변경되었습니다
+ 이미지 다운로드
+ 암호화하지 않고 전송
+ 복호화 실패. 올바른 개인 키를 가지고 있지 않은 것 같습니다.
+ OpenKeychain
+ Conversations는 메세지를 암호화 및 복호화하고 공개 키를 관리하기 위해 OpenKeychain이라는 제 3자 앱을 활용합니다. OpenKeychain은 GPLv3 라이센스를 사용하며 F-Droid와 Google Play에서 구하실 수 있습니다. (이후 Conversations를 재시작하세요)
+ 재시작
+ 설치
+ 제공중...
+ 대기중...
+ OpenPGP 키가 발견되지 않음
+ 당신의 연락처가 그들의 공개 키를 선언하지 않고 있기 때문에 Conversations는 당신의 메세지를 암호화할 수 없습니다. OpenPGP를 설정하도록 당신의 연락처에게 물어보세요.
+ OpenPGP 키가 발견되지 않음
+ 당신의 연락처가 그들의 공개 키를 선언하지 않고 있기 때문에 Conversations는 당신의 메세지를 암호화할 수 없습니다. OpenPGP를 설정하도록 당신의 연락처에게 물어보세요.
+ 암호화된 메세지 수신됨. 터치해서 복호화 및 열람하세요.
+ 일반
+ XMPP 자원
+ 이 클라이언트가 자신을 알아보는 이름
+ 파일 수락
+ 이 크기보다 작은 파일을 자동으로 수락
+ 알림 설정
+ 알림
+ 새 메세지 도착시 알림
+ 진동
+ 새 메세지 도착시 진동
+ 소리
+ 알림과 동시에 벨소리 재생
+ 회의 알림
+ 새 회의 메세지가 도착시, 강조됐을 때 뿐만 아니라 항상 알림
+ 알림 유예
+ Carbon Copy 수신 후에 잠시동안 알림 해제
+ 추가 설정
+ 충돌 보고서 보내지 않음
+ Stack trace 정보를 보냄으로서 Conversations의 개발에 기여할 수 있습니다
+ 메세지 확인
+ 메세지를 수신하고 읽었는지를 연락처에게 알려줌
+ 사용자 환경 설정
+ OpenKeychain이 오류를 보고합니다
+ 파일 복호화 입출력 오류
+ 수락
+ 오류가 발생했습니다
+ 프레즌스 업데이트 허가
+ 당신이 추가한 연락처의 프레즌스 구독을 선제적으로 허가 및 요청함
+ 구독
+ 당신의 계정
+ 키
+ 프레즌스 업데이트 보내기
+ 프레즌스 업데이트 받기
+ 프레즌스 업데이트 요청
+ 사진 선택
+ 사진 찍기
+ 구독 요청을 선제적으로 허가
+ 선택한 파일은 이미지가 아닙니다
+ 이미지 파일 변환 중 오류 발생
+ 파일을 찾을 수 없음
+ 일반 입출력 오류. 저장소 공간이 부족한 것 같습니다.
+ 이 이미지를 선택하기 위해 사용한 앱이 이 파일을 읽는데 필요한 충분한 허가를 제공하지 않았습니다. 다른 파일 탐색기를 이용해 이미지를 선택하세요.
+ 알 수 없음
+ 임시로 해제
+ 접속중
+ 접속중\u2026
+ 오프라인
+ 승인되지 않음
+ 서버를 찾을 수 없음
+ 접속할 수 없음
+ 등록 실패
+ 사용자 이름이 이미 사용중입니다
+ 등록 성공
+ 서버가 등록을 지원하지 않습니다
+ 보안 오류
+ 호환되지 않는 서버
+ 평문
+ OTR
+ OpenPGP
+ 계정 편집
+ 계정 삭제
+ 임시로 해제
+ 아바타 공개
+ OpenPGP 공개 키 공개
+ 계정 사용
+ 확실합니까?
+ 계정을 삭제하면 당신의 모든 대화 기록이 사라집니다
+ 녹음
+ Jabber ID
+ 비밀번호
+ username@example.com
+ 암호 확인
+ 암호
+ 암호 확인
+ 암호가 일치하지 않습니다
+ 올바른 Jabber ID가 아닙니다
+ 메모리 부족. 이미지 용량이 너무 큽니다
+ %s를 기기의 연락처 목록에 추가하시겠습니까?
+ 접속중
+ 대화 가능
+ 자리 비움
+ 장기간 비움
+ 방해 금지
+ 오프라인
+ 회의
+ 다른 멤버
+ 서버 정보
+ XEP-0313: MAM
+ XEP-0280: Message Carbons
+ XEP-0352: Client State Indication
+ XEP-0191: Blocking Command
+ XEP-0237: Roster Versioning
+ XEP-0198: Stream Management
+ XEP-0163: PEP (Avatars)
+ 가능
+ 불가
+ 공개 키 선언 누락
+ 방금 전까지 접속했었음
+ 1분 전까지 접속했었음
+ %d 분 전까지 접속했었음
+ 1시간 전까지 접속했었음
+ %d 시간 전까지 접속했었음
+ 1일 전까지 접속했었음
+ %d 일 전까지 접속했었음
+ 접속한적 없음
+ 암호화된 메세지. 복호화하기 위해 OpenKeychain을 설치하세요.
+ 알 수 없는 OTR 지문
+ OpenPGP 암호화 메세지 발견
+ 접수 실패
+ 당신의 지문
+ OTR 지문
+ 검증
+ 복호화
+ 회의
+ 검색
+ 연락처 생성
+ 회의 참석
+ 연락처 삭제
+ 연락처 정보 보기
+ 연락처 차단
+ 연락처 차단 해제
+ 만들기
+ 이미 존재하는 연락처입니다
+ 참석
+ 회의 주소
+ room@conference.example.com
+ 즐겨찾기로 저장
+ 즐겨찾기 삭제
+ 즐겨찾기가 이미 존재합니다
+ 당신
+ 회의 제목 편집
+ 회의를 찾을 수 없습니다
+ 퇴장
+ 연락처가 당신을 연락처 목록에 추가했습니다
+ Add back
+ %s 가 여기까지 읽었습니다
+ 공개
+ 갤러리에서 사진을 선택하기 위해 아바타를 터치하세요
+ 참고하세요: 당신의 프레즌스 업데이트를 구독한 모든 사람들은 이 사진을 볼 수 있습니다
+ 공개중...
+ 서버가 당신의 발표를 거부했습니다
+ 사진을 변환하는 중 오류가 발생했습니다
+ 아바타를 저장할 수 없습니다
+ (혹은 기본값을 되돌리기 위해 길게 누름)
+ 서버가 아바타 발표를 지원하지 않습니다
+ 속삭임
+ %s 에게
+ %s 에게 개인 매세지 보내기
+ 접속
+ 계정이 이미 존재합니다
+ 다음
+ 현재 세션이 수립되었습니다
+ 추가 정보
+ 건너뛰기
+ 알림 해제
+ 이 대화의 알림 해제
+ 알림이 해제되었습니다
+ 사용
+ 회의에 암호가 필요합니다
+ 암호 입력
+ 연락처로부터 프레즌스 업데이트 찾을 수 없음
+ 먼저 연락처로부터 프레즌스 업데이트를 요청하세요. 이는 당신의 연락처가 어떤 클라이언트를 사용하는지 결정하는 데 사용됩니다.
+ 지금 요청
+ 지문 삭제
+ 이 지문을 삭제하시겠습니까?
+ 무시
+ 경고: 상호간의 프레즌스 업데이트 없이 이것을 보내면 예기치 못한 문제를 발생시킬 수 있습니다. 당신의 프레즌스 구독을 검증하기 위해 연락처 상세 정보로 가세요.
+ 암호화 설정
+ 강제적인 종단간 암호화
+ 언제나 암호화 메세지로 전송 (회의 제외)
+ 암호화된 메세지 저장하지 않음
+ 경고: 메세지가 손실될 수 있습니다
+ 전문가 설정
+ 설정시 주의하시기 바랍니다
+ Conversations에 대해서
+ 빌드 및 라이센스 정보
+ 무음 시간대
+ 시작 시간
+ 마감 시간
+ 무음 시간대 사용
+ 무음 시간대에는 알림이 해제됩니다
+ 글자 크기 증가
+ 앱 전반에 큰 글자 크기를 사용합니다
+ 전송 버튼이 상태를 나타냄
+ 메세지 영수증 요청
+ 만약 지원될 경우, 수신된 메세지는 초록색 기호로 표시됩니다.
+ 연락처 상태를 표시하기 위해 전송 버튼을 색칠함
+ 기타
+ 회의 이름
+ 회의를 식별하기 위해 JID 대신 방 제목을 사용
+ OTR 지문이 클립보드에 복사되었습니다
+ 당신은 이 회의에서 금지되었습니다
+ 이 회의는 멤버 전용입니다
+ 당신은 이 회의에서 추방되었습니다
+ using account %s
+ HTTP 호스트에서 이미지 확인중
+ 이미지 파일이 삭제되었습니다
+ 접속중이 아닙니다. 다시 시도하세요.
+ 이미지 파일 크기 확인
+ 메세지 설정
+ 텍스트 복사
+ 원본 URL 복사
+ 다시 보내기
+ 이미지 URL
+ 메세지 텍스트
+ URL이 클립보드에 복사되었습니다
+ 메세지가 클립보드에 복사되었습니다
+ 이미지 전송 실패
+ QR코드 스캔
+ QR코드 보기
+ 차단 목록 보기
+ 계정 정보
+ OTR 검증
+ Remote Fingerprint
+ 스캔
+ (혹은 기기 터치)
+ Socialist Millionaire Protocol
+ 힌트 혹은 질문
+ 공유된 비밀
+ 확인
+ 진행중
+ 응답
+ 실패
+ 비밀이 일치하지 않습니다
+ 다시 시도하세요
+ 완료
+ 검증 완료
+ 연락처가 SMP 검증을 요구했습니다
+ 올바른 OTR 세션이 발견되지 않았습니다
+ Conversations
+ 포어그라운드에서 서비스 유지
+ 운영체제가 접속을 해제하지 못하도록 예방합니다
+ 파일 선택
+ 수신중 %1$s (%2$d%% 완료)
+ %s 다운로드
+ 파일
+ %s 열기
+ 전송중 (%1$d%% 완료)
+ 파일 전송 준비중
+ %s 다운로드 제공됨
+ 전송 취소
+ 파일 전송 실패
+ 파일이 삭제되었습니다
+ 파일을 열기 위한 앱이 발견되지 않았습니다
+ 지문을 검증할 수 없습니다
+ 수동 검증
+ 연락처의 OTR 지문을 검증하시겠습니까?
+ 동적 태그 표시
+ 연락처 밑에 읽기 전용 태그 표시
+ 알림 사용
+ 회의 생성
+ 회의 서버가 발견되지 않았습니다
+ 회의 생성 실패
+ 회의 생성됨
+ 비밀 접수됨
+ 초기화
+ 계정 아바타
+ OTR 지문을 클립보드에 복사
+ 서버로부터 기록 가져오는중
+ 서버에 더이상 기록이 없습니다
+ 업데이트중...
+ 암호 변경됨
+ 암호를 변경할 수 없습니다
+ 암호화된 대화를 시작하기 위해 메세지 보내기
+ 질문하기
+ 만약 당신과 당신의 연락처가 다른 사람은 모르는 비밀을 공유하고 있다면, 그 비밀을 서로의 지문을 검증하는 데 사용할 수 있습니다. 대소문자가 구분된 대답을 할 연락처에게 힌트나 질문을 주세요.
+ 당신의 연락처는 당신의 지문을 검증하고자 공유된 비밀을 확인하려고 합니다. 당신의 연락처는 그 비밀에 관한 다음과 같은 힌트 혹은 질문을 제공했습니다.
+ 힌트를 반드시 입력해야 합니다
+ 공유된 비밀을 반드시 입력해야 합니다
+ 아래에 보이는 지문을 당신의 연락처의 지문과 세심하게 비교하세요. 당신은 암호화된 이메일이나 전화와 같은 믿을만한 통신수단으로 이것을 주고 받을 수 있습니다.
+ 암호 변경
+ 현재 암호
+ 새 암호
+ 암호를 반드시 입력해야 합니다
+ 모든 계정 사용
+ 모든 계정 해제
+ 다음으로 동작을 수행
+ 관련 없음
+ 역할 없음
+ 추방됨
+ 멤버
+ 고급 모드
+ 멤버십 허가
+ 멤버십 철회
+ 관리자 특권 허가
+ 관리자 특권 철회
+ 회의에서 제거
+ %s 의 관련 여부를 변경할 수 없습니다
+ 회의에서 금지
+ %s 를 공개 회의에서 제거하려고 하고 있습니다. 유일한 방법은 이 사용자를 앞으로 금지시키는 것입니다.
+ 지금 금지
+ %s 의 역할을 변경할 수 없습니다
+ 공개적으로 접근 가능한 회의
+ 멤버 전용 사설 회의
+ 회의 설정
+ 사설 (멤버 전용)
+ 익명 아님
+ 회의 설정 변경됨
+ 회의 설정을 변경할 수 없습니다
+ 안함
+ 30분
+ 1시간
+ 2시간
+ 8시간
+ 나중에 알릴때까지
+ 입력 설정
+ 엔터 키로 전송
+ 엔터 키로 메세지를 보냅니다
+ 엔터 키 표시
+ 이모티콘 키를 엔터 키로 바꿉니다
+ 오디오
+ 비디오
+ 이미지
+ PDF 문서
+ 안드로이드 앱
+ 연락처
+ %s 수신
+ 포어그라운드 서비스 해제
+ 터치해서 Conversations 열기
+ 아바타가 공개되었습니다
+ %s 전송중
+ %s 제공중
+ 오프라인 숨기기
+ 계정 해제
+ %s 이(가) 입력중입니다...
+ %s 이(가) 입력을 중단했습니다
+ 입력 알림
+ 새 메세지를 작성할 때 이를 연락처에게 알립니다
+ 위치 전송
+ 위치 표시
+ 위치를 표시할 수 있는 앱이 발견되지 않았습니다
+ 위치
+ 위치 수신
+ 대화 끝남
+ 회의에서 나감
+ 인증 설정
+ 시스템 CA를 신뢰하지 않음
+ 모든 인증서는 수동으로 승인되어야 함
+ 인증서 삭제
+ 수동으로 승인된 인증서 삭제
+ 수동으로 승인된 인증서 없음
+ 인증서 삭제
+ 선택 삭제
+ 취소
+
+ - %d 인증서 삭제됨
+
+
+ - %d 연락처 선택
+
+
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index 2b8c55011..2532130dd 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -427,6 +427,21 @@
Geen applicatie gevonden om locatie weer te geven
Locatie
Locatie ontvangen
+ Gesprek gesloten
+ Groepsgesprek verlaten
+ Certificaatopties
+ Vertrouw geen systeem-CA\'s.
+ Alle certificaten moeten handmatig goedgekeurd worden
+ Verwijder certificaten
+ Verwijder handmatig goedgekeurde certificaten
+ Geen handmatig goedgekeurde certificaten
+ Verwijder certificaten
+ Verwijder selectie
+ Annuleer
+
+ - %d certificaat verwijderd
+ - %d certificaten verwijderd
+
- Selecteer %d contact
- Selecteer %d contacten
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 58dea13bb..e18493573 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -5,8 +5,11 @@
Zarządzaj kontami
Zakończ konwersację
Szczegóły kontaktu
- Szczególy konferencji
+ Szczegóły konferencji
+ Konwersacja szyfrowana
Dodaj konto
+ Edytuj nazwę
+ Dodaj do książki telefonicznej
Usuń z rostera
Zablokuj kontakt
Odblokuj kontakt
@@ -16,6 +19,7 @@
Ustawienia
Szczegóły konferencji
Szczegóły kontaktu
+ Udostępnij w konwersacji
Rozpocznij konwersację
Wybierz kontakt
Czarna lista
@@ -25,6 +29,7 @@
nieprzeczytanych konwersacji
wysyłanie...
Deszyfrowanie wiadomości. Proszę czekać...
+ Nazwa jest już w użyciu
Admin
Właściciel
Moderator
@@ -36,12 +41,15 @@
Zablokować wszystkie kontakty z %s?
Odblokować wszystkie kontakty z %s?
Kontakt zablokowany
+ Czy usunąć zakładkę %s? Konwersacja powiązana z zakładką nie zostanie usunięta.
Zarejestruj nowe konto na serwerze
Zmień hasło na serwerze
+ Udostępnij...
Rozpocznij konwersację
Zaproś kontakt
Kontakty
Anuluj
+ Ustaw
Dodaj
Edytuj
Usuń
@@ -50,6 +58,7 @@
Zapisz
Ok
Conversations uległo awarii
+ Wysyłając ślady stosu pomagasz rozwijać Conversations\nUwaga: Ślad stosu zostanie przesłany deweloperowi przy użyciu twojego konta XMPP.
Wyślij teraz
Nie pytaj ponownie
Nie można połączyć się z kontem
@@ -60,30 +69,358 @@
Dodaj kontakt
wysyłanie nie powiodło się
odrzucono
+ Przygotowywanie obrazu do wysłania
Wyczyść historię
Wyczyść historię konwersacji
+ Czy na pewno usunąć wszystkie wiadomości powiązane z konwersacją?\n\nUwaga: Działanie nie wpływa na wiadomości przechowywane na innych urządzeniach lub serwerach.
Usuń wiadomości
+ Zakończ konwersację po usunięciu historii
+ Wybierz widoczność dla kontaktu
+ Wyślij wiadomość jawną
+ Wyślij zaszyfrowaną wiadomość (OTR)
+ Wyślij zaszyfrowaną wiadomość (OpenPGP)
+ Twoja nazwa została zmieniona
+ Pobierz obraz
+ Wyślij bez szyfrowania
+ Nie można odszyfrować. Sprawdź poprawność klucza prywatnego.
+ OpenKeychain
+ Conversations używa zewnętrznej aplikacji OpenKeychain do szyfrowania wiadomości i zarządzania kluczami publicznymi.\n\nOpenKeychain rozpowszechniany jest na licencji GPLv3 przez F-Droid lub Google Play.\n\n(Zrestartuj Conversations po instalacji).
+ Zrestartuj
+ Zainstaluj
+ oferowanie...
+ oczekiwanie...
+ Nie znaleziono klucza OpenPGP
+ Conversations nie może zaszyfrować wiadomości, ponieważ kontakt nie udostępnia klucza publicznego.\n\nZasugeruj rozmówcy instalację OpenPGP.
+ Nie znaleziono kluczy OpenPGP
+ Conversations nie może zaszyfrować wiadomości, ponieważ kontakty nie udostępniają kluczy publicznych.\n\nZasugeruj rozmówcom instalację OpenPGP.
+ Otrzymano zaszyfrowaną wiadomość. Dotknij, aby odszyfrować i wyświetlić.
+ Główne
+ Zasób XMPP
+ Nazwa identyfikująca urządzenie
+ Akceptuj pliki
+ Automatycznie akceptuj pliki mniejsze niż...
+ Ustawienia powiadamiania
+ Powiadomienia
+ Powiadamiaj, gdy nadejdzie wiadomość
+ Wibracje
+ Wibruj, gdy nadejdzie wiadomość
+ Dźwięk
+ Odtwórz dźwięk z powiadomieniem
+ Powiadomienia konferencji
+ Zawsze powiadamiaj o nowej wiadomości w konferencji
+ Opóźnienie powiadomień
+ Wyłącz powiadomienia przez krótki czas po otrzymaniu kopii wiadomości
+ Opcje zaawansowane
+ Nie wysyłaj raportów awarii
+ Wysyłając ślady stosu pomagasz rozwijać Conversations
+ Potwierdzenia wiadomości
+ Powiadamiaj kontakty o otrzymaniu lub przeczytaniu wiadomości
+ Ustawienia interfejsu
+ Wystąpił błąd OpenKeychain
+ Błąd podczas deszyfrowania pliku
+ Akceptuj
+ Wystąpił błąd
+ Zezwól na powiadomienia obecności
+ Automatycznie zezwalaj i pytaj o powiadomienia obecności, kiedy utworzysz kontakt
+ Subskrypcje
+ Twoje konto
+ Klucze
+ Wysyłaj powiadomienia obecności
+ Otrzymuj powiadomienia obecności
+ Poproś o powiadomienia obecności
+ Wybierz obraz
+ Zrób zdjęcie
+ Automatyczne powiadomienia obecności
+ Wybrany plik nie jest obrazem
+ Błąd kompresji obrazu
+ Nie odnaleziono pliku
+ Ogólny błąd wejścia/wyjścia
+ Aplikacja użyta do wyboru obrazu nie zezwoliła na odczyt pliku.\n\nWybierz obraz przy użyciu innego menedżera plików
+ nieznany
+ Tymczasowo wyłączono
+ Połączono
+ Łączenie...
+ Rozłączono
+ Błąd uwierzytelnienia
+ Nie odnaleziono serwera
+ Brak połączenia
+ Błąd rejestracji
+ Nazwa jest już w użyciu
+ Zarejestrowano pomyślnie
+ Serwer nie umożliwia rejestracji
+ Błąd zabezpieczeń
+ Serwer niekompatybilny
+ Tekst jawny
+ OTR
+ OpenPGP
+ Edytuj konto
+ Usuń konto
+ Wyłącz tymczasowo
+ Publikuj awatar
+ Udostępnij klucz publiczny OpenPGP
+ Włącz konto
+ Czy na pewno?
+ Wraz z kontem zostanie nieodwracalnie usunięta powiązana historia konwersacji.
+ Nagraj głos
+ Jabber ID
+ Hasło
+ username@example.com
+ Potwierdź hasło
+ Hasło
+ Potwierdź hasło
+ Hasła są niezgodne
+ Wprowadzono niepoprawny Jabber ID
+ Brak pamięci, obraz jest za duży
+ Czy chcesz dodać kontakt %s do książki telefonicznej?
+ dostępny
+ chętny do rozmowy
+ zaraz wracam
+ będę później
+ nie przeszkadzać
+ niedostępny
+ Konferencja
+ Pozostali uczestnicy
+ Informacje o serwerze
+ XEP-0313: MAM
+ XEP-0280: Kopie wiadomości
+ XEP-0352: Client State Indication
+ XEP-0191: Blocking Command
+ XEP-0237: Roster Versioning
+ XEP-0198: Stream Management
+ XEP-0163: PEP (Avatars)
+ dostępny
+ niedostępny
+ Brak informacji o kluczu publicznym
+ widziany chwilę temu
+ widziany minutę temu
+ widziany %d minut(y) temu
+ widziany godzinę temu
+ widziany %d godzin(y) temu
+ widziany wczoraj
+ widziany %d dni temu
+ nigdy nie widziany
+ Wiadomość zaszyfrowana. Zainstaluj OpenKeychain, żeby odszyfrować.
+ Nieznany odcisk klucza OTR
+ Znaleziono wiadomości zaszyfrowane przez OpenPGP
+ Twój odcisk klucza
+ Odcisk klucza OTR
+ Weryfikuj
+ Odszyfruj
+ Konferencje
+ Szukaj
+ Utwórz kontakt
+ Dołącz do konferencji
+ Usuń kontakt
+ Szczegóły kontaktu
+ Zablokuj kontakt
+ Odblokuj kontakt
+ Utwórz
+ Kontakt już istnieje
+ Dołącz
+ Adres konferencji
+ room@conference.example.com
+ Dodaj jako zakładkę
+ Usuń zakładkę
+ Zakładka już istnieje
+ Ty
+ Edytuj temat konferencji
+ Nie znaleziono konferencji
+ Opuść pokój
+ Kontakt został dodany do listy
+ Dodaj ponownie
+ %s przeczytał do tego miejsca
+ Publikuj
+ Naciśnij awatar, żeby wybrać obraz z galerii
+ Uwaga: Obraz będzie widoczny dla wszystkich kontaktów, którym udostępniasz powiadomienia o obecności.
+ Publikowanie...
+ Serwer odrzucił żądanie publikacji
+ Wystąpił błąd podczas konwersji obrazu
+ Nie udało się zapisać obrazu w pamięci urządzenia
+ Serwer nie udostępnia możliwości publikacji awatarów
+ do %s
+ Wyślij prywatną wiadomość do %s
+ Połącz
+ Konto już istnieje
+ Dalej
+ Połączono z serwerem
+ Dodatkowe informacje
+ Pomiń
+ Wyłącz powiadomienia
+ Wyłącz powiadomienia tej konwersacji
+ Powiadomienia są wyłączone
+ Włącz
+ Konferencja jest zabezpieczona hasłem
+ Wprowadź hasło
+ Kontakt nie udostępnia powiadomień o obecności
+ Zażądaj teraz
+ Usuń odcisk klucza
+ Czy na pewno chcesz usunąć odcisk klucza?
+ Ignoruj
+ Ustawienia szyfrowania
+ Wymuszaj szyfrowanie typu end-to-end
+ Szyfruj wszystkie wiadomości (poza konferencjami)
+ Nie zapisuj zaszyfrowanych wiadomości
+ Uwaga: Może powodować utratę wiadomości
+ Ustawienia zaawansowane
+ Modyfikuj ustawienia ostrożnie
+ O Conversations
+ Informacje o kompilacji i licencji
+ Godziny ciszy
+ Początek
+ Koniec
+ Włącz godziny ciszy
+ Powiadomienia będą wyciszone w wybranym przedziale czasu
+ Większy rozmiar czcionki
+ Używaj większego rozmiaru czcionki w aplikacji
+ Przycisk wysyłania wskazuje status
+ Raporty dostarczenia
+ Jeżeli to możliwe, oznaczaj dostarczone wiadomości zielonym haczykiem
+ Koloruj przycisk wysyłania w zależności od statusu kontaktu
+ Inne opcje
+ Nazwa konferencji
+ Nazywaj konferencję tematem zamiast Jabber ID
+ Odcisk klucza OTR został skopiowany do schowka
+ Zbanowano cię w konferencji
+ To jest zamknięty pokój
+ Wyrzucono cię z konferencji
+ Sprawdzanie obrazka na hoście HTTP
+ Obraz został usunięty
+ Brak połączenia. Spróbuj ponownie później
+ Sprawdź rozmiar pliku
+ Opcje wiadomości
+ Skopiuj tekst
+ Skopiuj oryginalny URL
+ Wyślij ponownie
+ URL obrazu
+ Treść wiadomości
+ URL obrazu został skopiowany do schowka
+ Wiadomość została skopiowana do schowka
+ Błąd podczas przesyłania obrazu
+ Zeskanuj kod QR
+ Pokaż kod QR
+ Wyświetl listę banów
+ Szczegóły konta
+ Weryfikuj OTR
+ Zdalny odcisk klucza
+ (lub zetknij telefony)
+ Protokół socialist millionaire
+ Podpowiedź lub pytanie
+ Wspólny sekret
+ Potwierdź
+ W toku
+ Odpowiedz
+ Sekrety są niezgodne
+ Spróbuj ponownie
+ Zakończ
+ Weryfikacja udana!
+ Kontakt zażądał weryfikacji SMP
+ Brak ważnej sesji OTR!
+ Conversations
+ Usługa na pierwszym planie
+ Uniemożliwia systemowi przerwanie połączenia
+ Wybierz plik
+ Odbieranie %1$s (ukończono %2$d%%)
+ Pobierz %s
+ plik
+ Otwórz %s
+ Wysyłanie (ukończono %1$d%%)
+ Przygotowywanie pliku do wysłania
+ Zaproponowano pobranie pliku %s
+ Anuluj przesyłanie
+ Przesyłanie pliku nie powiodło się
+ Plik został usunięty
+ Nie odnaleziono aplikacji skojarzonej z typem pliku
+ Weryfikacja odcisku klucza nieudana
+ Weryfikuj ręcznie
+ Czy na pewno chcesz zweryfikować odcisk klucza OTR kontaktu?
+ Etykiety kontaktów
+ Wyświetlaj etykiety pod kontaktami
+ Włącz powiadomienia
+ Utwórz konferencję...
+ Nie odnaleziono serwera konferencji
+ Nie udało się utworzyć konferencji!
+ Konferencja została utworzona!
+ Sekret został zaakceptowany!
+ Resetuj
+ Awatar konta
+ Skopiuj odcisk klucza OTR do schowka
+ Pobieranie historii z serwera
+ Koniec historii na serwerze
+ Aktualizowanie...
+ Hasło zostało zmienione!
+ Nie udało się zmienić hasła
+ Wyślij wiadomość, żeby rozpocząć szyfrowaną rozmowę
+ Zadaj pytanie
+ Jeśli ty i twój kontakt macie jakiś wspólny sekret, którego nie zna nikt inny (żart znany tylko wam lub po prostu co jedliście ostatnim razem, gdy się widzieliście) możecie użyć tego sekretu by zweryfikować wzajemnie odciski swoich kluczy.\n\nPodasz podpowiedź lub pytanie dla twojego kontaktu i otrzymasz odpowiedź (wielkość liter ma znaczenie).
+ Twój kontakt chciałby zweryfikować odcisk Twojego klucza poprzez sprawdzenie znajomości wspólnego sekretu. Twój znajomy przedstawił następującą podpowiedź lub pytanie dotyczącego tego sekretu.
+ Wskazówka nie powinna być pusta
+ Sekret nie może być pusty
+ Ostrożnie porównaj odcisk klucza pokazany poniżej z odciskiem klucza twojego kontaktu.\nMożesz użyć bezpiecznego kanału komunikacji takiego, jak szyfrowany e-mail lub rozmowa telefoniczna, by wymienić odciski klucza.
Zmień hasło
Obecne hasło
Nowe hasło
Hasło nie może być puste
Aktywuj wszystkie konta
Wyłącz wszystkie konta
+ Użyj
+ Brak stanowiska
+ Brak funkcji
+ Wykluczony
+ Członek
+ Tryb zaawansowany
+ Przyznaj członkostwo
+ Cofnij członkostwo
+ Przyznaj uprawnienia administratora
+ Odbierz uprawnienia administratora
+ Usuń z konferencji
+ Nie udało się zmienić stanowiska dla %s
+ Zbanuj uczestnika konferencji
+ Próbujesz usunąć %s z publicznego pokoju. Jedyny sposób, by to zrobić, to wykluczyć tego użytkownika na zawsze.
+ Zbanuj teraz
+ Nie udało się zmienić funkcji %s
+ Konferencja publiczna
+ Konferencja prywatna, dla zaakceptowanych uczestników
+ Opcje konferencji
+ Prywatna (tylko zaakceptowani)
+ Opcje konferencji zostały zmienione!
+ Nie udało się zmienić opcji konferencji
Nigdy
30 minut
1 godzina
2 godziny
8 godzin
+ Ręcznie
+ Ustawienia wprowadzania
+ Enter wysyła
Używaj klawisza Enter do wysyłania wiadomości
Pokaż klawisz Enter
Zamień klawisz emotikon na klawisz Enter
plik audio
plik wideo
obraz
+ Dokument PDF
+ Aplikacja Androida
Kontakt
Odebrano %s
+ Wyłącz podtrzymanie pierszego planu usługi
+ Dotknij, aby otworzyć Conversations
Avatar został pomyślnie opublikowany!
Wysyłanie %s
Oferowanie %s
Ukryj niedostępnych
+ Wyłącz konto
+ %s pisze...
+ %s przestał(a) pisać
+ Powiadomienia pisania
+ Powiadamiaj rozmówcę, kiedy rozpoczynasz nową wiadomość
+ Wyślij lokalizację
+ Pokaż lokalizację
+ Nie odnaleziono aplikacji do wyświetlenia lokalizacji
+ Lokalizacja
+ Otrzymano lokalizację
+ Zamknięto konwersację
+ Opuszczono konferencję
+ Nie ufaj certyfikatom systemowym
+ Wymagaj ręcznego potwierdzania certyfikatów
+ Anuluj
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 4a96a7fe9..2fc257f7c 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -11,6 +11,10 @@
Редактировать контакт
Добавить в телефонную книгу
Удалить из списка
+ Заблокировать контакт
+ Разблокировать контакт
+ Заблокировать домен
+ Разблокировать домен
Управление Аккаунтами
Настройки
Сведения о Конференции
@@ -18,6 +22,7 @@
Поделиться
Начать беседу
Выберите собеседника
+ Черный список
только что
1 минуту назад
%d мин. назад
@@ -31,16 +36,25 @@
Участник
Посетитель
Вы хотите удалить %s из своего списка? Беседы, связанные с этим аккаунтом будут сохранены.
+ Вы хотите заблокировать дальнейшие сообщения от %s?
+ Вы хотите разблокировать пользователя %s?
+ Заблокировать всех пользователей домена %s?
+ Разблокировать всех пользователей домена %s?
+ Контакт заблокирован
Вы хотите удалить %s из избранного? Беседы, связанные с данной закладкой будут сохранены
Создать новый аккаунт на сервере
+ Изменить пароль на сервере
Поделиться с
Начать беседу
Пригласить собеседника
Контакты
Отмена
+ Установить
Добавить
Редактировать
Удалить
+ Заблокировать
+ Разблокировать
Сохранить
ОК
Conversations был неожиданно остановлен
@@ -134,6 +148,8 @@
Имя пользователя уже используется
Регистрация завершена
Сервер не поддерживает регистрацию
+ Ошибка безопасности
+ Несовместимый сервер
Без шифрования
OTR
OpenPGP
@@ -164,8 +180,13 @@
не в сети
Конференция
Другие участники
+ Информация о сервере
+ XEP-0313: Сохранение сообщений в архив
Дублирование сообщений
- Управление потоками
+ XEP-0352: Индикатор Состояния Клиента
+ XEP-0191: Команда Блокирования
+ XEP-0237: Управление версиями списков
+ XEP-0198: Управление потоками
XEP-0163: PEP (Аватары)
доступен
недоступен
@@ -192,6 +213,8 @@
Присоединиться к конференции
Удалить Контакт
Посмотреть данные контакта
+ Заблокировать контакт
+ Разблокировать контакт
Создать
Контакт уже существует
Присоединиться
@@ -245,8 +268,184 @@
Внимание: Это может привести к потере сообщений
Расширенные настройки
Пожалуйста, будьте осторожны с данными настройками
+ О Conversations
+ Информация о билде и лицензировании
+ Тихие Часы
+ Начало
+ Окончание
+ Включить режим «тихих часов»
+ Уведомления будут отключены во время «тихих часов»
Увеличить размер шрифта
Установите больший размер шрифта по всей программе
Использовать кнопку-индикатор
+ Запрос в получении сообщения
+ Если поддерживается, поступившие сообщения будут отмечены зеленой галочкой
Раскрасить кнопку отправить, указывая текущий статус собеседника
+ Другие
+ Название конференции
+ Использовать тему беседы заместо JID для отображения конференций
+ OTR-отпечаток скопирован в буфер обмена!
+ Вы заблокированы в этой конференции
+ Эта конференция требует членства
+ Вы были удалены из конференции
+ использовать учётную запись %s
+ Проверка изображения на узле HTTP
+ Файл изображения был удалён
+ Вы неподключены. Попробуйте позже
+ Проверить размер файла изображения
+ Опции сообщения
+ Копировать текст
+ Копировать адрес ссылки
+ Отправить ещё раз
+ Адрес изображения
+ Текст сообщения
+ Ссылка скопирована в буфер обмена
+ Сообщение скопировано в буфер обмена
+ Передача изображения не удалась
+ Поиск QR-кода
+ Показать QR-код
+ Показать чёрный список
+ Сведения об учётной записи
+ Подтвердить OTR
+ Удалённый отпечаток
+ поиск
+ (или сенсорные телефоны)
+ Socialist Millionaire Protocol
+ Подсказка или вопрос
+ Общий секретный ключ
+ Подтвердить
+ В ходе выполнения
+ Ответ
+ Не удалось
+ Ключи не совпадают
+ Попробуйте ещё раз
+ Завершить
+ Подтверждён!
+ Контакт запросил подтверждение SMP
+ Действительная OTR-сессия не найдена!
+ Диалоги
+ Оставить службу на переднем плане
+ Не позволяет операционной системе закрыть ваше соединение
+ Выберите файл
+ Получение %1$s (%2$d%% выполнено)
+ Загружено %s
+ файл
+ Открыть %s
+ отправка (%1$d%% выполнено)
+ Файл готовится для передачи
+ %s предлагается скачать
+ Отменить передачу
+ передача файла не удалась
+ Файл был удалён
+ Не найдено приложения для открытия файла
+ Не удалось подтвердить отпечаток
+ Ручная проверка
+ Вы точно хотите подтвердить OTR-отпечатки ваших контактов?
+ Показывать динамические тэги
+ Отображать теги только для чтения под контактами
+ Включить уведомления
+ Создать конференцию с...
+ Сервер конференции не был найден
+ Не удалось создать конференцию!
+ Конференция создана!
+ Секретный ключ принят!
+ Сброс
+ Изображение учётной записи
+ Скопировать OTR-отпечаток в буфер обмена
+ Получение истории с сервера
+ На сервере больше нет истории
+ Обновление...
+ Пароль изменён!
+ Не удалось изменить пароль
+ Отправить сообщение чтобы начать зашифрованный чат
+ Задать вопрос
+ Если у вас и вашего собеседника есть общая тайна, о которой никто кроме вас не знает (например, шутка, понятная только \"своим\" или что вы ели на обед при последней вашей встрече) вы можете использовать эту тайну, чтобы подтвердить отпечаток друг друга.\n\nВы даёте подсказку или задаёте вопрос вашему контакту, а она даст регистрозависимый ответ.
+ Ваш собеседник желает проверить ваш отпечаток с помощью общего секрета. Ваш собеседник дал следующую подсказку или вопрос в качестве этого секрета.
+ Ваша подсказка не может быть пустой
+ Ваш общий секрет не может быть пустым
+ Внимательно сверьте отпечаток, показанный ниже с отпечатком вашего собеседника.\nДля обмена ими вы можете использовать любое доверенное средство связи, например, зашифрованное электронное письмо или телефонный звонок.
+ Изменить пароль
+ Текущий пароль
+ Новый пароль
+ Пароль не может быть пустым
+ Включить все учётные записи
+ Отключить все учётные записи
+ Взаимодействовать с
+ Не является участником
+ Нет роли
+ Заблокированный пользователь
+ Участник
+ Расширенный режим
+ Предоставить участие
+ Отменить участие
+ Назначить административные права
+ Снять административные права
+ Исключить из конференции
+ Не удалось изменить принадлежность %s
+ Запретить доступ к конференции
+ Вы пытаетесь исключить %s из публичной конференции. Единственный способ — это навсегда запретить доступ пользователю.
+ Заблокировать
+ Не удалось сменить роль %s
+ Публичная конференция
+ Приватная конференция только для членов
+ Настройки конференции
+ Закрытый доступ (только для участников)
+ Не анонимно
+ Настройки конференции изменены!
+ Не удалось изменить настройки конференции
+ Никогда
+ 30 минут
+ 1 час
+ 2 часа
+ 8 часов
+ До следующего уведомления
+ Настройки ввода
+ Отправить на \"Enter\"
+ Клавиша \"Enter\" отправляет сообщение
+ Показывать клавишу ввода
+ Поменять кнопку смайликов на кнопку ввода
+ аудио
+ звук
+ изображение
+ PDF-документ
+ Приложение Android
+ Контакт
+ Получено %s
+ Отключить фоновую службу
+ Коснитесь, чтобы открыть Conversations
+ Аватар загружен!
+ Отправляется %s
+ Предложен %s
+ Скрыть пользователей вне сети
+ Отключить учётную запись
+ %s набирает сообщение...
+ %s прекратил набор
+ Оповещения о наборе
+ Позволяет вашим контактам видеть когда вы пишете новое сообщение
+ Отправить местоположение
+ Показать местоположение
+ Не найдено приложений для отображения местоположения
+ Местоположение
+ Получено местоположение
+ Беседа окончена
+ Покинул беседу
+ Опции сертификата
+ Не доверять системным УЦ
+ Все сертификаты должны быть подтверждены вручную
+ Удалить сертификат
+ Удалить сертификаты, подтверждённые вручную
+ Не найдено сертификатов, подтверждённых вручную
+ Удалить сертификаты
+ Удалить отмеченное
+ Отмена
+
+ - Удалён %d сертификат
+ - Удалено %d сертификатов
+ - Удалено %d сертификатов
+
+
+ - Выбран %d контакт
+ - Выбрано %d контактов
+ - Выбрано %d контактов
+
diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml
index bca8d3d26..aa0fcff7c 100644
--- a/src/main/res/values-sk/strings.xml
+++ b/src/main/res/values-sk/strings.xml
@@ -359,7 +359,7 @@
Nepodarilo sa zmeniť heslo
Poslať správu pre spustenie šifrovaného chatu
Položiť otázku
- Ak máte vy a váš kontakt spoločné tajomstvo, ktoré nikto iný nepozná (napríklad spoločný vtip alebo čo ste mali na obed na vašom poslednom stretnutí), môžete ho použiť na overenie vzájomných identifikátorov.\n\nZadáte pomôcku alebo otázku a kontakt na ňu správne odpovie.
+ Ak máte vy a váš kontakt spoločné tajomstvo, ktoré nikto iný nepozná (napríklad nejaký spoločný vtip alebo len čo ste mali na obed, keď ste sa naposledy stretli), môžte použiť toto tajomstvo na overenie vzájomných identifikátorov. \n\nZadáte pomôcku alebo otázku pre váš kontakt, ktorý na ňu správne odpovie.
Váš kontakt by chcel overiť váš identifikátor pomocou spoločného tajomstva. Váš kontakt zadal nasledujúcu pomôcku alebo otázku týkajúcu sa tajomstva.
Vaša pomôcka by nemala byť prázdna
Vaše spoločné tajomstvo nemôže byť prázdne
@@ -422,4 +422,18 @@
%s prestal písať
Upozornenia pri písaní
Upozorniť kontakt, keď píšete novú správu
+ Poslať polohu
+ Zobraziť polohu
+ Nenašla sa aplikácia na zobrazenie polohy
+ Poloha
+ Prijatá poloha
+ Konverzácia zatvorená
+ Opustil skupinovú konverzáciu
+ Nedôverovať systému CAs
+ Všetky certifikáty musia byť ručne schválené
+
+ - Vybrať %d kontaktu
+ - Vybrať %d kontaktu
+ - Vybrať %d kontaktov
+
diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml
index 479889b77..bcf420ba4 100644
--- a/src/main/res/values-sr/strings.xml
+++ b/src/main/res/values-sr/strings.xml
@@ -302,8 +302,8 @@
УРЛ је копиран на клипборд
Порука је копирана на клипборд
Пренос слике није успео
- Очитај бар-код
- Прикажи бар-код
+ Очитај бар-кôд
+ Прикажи бар-кôд
Прикажи списак блокираних
Детаљи налога
Овери ОТР
@@ -427,4 +427,25 @@
Нема апликације за приказ локације
Локација
Примљена локација
+ Преписка затворена
+ Напусти конференцију
+ Опције сертификата
+ Не веруј системским сертификационим телима
+ Сви сертификати морају ручно да се одобре
+ Уклони сертификате
+ Обриши ручно одобрене сертификате
+ Нема ручно одобрених сертификата
+ Уклањање сертификата
+ Обриши изабрано
+ Одустани
+
+ - %d сертификат обрисан
+ - %d сертификата обрисана
+ - %d сертификата обрисано
+
+
+ - Изабери %d контакт
+ - Изабери %d контакта
+ - Изабери %d контаката
+
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index 69a66808e..4f84110b2 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -36,10 +36,10 @@
Deltagare
Besökare
Vill du ta bort %s från din kontaktlista? Konversationer associerade med denna kontakt kommer inte tas bort.
- Vill du blockera %s från att skicka dig meddelanden
+ Vill du blockera %s från att skicka dig meddelanden?
Vill du avblockera %s och tillåta denne att skicka dig meddelanden?
- Blockera alla kontakter från %s
- Avblockera alla kontakter från %s
+ Blockera alla kontakter från %s?
+ Avblockera alla kontakter från %s?
Kontakt blockerad
Vill du ta bort %s som bokmärke? Konversationer associerade med detta bokmärke kommer inte tas bort.
Registrera nytt konto på servern
@@ -74,7 +74,7 @@
Rensa konversationshistorik
Vill du ta bort alla meddelanden i denna konversation?\n\nVarning: Detta kommer inte påverka meddelanden lagrade på andra enheter eller servrar.
Ta bort meddelanden
- Avsluta denna konversation efter
+ Avsluta sedan denna konversation
Välj tillgänglighet till kontakt
Skicka meddelande i klartext
Skicka OTR-krypterat meddelande
@@ -82,9 +82,9 @@
Ditt nick har ändrats
Ladda ner bild
Skicka okrypterat
- Avkryptering gick fel. Du kanske inte har rätt privat nyckel.
+ Avkryptering misslyckades. Du har kanske kanske inte rätt privat nyckel.
OpenKeychain
- Conversations använder en tredjeparts applikation som heter OpenKeychain för att kryptera och avkryptera meddelanden och hantera dina publika nycklar.\n\nOpenKeychain är licensierat under GPLv3 och tillgängligt på F-Droid och Google Play.\n\n(Starta om Conversations efter.)
+ Conversations använder en tredjeparts-applikation som heter OpenKeychain för att kryptera och avkryptera meddelanden och hantera dina publika nycklar.\n\nOpenKeychain är licensierad under GPLv3 och tillgänglig på F-Droid och Google Play.\n\n(Starta om Conversations efter installation.)
Starta om
Installera
erbjuder…
@@ -229,7 +229,7 @@
Lämna
Kontakten lade till dig i sin kontaktlista
Addera tillbaka
- %s har läst fram hit
+ %s har läst hit
Publicera
Tryck på avatarbild för att välja en bild från bildgalleriet
Notera: Alla som kan se dina tillgänglighetsuppdateringar kommer se denna bild.
@@ -427,6 +427,21 @@
Kunde inte hitta applikation för att visa position
Position
Mottog position
+ Konversation stängd
+ Lämnade konferens
+ Certifikatalternativ
+ Lita inte på systemets CAs
+ Alla certifikat måste manuellt godkännas
+ Ta bort certifikat
+ Ta bort manuellt accepterade certifikat
+ Inga manuellt accepterade certifikat
+ Ta bort certifikat
+ Ta bort val
+ Avbryt
+
+ - %d certifikat borttaget
+ - %d certifikat borttagna
+
- Välj %d kontakt
- Välj %d kontakter
diff --git a/src/main/res/values-v21/dimens.xml b/src/main/res/values-v21/dimens.xml
new file mode 100644
index 000000000..b689d1008
--- /dev/null
+++ b/src/main/res/values-v21/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 63dp
+ 12dp
+
\ No newline at end of file
diff --git a/src/main/res/values-v21/themes.xml b/src/main/res/values-v21/themes.xml
index 755395330..a1f3d0c57 100644
--- a/src/main/res/values-v21/themes.xml
+++ b/src/main/res/values-v21/themes.xml
@@ -10,25 +10,23 @@
- 14sp
- 20sp
- - @drawable/ic_group_add_white_48dp
- - @drawable/ic_person_add_white_48dp
+ - @drawable/ic_group_add_white_24dp
+ - @drawable/ic_person_add_white_24dp
- @drawable/ic_cancel_white_24dp
- - @drawable/ic_chat_white_48dp
- - @drawable/ic_content_copy_grey600_36dp
- - @drawable/ic_delete_white_48dp
+ - @drawable/ic_content_copy_grey600_24dp
+ - @drawable/ic_delete_white_24dp
- @drawable/ic_file_download_white_24dp
- - @drawable/ic_edit_white_48dp
- - @drawable/ic_edit_grey600_36dp
- - @drawable/ic_group_white_48dp
- - @drawable/ic_add_white_48dp
- - @drawable/ic_attach_file_white_48dp
- - @drawable/ic_lock_open_white_48dp
- - @drawable/ic_refresh_white_48dp
- - @drawable/ic_remove_grey600_36dp
- - @drawable/ic_search_white_48dp
- - @drawable/ic_lock_outline_white_48dp
- - @drawable/ic_settings_grey600_36dp
- - @drawable/ic_import_export_white_48dp
+ - @drawable/ic_edit_white_24dp
+ - @drawable/ic_edit_grey600_24dp
+ - @drawable/ic_group_white_24dp
+ - @drawable/ic_add_white_24dp
+ - @drawable/ic_attach_file_white_24dp
+ - @drawable/ic_lock_open_white_24dp
+ - @drawable/ic_delete_grey600_24dp
+ - @drawable/ic_search_white_24dp
+ - @drawable/ic_lock_open_white_24dp
+ - @drawable/ic_settings_grey600_24dp
+ - @drawable/ic_import_export_white_24dp
diff --git a/src/main/res/values-w600dp/dimens.xml b/src/main/res/values-w585dp/dimens.xml
similarity index 100%
rename from src/main/res/values-w600dp/dimens.xml
rename to src/main/res/values-w585dp/dimens.xml
diff --git a/src/main/res/values-w960dp/dimens.xml b/src/main/res/values-w945dp/dimens.xml
similarity index 100%
rename from src/main/res/values-w960dp/dimens.xml
rename to src/main/res/values-w945dp/dimens.xml
diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml
index 79e920e98..95e800557 100644
--- a/src/main/res/values/dimens.xml
+++ b/src/main/res/values/dimens.xml
@@ -1,7 +1,8 @@
-
- 8dp
- 8dp
+
+ 8dp
+ 8dp
16dp
288dp
+ 8dp
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index af56c0146..cc7727d22 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -296,6 +296,7 @@
\n\nhttps://developer.android.com/tools/support-library\n(Apache License, Version 2.0)
\n\nhttps://github.com/zxing/zxing\n(Apache License, Version 2.0)
\n\nhttps://github.com/google/material-design-icons\n(CC BY 4.0)
+ \n\nhttps://github.com/timroes/EnhancedListView\n(Apache License, Version 2.0)
Quiet Hours
Start time
@@ -386,7 +387,7 @@
Could not change password
Send a message to start an encrypted chat
Ask question
- If you and your contact have a secret in common that no one else knows (like an inside joke or simply what you had for lunch the last time you met) you can use that secret to verify each other\'s fingerprints.\n\nYou provide a hint or a question for your contact who will respond with a case-sensitive answer.
+ If you and your contact have a secret in common that no one else knows (like an inside joke or simply what you had for lunch the last time you met) you can use that secret to verify each other’s fingerprints.\n\nYou provide a hint or a question for your contact who will respond with a case-sensitive answer.
Your contact would like to verify your fingerprint by challenging you with a shared secret. Your contact provided the following hint or question for that secret.
Your hint should not be empty
Your shared secret can not be empty
@@ -454,6 +455,21 @@
No application found to display location
Location
Received location
+ Conversation closed
+ Left conference
+ Certificate options
+ Don’t trust system CAs
+ All certificates must be manually approved
+ Remove certificates
+ Delete manually approved certificates
+ No manually approved certificates
+ Remove certificates
+ Delete selection
+ Cancel
+
+ - %d certificate deleted
+ - %d certificates deleted
+
- Select %d contact
- Select %d contacts
diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml
index 8bf6eb877..417e60a43 100644
--- a/src/main/res/xml/preferences.xml
+++ b/src/main/res/xml/preferences.xml
@@ -36,7 +36,9 @@
android:title="@string/pref_chat_states" />
-
+
+ android:title="@string/title_pref_quiet_hours"
+ android:key="quiet_hours">
-
+
+ android:title="@string/pref_expert_options"
+ android:key="expert">
+
+
+
+