Commit 29e2702d authored by Grigory Fedorov's avatar Grigory Fedorov

Merge branch 'release/1.0.42'

parents faea0b38 de52075d
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
compileSdkVersion 23
buildToolsVersion "23"
defaultConfig {
minSdkVersion 14
targetSdkVersion 22
versionCode 212
versionName '1.0.39'
targetSdkVersion 23
versionCode 215
versionName '1.0.42'
}
compileOptions {
......@@ -55,9 +55,9 @@ ext {
}
dependencies {
compile 'com.android.support:design:22.2.1'
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:support-v13:22.2.1'
compile 'com.android.support:design:23.0.0'
compile 'com.android.support:appcompat-v7:23.0'
compile 'com.android.support:support-v13:23.0.0'
compile 'com.github.ksoichiro:android-observablescrollview:1.5.0'
compile 'de.hdodenhof:circleimageview:1.2.2'
compile 'com.melnykov:floatingactionbutton:1.2.0'
......
......@@ -25,6 +25,9 @@
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
......@@ -34,6 +37,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA"/>
<application
android:name=".data.Application"
android:allowBackup="true"
......
......@@ -104,27 +104,26 @@ public class Application extends android.app.Application {
notified = false;
closing = false;
closed = false;
uiListeners = new HashMap<Class<? extends BaseUIListener>, Collection<? extends BaseUIListener>>();
managerInterfaces = new HashMap<Class<? extends BaseManagerInterface>, Collection<? extends BaseManagerInterface>>();
registeredManagers = new ArrayList<Object>();
uiListeners = new HashMap<>();
managerInterfaces = new HashMap<>();
registeredManagers = new ArrayList<>();
handler = new Handler();
backgroundExecutor = Executors
.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable,
"Background executor service");
thread.setPriority(Thread.MIN_PRIORITY);
thread.setDaemon(true);
return thread;
}
});
backgroundExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable, "Background executor service");
thread.setPriority(Thread.MIN_PRIORITY);
thread.setDaemon(true);
return thread;
}
});
}
public static Application getInstance() {
if (instance == null)
if (instance == null) {
throw new IllegalStateException();
}
return instance;
}
......@@ -156,17 +155,21 @@ public class Application extends android.app.Application {
private void onClose() {
LogManager.i(this, "onClose");
for (Object manager : registeredManagers)
if (manager instanceof OnCloseListener)
for (Object manager : registeredManagers) {
if (manager instanceof OnCloseListener) {
((OnCloseListener) manager).onClose();
}
}
closed = true;
}
private void onUnload() {
LogManager.i(this, "onUnload");
for (Object manager : registeredManagers)
if (manager instanceof OnUnloadListener)
for (Object manager : registeredManagers) {
if (manager instanceof OnUnloadListener) {
((OnUnloadListener) manager).onUnload();
}
}
android.os.Process.killProcess(android.os.Process.myPid());
}
......@@ -175,8 +178,9 @@ public class Application extends android.app.Application {
* calls will always returns <code>false</code>.
*/
public boolean doNotify() {
if (notified)
if (notified) {
return false;
}
notified = true;
return true;
}
......@@ -187,8 +191,9 @@ public class Application extends android.app.Application {
* @return
*/
public void onServiceStarted() {
if (serviceStarted)
if (serviceStarted) {
return;
}
serviceStarted = true;
LogManager.i(this, "onStart");
loadFuture = backgroundExecutor.submit(new Callable<Void>() {
......@@ -203,9 +208,7 @@ public class Application extends android.app.Application {
// Throw exceptions in UI thread if any.
try {
loadFuture.get();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
onInitialized();
......@@ -252,41 +255,41 @@ public class Application extends android.app.Application {
super.onCreate();
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
ArrayList<String> contactManager = new ArrayList<String>();
TypedArray contactManagerClasses = getResources().obtainTypedArray(
R.array.contact_managers);
for (int index = 0; index < contactManagerClasses.length(); index++)
ArrayList<String> contactManager = new ArrayList<>();
TypedArray contactManagerClasses = getResources().obtainTypedArray(R.array.contact_managers);
for (int index = 0; index < contactManagerClasses.length(); index++) {
contactManager.add(contactManagerClasses.getString(index));
}
contactManagerClasses.recycle();
TypedArray managerClasses = getResources().obtainTypedArray(
R.array.managers);
for (int index = 0; index < managerClasses.length(); index++)
if (isContactsSupported()
|| !contactManager
.contains(managerClasses.getString(index)))
TypedArray managerClasses = getResources().obtainTypedArray(R.array.managers);
for (int index = 0; index < managerClasses.length(); index++) {
if (isContactsSupported() || !contactManager.contains(managerClasses.getString(index))) {
try {
Class.forName(managerClasses.getString(index));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
managerClasses.recycle();
TypedArray tableClasses = getResources().obtainTypedArray(
R.array.tables);
for (int index = 0; index < tableClasses.length(); index++)
TypedArray tableClasses = getResources().obtainTypedArray(R.array.tables);
for (int index = 0; index < tableClasses.length(); index++) {
try {
Class.forName(tableClasses.getString(index));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
tableClasses.recycle();
}
@Override
public void onLowMemory() {
for (OnLowMemoryListener listener : getManagers(OnLowMemoryListener.class))
for (OnLowMemoryListener listener : getManagers(OnLowMemoryListener.class)) {
listener.onLowMemory();
}
super.onLowMemory();
}
......@@ -294,8 +297,9 @@ public class Application extends android.app.Application {
* Service have been destroyed.
*/
public void onServiceDestroy() {
if (closed)
if (closed) {
return;
}
onClose();
runInBackground(new Runnable() {
@Override
......@@ -320,8 +324,6 @@ public class Application extends android.app.Application {
/**
* Register new manager.
*
* @param manager
*/
public void addManager(Object manager) {
registeredManagers.add(manager);
......@@ -332,16 +334,18 @@ public class Application extends android.app.Application {
* @return List of registered manager.
*/
@SuppressWarnings("unchecked")
public <T extends BaseManagerInterface> Collection<T> getManagers(
Class<T> cls) {
if (closed)
public <T extends BaseManagerInterface> Collection<T> getManagers(Class<T> cls) {
if (closed) {
return Collections.emptyList();
}
Collection<T> collection = (Collection<T>) managerInterfaces.get(cls);
if (collection == null) {
collection = new ArrayList<T>();
for (Object manager : registeredManagers)
if (cls.isInstance(manager))
collection = new ArrayList<>();
for (Object manager : registeredManagers) {
if (cls.isInstance(manager)) {
collection.add((T) manager);
}
}
collection = Collections.unmodifiableCollection(collection);
managerInterfaces.put(cls, collection);
}
......@@ -361,9 +365,11 @@ public class Application extends android.app.Application {
}
private void clear() {
for (Object manager : registeredManagers)
if (manager instanceof OnClearListener)
for (Object manager : registeredManagers) {
if (manager instanceof OnClearListener) {
((OnClearListener) manager).onClear();
}
}
}
/**
......@@ -382,8 +388,7 @@ public class Application extends android.app.Application {
}
@SuppressWarnings("unchecked")
private <T extends BaseUIListener> Collection<T> getOrCreateUIListeners(
Class<T> cls) {
private <T extends BaseUIListener> Collection<T> getOrCreateUIListeners(Class<T> cls) {
Collection<T> collection = (Collection<T>) uiListeners.get(cls);
if (collection == null) {
collection = new ArrayList<T>();
......@@ -397,8 +402,9 @@ public class Application extends android.app.Application {
* @return List of registered UI listeners.
*/
public <T extends BaseUIListener> Collection<T> getUIListeners(Class<T> cls) {
if (closed)
if (closed) {
return Collections.emptyList();
}
return Collections.unmodifiableCollection(getOrCreateUIListeners(cls));
}
......@@ -406,12 +412,8 @@ public class Application extends android.app.Application {
* Register new listener.
* <p/>
* Should be called from {@link Activity#onResume()}.
*
* @param cls
* @param listener
*/
public <T extends BaseUIListener> void addUIListener(Class<T> cls,
T listener) {
public <T extends BaseUIListener> void addUIListener(Class<T> cls, T listener) {
getOrCreateUIListeners(cls).add(listener);
}
......@@ -419,34 +421,27 @@ public class Application extends android.app.Application {
* Unregister listener.
* <p/>
* Should be called from {@link Activity#onPause()}.
*
* @param cls
* @param listener
*/
public <T extends BaseUIListener> void removeUIListener(Class<T> cls,
T listener) {
public <T extends BaseUIListener> void removeUIListener(Class<T> cls, T listener) {
getOrCreateUIListeners(cls).remove(listener);
}
/**
* Notify about error.
*
* @param resourceId
*/
public void onError(final int resourceId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
for (OnErrorListener onErrorListener : getUIListeners(OnErrorListener.class))
for (OnErrorListener onErrorListener : getUIListeners(OnErrorListener.class)) {
onErrorListener.onError(resourceId);
}
}
});
}
/**
* Notify about error.
*
* @param networkException
*/
public void onError(NetworkException networkException) {
LogManager.exception(this, networkException);
......@@ -455,8 +450,6 @@ public class Application extends android.app.Application {
/**
* Submits request to be executed in background.
*
* @param runnable
*/
public void runInBackground(final Runnable runnable) {
backgroundExecutor.submit(new Runnable() {
......@@ -473,8 +466,6 @@ public class Application extends android.app.Application {
/**
* Submits request to be executed in UI thread.
*
* @param runnable
*/
public void runOnUiThread(final Runnable runnable) {
handler.post(runnable);
......@@ -482,9 +473,6 @@ public class Application extends android.app.Application {
/**
* Submits request to be executed in UI thread.
*
* @param runnable
* @param delayMillis
*/
public void runOnUiThreadDelay(final Runnable runnable, long delayMillis) {
handler.postDelayed(runnable, delayMillis);
......
/**
* Copyright (c) 2013, Redsolution LTD. All rights reserved.
*
* This file is part of Xabber project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, Version 3.
*
* Xabber is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License,
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.xabber.android.data.account;
import android.net.Uri;
import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.LogManager;
import com.xabber.android.data.NetworkException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
class WLMManager implements OAuthProvider {
private static final String WLM_CLIENT_SECRET = "XEazfSKu0Iu2pt6Z64Lqm-1cRxtEYgS0";
private static final String WLM_CLIENT_ID = "00000000440923FF";
private static final String WLM_SCOPE = "wl.messenger wl.offline_access";
private static final String WLM_SCHEME = "https";
private static final String WLM_AUTHORITY = "oauth.live.com";
private static final String WLM_REDIRECT_PATH = "/desktop";
private static final String WLM_REDIRECT_URL = new Uri.Builder()
.scheme(WLM_SCHEME).authority(WLM_AUTHORITY)
.path(WLM_REDIRECT_PATH).build().toString();
private final static WLMManager instance;
static {
instance = new WLMManager();
Application.getInstance().addManager(instance);
}
private WLMManager() {
}
public static WLMManager getInstance() {
return instance;
}
/**
* @param protocol
* @param grantType
* @param value
* @return Access and refresh tokens or <code>null</code> if auth failed.
* @throws NetworkException
*/
private OAuthResult accessTokenOperation(GrantType grantType, String value)
throws NetworkException {
HttpPost httpPost = new HttpPost(new Uri.Builder().scheme(WLM_SCHEME)
.authority(WLM_AUTHORITY).path("token").build().toString());
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs
.add(new BasicNameValuePair("grant_type", grantType.name));
nameValuePairs.add(new BasicNameValuePair(grantType.value, value));
nameValuePairs.add(new BasicNameValuePair("redirect_uri",
WLM_REDIRECT_URL));
nameValuePairs.add(new BasicNameValuePair("client_id", WLM_CLIENT_ID));
nameValuePairs.add(new BasicNameValuePair("client_secret",
WLM_CLIENT_SECRET));
UrlEncodedFormEntity encodedFormEntity;
try {
encodedFormEntity = new UrlEncodedFormEntity(nameValuePairs,
HTTP.UTF_8);
} catch (UnsupportedEncodingException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
}
String content;
try {
content = EntityUtils.toString(encodedFormEntity);
} catch (ParseException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
} catch (IOException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
}
LogManager.i(this, httpPost.getURI().toString() + "\n" + content);
httpPost.setEntity(encodedFormEntity);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse;
try {
httpResponse = httpClient.execute(httpPost);
} catch (ClientProtocolException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
} catch (IOException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
}
HttpEntity entity = httpResponse.getEntity();
try {
content = EntityUtils.toString(entity);
} catch (ParseException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
} catch (IOException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
} finally {
try {
entity.consumeContent();
} catch (IOException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
}
}
LogManager.i(this, content);
long expiresIn;
String accessToken;
String refreshToken;
try {
JSONObject jsonObject = (JSONObject) new JSONTokener(content)
.nextValue();
if (jsonObject.has("error"))
return null;
try {
expiresIn = Long.valueOf(jsonObject.getString("expires_in")) * 1000;
} catch (NumberFormatException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
}
accessToken = jsonObject.getString("access_token");
refreshToken = jsonObject.getString("refresh_token");
} catch (JSONException e) {
throw new NetworkException(R.string.CONNECTION_FAILED, e);
}
return new OAuthResult(accessToken, refreshToken, expiresIn);
}
@Override
public AccountProtocol getAccountProtocol() {
return AccountProtocol.wlm;
}
@Override
public String requestRefreshToken(String code) throws NetworkException {
OAuthResult result = accessTokenOperation(GrantType.authorizationCode,
code);
if (result == null)
return null;
else
return result.getRefreshToken();
}
@Override
public OAuthResult requestAccessToken(String refreshToken)
throws NetworkException {
return accessTokenOperation(GrantType.refreshToken, refreshToken);
}
@Override
public String getUrl() {
return new Uri.Builder().scheme(WLM_SCHEME).authority(WLM_AUTHORITY)
.path("authorize")
.appendQueryParameter("response_type", "code")
.appendQueryParameter("client_id", WLM_CLIENT_ID)
.appendQueryParameter("redirect_uri", WLM_REDIRECT_URL)
.appendQueryParameter("scope", WLM_SCOPE)
.appendQueryParameter("display", "touch").build().toString();
}
@Override
public boolean isValidUri(Uri uri) {
return WLM_SCHEME.equals(uri.getScheme())
&& WLM_AUTHORITY.equals(uri.getAuthority())
&& WLM_REDIRECT_PATH.equals(uri.getPath());
}
private enum GrantType {
authorizationCode("authorization_code", "code"),
refreshToken("refresh_token", "refresh_token");
public final String name;
public final String value;
GrantType(String name, String value) {
this.name = name;
this.value = value;
}
}
}
......@@ -209,14 +209,6 @@ public class ConnectionManager implements OnInitializedListener, OnCloseListener
for (OnConnectedListener listener : Application.getInstance().getManagers(OnConnectedListener.class)) {
listener.onConnected(connectionThread.getConnectionItem());
}
org.jivesoftware.smackx.ping.PingManager.getInstanceFor(connectionThread.getXMPPConnection()).registerPingFailedListener(new PingFailedListener() {
@Override
public void pingFailed() {
LogManager.i(this, "pingFailed for " + connectionThread.getConnectionItem().getRealJid());
connectionThread.getConnectionItem().forceReconnect();
}
});
}
public void onAuthorized(ConnectionThread connectionThread) {
......
......@@ -14,33 +14,33 @@
*/
package com.xabber.android.data.connection;
import android.os.Build;
import android.widget.Toast;
import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.LogManager;
import com.xabber.android.data.NetworkException;
import com.xabber.android.data.SettingsManager;
import com.xabber.android.data.account.AccountItem;
import com.xabber.android.data.account.AccountProtocol;
import com.xabber.android.data.account.OAuthManager;
import com.xabber.android.data.account.OAuthResult;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.StanzaFilter;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.packet.StreamError;
import org.jivesoftware.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.iqregister.AccountManager;
import org.xbill.DNS.Record;
import org.jivesoftware.smackx.ping.PingFailedListener;
import java.io.IOException;
import java.net.InetAddress;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
......@@ -64,8 +64,8 @@ import de.duenndns.ssl.MemorizingTrustManager;
* @author alexander.ivanov
*/
public class ConnectionThread implements
org.jivesoftware.smack.ConnectionListener,
org.jivesoftware.smack.StanzaListener {
ConnectionListener,
StanzaListener, PingFailedListener {
private static Pattern ADDRESS_AND_PORT = Pattern.compile("^(.*):(\\d+)$");
......@@ -137,8 +137,7 @@ public class ConnectionThread implements
}
});
ConnectionManager.getInstance().onConnection(this);
ConnectionSettings connectionSettings = connectionItem
.getConnectionSettings();
ConnectionSettings connectionSettings = connectionItem.getConnectionSettings();
protocol = connectionSettings.getProtocol();
serverName = connectionSettings.getServerName();
token = connectionSettings.getPassword();
......@@ -146,11 +145,11 @@ public class ConnectionThread implements
saslEnabled = connectionSettings.isSaslEnabled();
tlsMode = connectionSettings.getTlsMode();
compression = connectionSettings.useCompression();
if (saslEnabled && protocol == AccountProtocol.gtalk)
login = connectionSettings.getUserName() + "@"
+ connectionSettings.getServerName();
else
if (saslEnabled && protocol == AccountProtocol.gtalk) {
login = connectionSettings.getUserName() + "@" + connectionSettings.getServerName();
} else {
login = connectionSettings.getUserName();
}
proxyType = connectionSettings.getProxyType();
proxyHost = connectionSettings.getProxyHost();
proxyPort = connectionSettings.getProxyPort();
......@@ -167,193 +166,24 @@ public class ConnectionThread implements
return connectionItem;
}
/**
* Resolve SRV record.
*
* @param fqdn
* @param defaultHost
* @param defaultPort
*/
private void srvResolve(final String fqdn, final String defaultHost, final int defaultPort) {
final Record[] records = DNSManager.getInstance().fetchRecords(fqdn);
runOnUiThread(new Runnable() {
@Override
public void run() {
onSRVResolved(fqdn, defaultHost, defaultPort, records);
}
});
}
/**
* Called when srv records are resolved.
*
* @param fqdn
* @param defaultHost
* @param defaultPort
* @param records
*/
private void onSRVResolved(final String fqdn, final String defaultHost,
final int defaultPort, Record[] records) {
DNSManager.getInstance().onRecordsReceived(fqdn, records);
final Target target = DNSManager.getInstance().getCurrentTarget(fqdn);
if (target == null) {
LogManager.i(this, "Use defaults");
runOnConnectionThread(new Runnable() {
@Override
public void run() {
if(proxyType == ProxyType.socks5) {
onReady(defaultHost, defaultPort);
}
else {
addressResolve(null, defaultHost, defaultPort, true);
}
}
});
} else {
runOnConnectionThread(new Runnable() {
@Override
public void run() {
if(proxyType == ProxyType.socks5) {
onReady(target.getHost(), target.getPort());
}
else {
addressResolve(fqdn, target.getHost(), target.getPort(),
true);
}
}
});
}
}
/**
* Resolves address to connect to.
*
* @param fqdn server name of subsequence SRV lookup. Should be
* <code>null</code> for custom host work flow.
* @param host
* @param port
* @param firstRequest
*/
private void addressResolve(final String fqdn, final String host, final int port, final boolean firstRequest) {
LogManager.i(this, "Resolve " + host + ":" + port);
final InetAddress[] addresses = DNSManager.getInstance().fetchAddresses(host);
runOnUiThread(new Runnable() {
@Override
public void run() {
onAddressResolved(fqdn, host, port, firstRequest, addresses);
}
});
}
/**
* Called when address resolved are resolved.
*
* @param fqdn
* @param host
* @param port
* @param firstRequest
* @param addresses
*/
private void onAddressResolved(final String fqdn, final String host,
final int port, boolean firstRequest, final InetAddress[] addresses) {
DNSManager.getInstance().onAddressesReceived(host, addresses);
InetAddress address = DNSManager.getInstance().getNextAddress(host);
if (address != null) {
onReady(address, port);
return;
}
if (fqdn == null) {
if (firstRequest) {
onAddressResolved(null, host, port, false, addresses);
return;
}
private void createConnection(String fqdn, int port, boolean useSRVLookup) {
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
if (useSRVLookup) {
builder.setServiceName(serverName);
} else {
DNSManager.getInstance().getNextTarget(fqdn);
if (DNSManager.getInstance().getCurrentTarget(fqdn) == null
&& firstRequest)
DNSManager.getInstance().getNextTarget(fqdn);
final Target target = DNSManager.getInstance().getCurrentTarget(
fqdn);
if (target != null) {
runOnConnectionThread(new Runnable() {
@Override
public void run() {
addressResolve(fqdn, target.getHost(),
target.getPort(), false);
}
});
return;
}
builder.setHost(fqdn);
builder.setPort(port);
builder.setServiceName(serverName);
}
// TODO correct type of exception
RuntimeException exception = new RuntimeException("There is no available address.");
LogManager.exception(this, exception);
connectionClosedOnError(exception);
}
/**
* Called when configuration is ready and xmpp connection instance can be
* created.
*
*/
private void onReady(final InetAddress address, final int port) {
LogManager.i(this, "Use " + address);
ProxyInfo proxy = proxyType.getProxyInfo(proxyHost, proxyPort,
proxyUser, proxyPassword);
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setHost(address.getHostAddress());
builder.setPort(port);
builder.setServiceName(serverName);
// ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(
// address.getHostAddress(), port, serverName, proxy);
onReady(builder);
}
private void onReady(final String host, final int port) {
LogManager.i(this, "Use remote DNS for " + host);
ProxyInfo proxy = proxyType.getProxyInfo(proxyHost, proxyPort, proxyUser, proxyPassword);
// ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(
// host, port, serverName, proxy);
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setHost(host);
builder.setPort(port);
builder.setServiceName(serverName);
onReady(builder);
}
private void onReady(XMPPTCPConnectionConfiguration.Builder builder) {
builder.setKeystoreType("AndroidCAStore");
// Disable smack`s reconnection.
// connectionConfiguration.setReconnectionAllowed(false);
// We will send custom presence.
builder.setSendPresence(false);
if (SettingsManager.securityCheckCertificate()) {
// connectionConfiguration.setExpiredCertificatesCheckEnabled(true);
// connectionConfiguration.setNotMatchingDomainCheckEnabled(true);
// connectionConfiguration.setSelfSignedCertificateEnabled(false);
// connectionConfiguration.setVerifyChainEnabled(true);
// connectionConfiguration.setVerifyRootCAEnabled(true);
// connectionConfiguration.setCertificateListener(CertificateManager
// .getInstance().createCertificateListener(connectionItem));
} else {
// connectionConfiguration.setExpiredCertificatesCheckEnabled(false);
// connectionConfiguration.setNotMatchingDomainCheckEnabled(false);
// connectionConfiguration.setSelfSignedCertificateEnabled(true);
// connectionConfiguration.setVerifyChainEnabled(false);
// connectionConfiguration.setVerifyRootCAEnabled(false);
}
// connectionConfiguration.setSASLAuthenticationEnabled(saslEnabled);
builder.setSecurityMode(tlsMode.getSecurityMode());
builder.setCompressionEnabled(compression);
builder.setResource("");
builder.setSendPresence(false);
{
try {
......@@ -371,10 +201,10 @@ public class ConnectionThread implements
xmppConnection = new XMPPTCPConnection(builder.build());
xmppConnection.addAsyncStanzaListener(this, ACCEPT_ALL);
xmppConnection.addConnectionListener(this);
// We use own roster management.
Roster.getInstanceFor(xmppConnection).setRosterLoadedAtLogin(false);
org.jivesoftware.smackx.ping.PingManager.getInstanceFor(xmppConnection).registerPingFailedListener(this);
connectionItem.onSRVResolved(this);
final String password = OAuthManager.getInstance().getPassword(protocol, token);
if (password != null) {
......@@ -456,8 +286,7 @@ public class ConnectionThread implements
runOnUiThread(new Runnable() {
@Override
public void run() {
connectionItem.onSeeOtherHost(ConnectionThread.this, fqdn,
port, true);
connectionItem.onSeeOtherHost(ConnectionThread.this, fqdn, port, true);
}
});
}
......@@ -617,7 +446,7 @@ public class ConnectionThread implements
*/
private void authorization(String password) {
try {
xmppConnection.login(login, password, resource);
xmppConnection.login(login, password);
} catch (IOException | SmackException | XMPPException e) {
e.printStackTrace();
connectionClosedOnError(e);
......@@ -699,10 +528,21 @@ public class ConnectionThread implements
}
@Override
public void connectionClosedOnError(Exception e) {
public void connectionClosedOnError(final Exception e) {
checkForCertificateError(e);
if (checkForSeeOtherHost(e))
return;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Application.getInstance(),
Application.getInstance().getString(R.string.CONNECTION_FAILED) + ": " + e.getMessage(),
Toast.LENGTH_LONG
).show();
}
});
connectionClosed();
}
......@@ -728,6 +568,12 @@ public class ConnectionThread implements
});
}
@Override
public void pingFailed() {
LogManager.i(this, "pingFailed for " + getConnectionItem().getRealJid());
getConnectionItem().forceReconnect();
}
/**
* Filter to accept all packets.
*
......@@ -761,16 +607,7 @@ public class ConnectionThread implements
runOnConnectionThread(new Runnable() {
@Override
public void run() {
if (useSRVLookup)
srvResolve(fqdn, fqdn, port);
else {
if(proxyType == ProxyType.socks5) {
onReady(fqdn, port);
}
else {
addressResolve(null, fqdn, port, true);
}
}
createConnection(fqdn, port, useSRVLookup);
}
});
}
......
......@@ -125,7 +125,7 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
/**
* @return <code>null</code> if does not exists.
*/
private RoomChat getRoomChat(String account, String room) {
public RoomChat getRoomChat(String account, String room) {
AbstractChat chat = MessageManager.getInstance().getChat(account, room);
if (chat != null && chat instanceof RoomChat) {
return (RoomChat) chat;
......
......@@ -153,7 +153,7 @@ public class RoomChat extends AbstractChat {
return subject;
}
MultiUserChat getMultiUserChat() {
public MultiUserChat getMultiUserChat() {
return multiUserChat;
}
......
......@@ -260,7 +260,7 @@ public class VCardManager implements OnLoadListener, OnPacketListener,
}
private void requestVCard(final String account, final String srcUser) {
final String user = Jid.getBareAddress(srcUser);
final String user = srcUser;
ConnectionThread connectionThread = AccountManager.getInstance().getAccount(account).getConnectionThread();
if (connectionThread == null) {
......
......@@ -36,6 +36,7 @@ import com.xabber.android.data.connection.OnPacketListener;
import com.xabber.android.data.entity.BaseEntity;
import com.xabber.android.data.entity.NestedMap;
import com.xabber.android.data.extension.archive.MessageArchiveManager;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.extension.muc.RoomChat;
import com.xabber.android.data.roster.OnRosterReceivedListener;
import com.xabber.android.data.roster.OnStatusChangeListener;
......@@ -171,7 +172,7 @@ public class MessageManager implements OnLoadListener, OnPacketListener, OnDisco
* @return
*/
private RegularChat createChat(String account, String user) {
RegularChat chat = new RegularChat(account, Jid.getBareAddress(user));
RegularChat chat = new RegularChat(account, user);
addChat(chat);
return chat;
}
......@@ -477,10 +478,23 @@ public class MessageManager implements OnLoadListener, OnPacketListener, OnDisco
// archive have been received.
return;
}
String contact = bareAddress;
if (packet instanceof Message) {
Message message = (Message) packet;
if (MUCManager.getInstance().hasRoom(account, bareAddress)
&& message.getType() != Message.Type.groupchat ) {
contact = packet.getFrom();
}
}
final String user = packet.getFrom();
boolean processed = false;
for (AbstractChat chat : chats.getNested(account).values()) {
if (chat.onPacket(bareAddress, packet)) {
if (chat.onPacket(contact, packet)) {
processed = true;
break;
}
......@@ -499,7 +513,7 @@ public class MessageManager implements OnLoadListener, OnPacketListener, OnDisco
return;
}
}
createChat(account, user).onPacket(bareAddress, packet);
createChat(account, user).onPacket(contact, packet);
}
}
......
......@@ -19,6 +19,7 @@ import com.xabber.android.data.NetworkException;
import com.xabber.android.data.SettingsManager;
import com.xabber.android.data.SettingsManager.SecurityOtrMode;
import com.xabber.android.data.extension.archive.MessageArchiveManager;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.extension.otr.OTRManager;
import com.xabber.android.data.extension.otr.OTRUnencryptedException;
import com.xabber.android.data.extension.otr.SecurityLevel;
......@@ -58,10 +59,12 @@ public class RegularChat extends AbstractChat {
@Override
public String getTo() {
if (resource == null)
if (resource == null
|| (MUCManager.getInstance().hasRoom(account, Jid.getBareAddress(user)) && getType() != Message.Type.groupchat )) {
return user;
else
} else {
return user + "/" + resource;
}
}
@Override
......
......@@ -21,6 +21,8 @@ public class AccountInfoEditor extends ManagedActivity implements Toolbar.OnMenu
public static final String ARG_VCARD = "com.xabber.android.ui.AccountInfoEditor.ARG_VCARD";
public static final int SAVE_MENU = R.menu.save;
public static final String ARGUMENT_SAVE_BUTTON_ENABLED = "com.xabber.android.ui.AccountInfoEditor.ARGUMENT_SAVE_BUTTON_ENABLED";
private Toolbar toolbar;
......@@ -64,16 +66,25 @@ public class AccountInfoEditor extends ManagedActivity implements Toolbar.OnMenu
BarPainter barPainter = new BarPainter(this, toolbar);
barPainter.updateWithAccountName(account);
toolbar.inflateMenu(SAVE_MENU);
toolbar.setOnMenuItemClickListener(this);
boolean isSaveButtonEnabled = false;
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.fragment_container, AccountInfoEditorFragment.newInstance(account, vCard)).commit();
} else {
isSaveButtonEnabled = savedInstanceState.getBoolean(ARGUMENT_SAVE_BUTTON_ENABLED);
}
toolbar.getMenu().findItem(R.id.action_save).setEnabled(isSaveButtonEnabled);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}
toolbar.inflateMenu(SAVE_MENU);
toolbar.setOnMenuItemClickListener(this);
toolbar.getMenu().findItem(R.id.action_save).setEnabled(false);
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(ARGUMENT_SAVE_BUTTON_ENABLED, toolbar.getMenu().findItem(R.id.action_save).isEnabled());
}
@Override
......
......@@ -65,42 +65,35 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
public static final String DATE_FORMAT_INT_TO_STRING = "%d-%02d-%02d";
private VCard vCard;
private String account;
private View progressBar;
private boolean isSaveSuccess;
private Listener listener;
private boolean updateFromVCardFlag = true;
private TextView account_jid;
private LinearLayout fields;
private EditText formattedName;
private EditText prefixName;
private EditText givenName;
private EditText middleName;
private EditText familyName;
private EditText suffixName;
private EditText nickName;
private String account;
private EditText organization;
private EditText organizationUnit;
private EditText title;
private EditText role;
private EditText organizationUnit;
private EditText organization;
private EditText url;
private EditText description;
private EditText emailHome;
private EditText emailWork;
private EditText phoneHome;
private EditText phoneWork;
private EditText formattedName;
private View progressBar;
private boolean isSaveSuccess;
private LinearLayout fields;
private TextView avatarSize;
private Listener listener;
private TextView birthDate;
private DatePickerDialog datePicker;
private View changeAvatarButton;
private ImageView avatar;
private Uri newAvatarImageUri;
private Uri photoFileUri;
private boolean removeAvatarFlag = false;
private View birthDateRemoveButton;
private TextView account_jid;
private EditText addressHomePostOfficeBox;
private EditText addressHomePostExtended;
private EditText addressHomePostStreet;
......@@ -108,6 +101,7 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
private EditText addressHomeRegion;
private EditText addressHomeCountry;
private EditText addressHomePostalCode;
private EditText addressWorkPostOfficeBox;
private EditText addressWorkPostExtended;
private EditText addressWorkPostStreet;
......@@ -115,7 +109,17 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
private EditText addressWorkRegion;
private EditText addressWorkCountry;
private EditText addressWorkPostalCode;
private boolean updateFromVCardFlag = false;
private ImageView avatar;
private TextView avatarSize;
private View changeAvatarButton;
private Uri newAvatarImageUri;
private Uri photoFileUri;
private boolean removeAvatarFlag = false;
private TextView birthDate;
private DatePickerDialog datePicker;
private View birthDateRemoveButton;
interface Listener {
void onVCardSavingStarted();
......@@ -258,6 +262,7 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
if (vCardManager.isVCardRequested(account) || vCardManager.isVCardSaveRequested(account)) {
enableProgressMode();
}
updateFromVCardFlag = false;
}
@Override
......@@ -275,8 +280,6 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
}
private void setFieldsFromVCard() {
updateFromVCardFlag = true;
account_jid.setText(Jid.getBareAddress(account));
formattedName.setText(vCard.getField(VCardProperty.FN.name()));
......@@ -334,8 +337,6 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
addressWorkRegion.setText(vCard.getAddressFieldWork(AddressProperty.REGION.name()));
addressWorkCountry.setText(vCard.getAddressFieldWork(AddressProperty.CTRY.name()));
addressWorkPostalCode.setText(vCard.getAddressFieldWork(AddressProperty.PCODE.name()));
updateFromVCardFlag = false;
}
public void updateDatePickerDialog() {
......@@ -615,9 +616,10 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
getActivity().finish();
} else {
disableProgressMode();
this.vCard = vCard;
updateFromVCardFlag = true;
setFieldsFromVCard();
updateFromVCardFlag = false;
}
}
......@@ -657,7 +659,7 @@ public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveLi
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!updateFromVCardFlag) {
if (!updateFromVCardFlag && listener != null) {
listener.enableSave();
}
}
......
......@@ -565,7 +565,7 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
private void showContactInfo() {
if (MUCManager.getInstance().hasRoom(account, user)) {
startActivity(ContactViewer.createIntent(getActivity(), account, user));
startActivity(OccupantList.createIntent(getActivity(), account, user));
} else {
startActivity(ContactEditor.createIntent(getActivity(), account, user));
}
......
......@@ -56,6 +56,11 @@ public class ContactVcardViewerFragment extends Fragment implements OnContactCha
private VCard vCard;
private boolean vCardError;
private View progressBar;
private Listener listener;
interface Listener {
void onVCardReceived();
}
public static ContactVcardViewerFragment newInstance(String account, String user) {
ContactVcardViewerFragment fragment = new ContactVcardViewerFragment();
......@@ -67,6 +72,12 @@ public class ContactVcardViewerFragment extends Fragment implements OnContactCha
return fragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (Listener) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
......@@ -160,6 +171,13 @@ public class ContactVcardViewerFragment extends Fragment implements OnContactCha
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
@Override
public void onVCardReceived(String account, String bareAddress, VCard vCard) {
if (!this.account.equals(account) || !this.user.equals(bareAddress)) {
......@@ -168,6 +186,7 @@ public class ContactVcardViewerFragment extends Fragment implements OnContactCha
this.vCard = vCard;
this.vCardError = false;
updateVCard();
listener.onVCardReceived();
progressBar.setVisibility(View.GONE);
}
......
......@@ -43,7 +43,7 @@ import java.util.Collection;
import java.util.List;
public class ContactViewer extends ManagedActivity implements
OnContactChangedListener, OnAccountChangedListener {
OnContactChangedListener, OnAccountChangedListener, ContactVcardViewerFragment.Listener {
protected ContactTitleExpandableToolbarInflater contactTitleExpandableToolbarInflater;
private String account;
......@@ -92,7 +92,7 @@ public class ContactViewer extends ManagedActivity implements
}
} else {
account = getAccount(getIntent());
bareAddress = Jid.getBareAddress(getUser(getIntent()));
bareAddress = getUser(getIntent());
}
if (bareAddress != null && bareAddress.equalsIgnoreCase(GroupManager.IS_ACCOUNT)) {
......@@ -170,4 +170,9 @@ public class ContactViewer extends ManagedActivity implements
protected String getBareAddress() {
return bareAddress;
}
@Override
public void onVCardReceived() {
contactTitleExpandableToolbarInflater.onResume();
}
}
......@@ -17,17 +17,23 @@ package com.xabber.android.ui;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.LogManager;
import com.xabber.android.data.account.OnAccountChangedListener;
import com.xabber.android.data.entity.BaseEntity;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.intent.AccountIntentBuilder;
import com.xabber.android.data.intent.EntityIntentBuilder;
import com.xabber.android.data.message.MessageManager;
import com.xabber.android.data.roster.OnContactChangedListener;
import com.xabber.android.ui.adapter.OccupantListAdapter;
import com.xabber.android.ui.helper.BarPainter;
import com.xabber.android.ui.helper.ManagedListActivity;
import com.xabber.xmpp.address.Jid;
......@@ -39,14 +45,13 @@ import java.util.Collection;
* @author alexander.ivanov
*/
public class OccupantList extends ManagedListActivity implements
OnAccountChangedListener, OnContactChangedListener {
OnAccountChangedListener, OnContactChangedListener, AdapterView.OnItemClickListener {
private String account;
private String room;
private OccupantListAdapter listAdapter;
public static Intent createIntent(Context context, String account,
String user) {
public static Intent createIntent(Context context, String account, String user) {
return new EntityIntentBuilder(context, OccupantList.class)
.setAccount(account).setUser(user).build();
}
......@@ -62,55 +67,76 @@ public class OccupantList extends ManagedListActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isFinishing())
if (isFinishing()) {
return;
}
account = getAccount(getIntent());
room = Jid.getBareAddress(getUser(getIntent()));
if (account == null || room == null
|| !MUCManager.getInstance().hasRoom(account, room)) {
if (account == null || room == null || !MUCManager.getInstance().hasRoom(account, room)) {
Application.getInstance().onError(R.string.ENTRY_IS_NOT_FOUND);
finish();
return;
}
setContentView(R.layout.list);
setSupportActionBar((Toolbar) findViewById(R.id.toolbar_default));
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_default);
toolbar.setNavigationIcon(R.drawable.ic_arrow_left_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(OccupantList.this);
}
});
toolbar.setTitle(room);
BarPainter barPainter = new BarPainter(this, toolbar);
barPainter.updateWithAccountName(account);
listAdapter = new OccupantListAdapter(this, account, room);
setListAdapter(listAdapter);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getListView().setOnItemClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
Application.getInstance().addUIListener(OnAccountChangedListener.class,
this);
Application.getInstance().addUIListener(OnContactChangedListener.class,
this);
Application.getInstance().addUIListener(OnAccountChangedListener.class, this);
Application.getInstance().addUIListener(OnContactChangedListener.class, this);
listAdapter.onChange();
}
@Override
protected void onPause() {
super.onPause();
Application.getInstance().removeUIListener(
OnAccountChangedListener.class, this);
Application.getInstance().removeUIListener(
OnContactChangedListener.class, this);
Application.getInstance().removeUIListener(OnAccountChangedListener.class, this);
Application.getInstance().removeUIListener(OnContactChangedListener.class, this);
}
@Override
public void onContactsChanged(Collection<BaseEntity> entities) {
if (entities.contains(new BaseEntity(account, room)))
if (entities.contains(new BaseEntity(account, room))) {
listAdapter.onChange();
}
}
@Override
public void onAccountsChanged(Collection<String> accounts) {
if (accounts.contains(account))
if (accounts.contains(account)) {
listAdapter.onChange();
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
com.xabber.android.data.extension.muc.Occupant occupant
= (com.xabber.android.data.extension.muc.Occupant) listAdapter.getItem(position);
LogManager.i(this, occupant.getNickname());
String occupantFullJid = room + "/" + occupant.getNickname();
MessageManager.getInstance().openChat(account, occupantFullJid);
startActivity(ChatViewer.createSpecificChatIntent(this, account, occupantFullJid));
}
}
......@@ -16,6 +16,7 @@ import com.xabber.android.data.message.MessageManager;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.ui.ContactEditor;
import com.xabber.android.ui.ContactViewer;
import com.xabber.android.ui.OccupantList;
import com.xabber.android.utils.StringUtils;
public class ContactItemInflater {
......@@ -129,11 +130,11 @@ public class ContactItemInflater {
private void onAvatarClick(AbstractContact contact) {
if (MUCManager.getInstance().hasRoom(contact.getAccount(), contact.getUser())) {
context.startActivity(ContactViewer.createIntent(context,
contact.getAccount(), contact.getUser()));
context.startActivity(
OccupantList.createIntent(context, contact.getAccount(), contact.getUser()));
} else {
context.startActivity(ContactEditor.createIntent(context,
contact.getAccount(), contact.getUser()));
context.startActivity(
ContactEditor.createIntent(context, contact.getAccount(), contact.getUser()));
}
}
}
......@@ -99,7 +99,7 @@ public class OccupantListAdapter extends BaseAdapter implements
.getAccountAvatar(account));
else
avatarView.setImageDrawable(AvatarManager.getInstance()
.getOccupantAvatar(room + "/" + occupant.getNickname()));
.getUserAvatarForContactList(room + "/" + occupant.getNickname()));
affilationView.setImageLevel(occupant.getAffiliation().ordinal());
nameView.setText(occupant.getNickname());
int textStyle;
......
......@@ -100,6 +100,10 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi
}
});
updateTitle();
}
public void updateTitle() {
ContactTitleInflater.updateTitle(titleView, activity, abstractContact);
}
......
......@@ -204,6 +204,10 @@ public class DummyCursor implements Cursor {
return false;
}
@Override
public void setExtras(Bundle extras) {
}
@Override
public Bundle getExtras() {
return null;
......
......@@ -5,7 +5,7 @@
android:layout_height="match_parent"
>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
......@@ -16,7 +16,7 @@
android:id="@+id/vcard_fields_layout"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -57,7 +57,7 @@
</LinearLayout>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -153,7 +153,7 @@
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -215,7 +215,7 @@
</LinearLayout>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -268,7 +268,7 @@
</LinearLayout>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -336,7 +336,7 @@
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -374,7 +374,7 @@
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -410,7 +410,7 @@
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -474,7 +474,7 @@
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -538,7 +538,7 @@
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -722,7 +722,6 @@
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone"
......
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Narozeniny</string>
<string name="vcard_url">Webová stránka</string>
<string name="vcard_organization">Organizace</string>
<string name="vcard_organization_unit">Organizační jednotka</string>
<string name="vcard_title">Název pozice, funkce</string>
<string name="vcard_role">Postavení</string>
<string name="vcard_other">Ostatní informace</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Úprava aliasu</string>
<string name="edit_contact_groups">Upravit skupiny</string>
<string name="remove_contact">Odstranit kontakt</string>
<string name="edit_account_user_info">Upravit informace o uživateli</string>
<string name="account_user_info_save_success">Profil uživatele účtu úspěšně uložen</string>
<string name="account_user_info_save_fail">Nelze uložit informace o účtu uživatele</string>
<string name="saving">Ukládání...</string>
<string name="choose_from_gallery">Vyberte z galerie</string>
<string name="take_photo">Vyfotit</string>
<string name="remove_avatar">Odstranit avatara</string>
<string name="change">Změnit</string>
</resources>
......@@ -9,7 +9,7 @@
<string name="account_state_registration">Registrierung</string>
<string name="account_state_authentication">Autorisierung</string>
<string name="account_state_connected">Online</string>
<string name="account_state_connecting">Verbindung wird hergestellt</string>
<string name="account_state_connecting">Verbinden</string>
<string name="account_state_disconnecting">Verbindung wird getrennt</string>
<string name="account_state_offline">Abgemeldet</string>
<string name="account_state_waiting">Auf Wiederverbindung warten</string>
......
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Geburtstag</string>
<string name="vcard_url">Internetseite</string>
<string name="vcard_organization">Organisation</string>
<string name="vcard_organization_unit">Organisationseinheit</string>
<string name="vcard_title">Beruf</string>
<string name="vcard_role">Rolle</string>
<string name="vcard_other">Andere Informationen</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Alias bearbeiten</string>
<string name="edit_contact_groups">Gruppen bearbeiten</string>
<string name="remove_contact">Kontakt löschen</string>
<string name="edit_account_user_info">Benutzer Info bearbeiten</string>
<string name="account_user_info_save_success">Kontobenutzerinfo erfolgreich gespeichert</string>
<string name="account_user_info_save_fail">Kontobenutzerinfo konnte nicht gespeichert werden</string>
<string name="saving">Speichert&#8230;</string>
<string name="choose_from_gallery">Aus Galerie wählen</string>
<string name="take_photo">Foto aufnehmen</string>
<string name="remove_avatar">Avatar entfernen</string>
<string name="change">Ändern</string>
</resources>
......@@ -21,4 +21,9 @@
<string name="muc_invite_confirm_reason">%2$s lädt dich zur Konferenz %3$s: \"%4$s\" ein. Mit Konto %1$s beitreten?</string>
<string name="muc_leave">Konferenz verlassen</string>
<string name="muc_save">Konferenz speichern</string>
<string name="muc_choose_conference">Konferenz auswählen</string>
<string name="muc_next">Weiter</string>
<string name="muc_get_hosted_conferences">Gehostete Konferenzen abrufen</string>
<string name="muc_error_getting_conferences">Fehler beim Abrufen der Konferenzen</string>
<string name="muc_type_conference_name">Konferenznamen eingeben</string>
</resources>
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Fecha de nacimiento</string>
<string name="vcard_url">Página web</string>
<string name="vcard_organization">Organización</string>
<string name="vcard_organization_unit">Tipo de empleo</string>
<string name="vcard_title">Puesto de trabajo, función</string>
<string name="vcard_role">Rol</string>
<string name="vcard_other">Más información</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Editar apodo</string>
<string name="edit_contact_groups">Editar grupos</string>
<string name="remove_contact">Eliminar contacto</string>
<string name="edit_account_user_info">Editar información de usuario</string>
<string name="account_user_info_save_success">La información de la cuenta se ha guardado correctamente</string>
<string name="account_user_info_save_fail">No se pudo guardar la información del usuario</string>
<string name="saving">Guardando&#8230;</string>
<string name="choose_from_gallery">Elegir de la galería</string>
<string name="take_photo">Hacer una foto</string>
<string name="remove_avatar">Eliminar avatar</string>
<string name="change">Cambiar</string>
</resources>
......@@ -23,7 +23,7 @@
<string name="muc_save">Guardar sala de charla</string>
<string name="muc_choose_conference">Elegir sala de charla</string>
<string name="muc_next">Siguiente</string>
<string name="muc_get_hosted_conferences">Obtener conferencias organizadas</string>
<string name="muc_error_getting_conferences">Error al obtener conferencias</string>
<string name="muc_type_conference_name">Escribir el nombre de la sala de charla</string>
<string name="muc_get_hosted_conferences">Obtener salas de charla organizadas</string>
<string name="muc_error_getting_conferences">Error al obtener la lista de salas de charla</string>
<string name="muc_type_conference_name">Escribe el nombre de la sala de charla</string>
</resources>
......@@ -3,29 +3,22 @@
<resources>
<string name="account_quantity_1">cuenta</string>
<string name="account_quantity_2">cuentas</string>
<string name="account_quantity_5">-</string>
<string name="account_quantity_offline_1">cuenta</string>
<string name="account_quantity_offline_2">cuentas</string>
<string name="account_quantity_offline_5">-</string>
<string name="AUTHENTICATION_FAILED">Error de autorización</string>
<string name="chat_contact_quantity_1">contacto</string>
<string name="chat_contact_quantity_2">contactos</string>
<string name="chat_contact_quantity_5">-</string>
<string name="chat_message_quantity_1">mensaje</string>
<string name="chat_message_quantity_2">mensajes</string>
<string name="chat_message_quantity_5">-</string>
<string name="chat_status">%1$d %2$s de %3$d %4$s</string>
<string name="chat_messages_from_contact">%1$d %2$s de %3$s</string>
<string name="chat_contact_and_message">%1$s: %2$s</string>
<string name="connection_state_connected_1">%1$d de %2$d %3$s en línea</string>
<string name="connection_state_connected_2">%1$d de %2$d %3$s en línea</string>
<string name="connection_state_connected_5">-</string>
<string name="connection_state_connecting_1">%1$d de %2$d %3$s se están conectando</string>
<string name="connection_state_connecting_2">%1$d de %2$d %3$s se están conectando</string>
<string name="connection_state_connecting_5">-</string>
<string name="connection_state_waiting_1">%1$d de %2$d %3$s esperando conexión</string>
<string name="connection_state_waiting_2">%1$d de %2$d %3$s esperando conexión</string>
<string name="connection_state_waiting_5">-</string>
<string name="connection_state_offline">%1$d %2$s desconectado</string>
<string name="archive_available_request_message">¿Almacenar el histórico de mensaje en el servidor?\nEsto permite a Xabber cargar el historial desde todos los dispositivos que usen esta cuenta.\nEsta funcionalidad usará algo de tráfico adicional y reducirá ligeramente la velocidad de conexión.\nATENCIÓN: Todo el historial local será eliminado.</string>
<string name="archive_available_request_title">¿Activar archivado de mensajes?</string>
......
......@@ -67,7 +67,7 @@
<string name="account_color_name_red">Rouge</string>
<string name="account_color_name_blue">Bleu</string>
<string name="account_color_name_indigo">Indigo</string>
<string name="account_color_name_teal">Vert-de-gris</string>
<string name="account_color_name_teal">Turquoise</string>
<string name="account_color_name_blue_grey">Bleu-gris</string>
<string name="account_color_name_cyan">Bleu-vert</string>
<string name="account_color_name_cyan">Cyan</string>
</resources>
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Anniversaire</string>
<string name="vcard_url">Site Web</string>
<string name="vcard_organization">Organisation</string>
<string name="vcard_organization_unit">Unité organisationnelle</string>
<string name="vcard_title">Titre de l\'emploi, de la fonction</string>
<string name="vcard_role">Rôle</string>
<string name="vcard_other">Autres informations</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Éditer l\'alias</string>
<string name="edit_contact_groups">Éditer les groupes</string>
<string name="remove_contact">Supprimer le contact</string>
<string name="edit_account_user_info">Éditer infos utilisateur</string>
<string name="account_user_info_save_success">Infos de l\'utilisateur sauvegardées avec succès</string>
<string name="account_user_info_save_fail">Échec de la sauvegarde des infos de l\'utilisateur</string>
<string name="saving">Sauvegarde en cours&#8230;</string>
<string name="choose_from_gallery">Choisir dans la galerie</string>
<string name="take_photo">Prendre une photo</string>
<string name="remove_avatar">Retirer l\'avatar</string>
<string name="change">Changer</string>
</resources>
......@@ -21,4 +21,9 @@
<string name="muc_invite_confirm_reason">%2$s vous a invité à rejoindre la conférence %3$s : %4$s. La rejoindre avec le compte %1$s ?</string>
<string name="muc_leave">Quitter la conférence</string>
<string name="muc_save">Enregistrer la conférence</string>
<string name="muc_choose_conference">Choisir une conférence</string>
<string name="muc_next">Suivant</string>
<string name="muc_get_hosted_conferences">Obtenez la liste des conférences hébergées</string>
<string name="muc_error_getting_conferences">Erreur lors de l\'obtention de la liste de conférences</string>
<string name="muc_type_conference_name">Entrez le nom de la conférence</string>
</resources>
......@@ -3,35 +3,28 @@
<resources>
<string name="account_quantity_1">compte</string>
<string name="account_quantity_2">comptes</string>
<string name="account_quantity_5">-</string>
<string name="account_quantity_offline_1">compte</string>
<string name="account_quantity_offline_2">comptes</string>
<string name="account_quantity_offline_5">-</string>
<string name="AUTHENTICATION_FAILED">Erreur d\'autorisation</string>
<string name="chat_contact_quantity_1">contact</string>
<string name="chat_contact_quantity_2">contacts</string>
<string name="chat_contact_quantity_5">-</string>
<string name="chat_message_quantity_1">message</string>
<string name="chat_message_quantity_2">messages</string>
<string name="chat_message_quantity_5">-</string>
<string name="chat_status">%1$d %2$s de %3$d %4$s</string>
<string name="chat_messages_from_contact">%1$d %2$s de %3$s</string>
<string name="chat_contact_and_message">%1$s : %2$s</string>
<string name="connection_state_connected_1">%1$d %3$s en ligne sur %2$d</string>
<string name="connection_state_connected_2">%1$d %3$s en ligne sur %2$d</string>
<string name="connection_state_connected_5">-</string>
<string name="connection_state_connecting_1">%1$d %3$s sur %2$d en cours de connexion</string>
<string name="connection_state_connecting_2">%1$d %3$s sur %2$d en cours de connexion</string>
<string name="connection_state_connecting_5">-</string>
<string name="connection_state_waiting_1">%1$d %3$s sur %2$d en attente de connexion</string>
<string name="connection_state_waiting_2">%1$d %3$s sur %2$d en attente de connexion</string>
<string name="connection_state_waiting_5">-</string>
<string name="connection_state_offline">%1$d %2$s hors-ligne</string>
<string name="archive_available_request_message">Souhaitez-vous stocker l\'historique des messages sur le serveur ?\nCela permet à Xabber d\'obtenir l\'historique des messages pour l\'ensemble des appareils qui utilisent ce compte.\nCette fonction génère un peu plus de trafic et réduit légèrement la vitesse de connexion.\nATTENTION : Tout votre historique local va être supprimé.</string>
<string name="archive_available_request_title">Activer l\'archivage des messages ?</string>
<string name="INVALID_CERTIFICATE">Certificat non-valide</string>
<string name="muc_invite_message">Souhaitez-vous rejoindre la conférence ?</string>
<string name="otr_verification_in_progress">Appuyez pour annuler.</string>
<string name="otr_verification_in_progress">Appuyez ici pour annuler.</string>
<string name="PASSWORD_REQUIRED">Mot de passe requis</string>
<string name="pay_attention">Demande d\'attention</string>
<string name="subscription_request_message">Demande d\'autorisation</string>
......
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="cache_clear">Vider le cache\nSupprime toutes les données locales. Libère de l\'espace.</string>
<string name="cache_clear">Vider le cache\nSupprime toutes les données locales. Peut libérer de l\'espace.</string>
<string name="cache_clear_warning">Êtes-vous sûr de vouloir supprimer les historiques des conversations et autres données locales ?\nLes paramètres des comptes et les listes de contacts ne seront pas affectés. L\'application sera fermée.</string>
<string name="chats_send_by_enter">\"Entrée\" pour envoyer\nAppuyer sur \"Entrée\" envoie le message</string>
<string name="connection_go_away">Absence automatique\nPasser au statut \"Absent\" au verrouillage de l\'écran</string>
<string name="contacts_order">Trier les contacts\nChoisir l\'ordre d\'affichage des contacts</string>
<string name="contacts_order_alphabet">Alphabétique</string>
<string name="contacts_order_status">Par statut</string>
<string name="contacts_show_accounts">Grouper par compte\nGroupe les contacts dans la liste de contacts par compte</string>
<string name="contacts_show_accounts">Grouper par compte\nGroupe les contacts par compte dans la liste de contacts</string>
<string name="contacts_show_active_chats">Conversations actives en haut\nAffiche les conversations actives en haut de la liste de contacts</string>
<string name="contacts_show_avatars">Afficher les avatars\nAfficher les avatars des utilisateurs dans la liste de contacts</string>
<string name="contacts_show_avatars">Afficher les avatars\nAffiche les avatars des utilisateurs dans la liste de contacts</string>
<string name="contacts_show_empty_groups">Afficher les groupes vides\nAfficher les groupes sans contact en ligne</string>
<string name="contacts_show_groups">Afficher les groupes\nAfficher les groupes dans la liste de contacts</string>
<string name="contacts_show_groups">Afficher les groupes\nAffiche les groupes dans la liste de contacts</string>
<string name="contacts_show_offline">Afficher les contacts hors-ligne</string>
<string name="contacts_show_panel">Boutons de compte\nAffiche des boutons d\'action avec avatar en bas et à droite de la liste de contacts</string>
<string name="contacts_stay_active_chats">Dupliquer les conversations actives\nLes conversations actives apparaissent à la fois en haut de la liste de contacts et dans les groupes</string>
<string name="debug_log">Journal de débogage\nÉcrire les messages dans le journal de débogage (redémarrez l\'application pour appliquer)</string>
<string name="events_lightning">Notification lumineuse\nLa LED clignote lors d\'une notification</string>
<string name="events_persistent">Icône de barre des tâches\nAffiche une notification en permanence. Cette option empêche Android de décharger l\'application de la mémoire</string>
<string name="events_persistent">Icône de barre des tâches\nAffiche une notification permanente. Cette option force Android à garder l\'application en mémoire</string>
<string name="events_sound">Sonnerie\nChoisir la sonnerie de notification</string>
<string name="events_vibro">Vibration\nVibrer lors de la notification</string>
<string name="interface_theme">Thème\nParamètres de thème</string>
......@@ -48,7 +48,7 @@
<string name="chats_show_status_change">Afficher les changements de statut\nAfficher les messages de changement de statut</string>
<string name="chats_show_status_change_muc">Dans les conférences</string>
<string name="chats_state_notification">Envoyer notifications d\'écriture\nNotifie vos interlocuteurs lorsque vous écrivez</string>
<string name="connection_adjust_priority">Ajuster la priorité\nModifie la priorité selon le statut sélectionné. Limite la priorité du compte.</string>
<string name="connection_adjust_priority">Ajuster la priorité\nModifie la priorité selon le statut sélectionné. Ce paramètre l\'emporte sur la priorité globale du compte.</string>
<string name="connection_go_away_immediately">Dès le verrouillage de l\'écran</string>
<string name="connection_go_xa">Absence prolongée en cas d\'inactivité\nPasser en absence prolongée au verrouillage de l\'écran</string>
<string name="connection_priority">Paramètres de priorité</string>
......
......@@ -5,7 +5,7 @@
<string name="away">Absent</string>
<string name="chat">Disponible pour bavarder !</string>
<string name="dnd">Ne pas déranger</string>
<string name="edit_status">Editer le statut</string>
<string name="edit_status">Éditer le statut</string>
<string name="empty_status">&lt;Pas de statut&gt;</string>
<string name="invisible">Invisible</string>
<string name="remove_status">Supprimer le statut</string>
......
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Compleanno</string>
<string name="vcard_url">Sito web</string>
<string name="vcard_organization">Organizzazione</string>
<string name="vcard_organization_unit">Unità organizzativa</string>
<string name="vcard_title">Lavoro, funzione</string>
<string name="vcard_role">Ruolo</string>
<string name="vcard_other">Altre informazioni</string>
......@@ -33,7 +34,7 @@
<string name="vcard_type_work">Lavoro</string>
<string name="vcard_type_postal">Postale</string>
<string name="vcard_type_parcel">Pacco</string>
<string name="vcard_type_dom">Domicilio</string>
<string name="vcard_type_dom">Nazionale</string>
<string name="vcard_type_intl">Internazionale</string>
<string name="vcard_type_pref">Preferito</string>
<string name="vcard_type_voice">Voce</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Modifica alias</string>
<string name="edit_contact_groups">Modifica gruppo</string>
<string name="remove_contact">Rimuovi contatto</string>
<string name="edit_account_user_info">Modifica informazioni utente</string>
<string name="account_user_info_save_success">Salvataggio delle informazioni utente dell\'account riuscito</string>
<string name="account_user_info_save_fail">Impossibile salvare le informazioni utente dell\'account</string>
<string name="saving">Salvataggio&#8230;</string>
<string name="choose_from_gallery">Scegli dalla galleria</string>
<string name="take_photo">Scatta una foto</string>
<string name="remove_avatar">Rimuovi avatar</string>
<string name="change">Cambia</string>
</resources>
......@@ -3,7 +3,7 @@
<resources>
<string name="EMPTY_NICK_NAME">Nickname non specificato</string>
<string name="EMPTY_ROOM_NAME">Conferenza non specificata</string>
<string name="muc_join">Entra in conferenza</string>
<string name="muc_join">Entra nella conferenza</string>
<string name="muc_nick">Nickname</string>
<string name="muc_nick_hint">Il tuo nickname nella conferenza</string>
<string name="muc_password">Password</string>
......@@ -16,9 +16,14 @@
<string name="muc_add">Aggiungi conferenza</string>
<string name="muc_delete">Rimuovi conferenza</string>
<string name="muc_delete_confirm">Vuoi davvero rimuovere la conferenza %1$s dall\'account %2$s?</string>
<string name="muc_edit">Impostazioni di autenticazione</string>
<string name="muc_edit">Impostazioni di autorizzazione</string>
<string name="muc_invite_confirm">%2$s ti ha invitato ad entrare nella conferenza %3$s. Vuoi entrare con l\'account %1$s?</string>
<string name="muc_invite_confirm_reason">%2$s ti ha invitato ad entrare nella conferenza %3$s: %4$s. Vuoi entrare con l\'account %1$s?</string>
<string name="muc_leave">Abbandona conferenza</string>
<string name="muc_save">Salva conferenza</string>
<string name="muc_choose_conference">Scegli conferenza</string>
<string name="muc_next">Successivo</string>
<string name="muc_get_hosted_conferences">Ottieni conferenze ospitate</string>
<string name="muc_error_getting_conferences">Errore nell\'ottenere la lista delle conferenze</string>
<string name="muc_type_conference_name">Inserire nome conferenza</string>
</resources>
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">誕生日</string>
<string name="vcard_url">Web サイト</string>
<string name="vcard_organization">所属</string>
<string name="vcard_organization_unit">組織単位</string>
<string name="vcard_title">肩書, 役職</string>
<string name="vcard_role">役割</string>
<string name="vcard_other">その他の情報</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">エイリアスを編集</string>
<string name="edit_contact_groups">グループを編集</string>
<string name="remove_contact">連絡先を削除</string>
<string name="edit_account_user_info">ユーザー情報を編集</string>
<string name="account_user_info_save_success">アカウントのユーザー情報を正常に保存しました</string>
<string name="account_user_info_save_fail">アカウントのユーザー情報を保存できませんでした</string>
<string name="saving">保存中&#8230;</string>
<string name="choose_from_gallery">ギャラリーから選択</string>
<string name="take_photo">写真を撮影</string>
<string name="remove_avatar">アバターを削除</string>
<string name="change">変更</string>
</resources>
......@@ -3,29 +3,22 @@
<resources>
<string name="account_quantity_1">アカウント</string>
<string name="account_quantity_2">アカウント</string>
<string name="account_quantity_5">-</string>
<string name="account_quantity_offline_1">アカウント</string>
<string name="account_quantity_offline_2">アカウント</string>
<string name="account_quantity_offline_5">-</string>
<string name="AUTHENTICATION_FAILED">認証エラー</string>
<string name="chat_contact_quantity_1">連絡先</string>
<string name="chat_contact_quantity_2">連絡先</string>
<string name="chat_contact_quantity_5">-</string>
<string name="chat_message_quantity_1">メッセージ</string>
<string name="chat_message_quantity_2">メッセージ</string>
<string name="chat_message_quantity_5">-</string>
<string name="chat_status">%3$d %4$s から %1$d %2$s</string>
<string name="chat_messages_from_contact">%3$s から %1$d %2$s</string>
<string name="chat_contact_and_message">%1$s: %2$s</string>
<string name="connection_state_connected_1">%1$d / %2$d %3$s オンライン</string>
<string name="connection_state_connected_2">%1$d / %2$d %3$s オンライン</string>
<string name="connection_state_connected_5">-</string>
<string name="connection_state_connecting_1">%1$d / %2$d %3$s 接続中</string>
<string name="connection_state_connecting_2">%1$d / %2$d %3$s 接続中</string>
<string name="connection_state_connecting_5">-</string>
<string name="connection_state_waiting_1">%1$d / %2$d %3$s 接続待機中</string>
<string name="connection_state_waiting_2">%1$d / %2$d %3$s 接続待機中</string>
<string name="connection_state_waiting_5">-</string>
<string name="connection_state_offline">%1$d %2$s オフライン</string>
<string name="archive_available_request_message">サーバーにメッセージの履歴を保存しますか?\nこのアカウントを使用するすべてのデバイスで Xabber がメッセージの履歴をロードすることができるようになります.\nこの機能は追加の通信が発生し, 接続速度が少し低下することがあります.\n警告: ローカルの履歴はすべて削除されます.</string>
<string name="archive_available_request_title">メッセージのアーカイブを有効にしますか?</string>
......
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Urodziny</string>
<string name="vcard_url">Strona WWW</string>
<string name="vcard_organization">Organizacja</string>
<string name="vcard_organization_unit">Organizacja</string>
<string name="vcard_title">Praca, nazwa posady</string>
<string name="vcard_role">Rola</string>
<string name="vcard_other">Inne informacje</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Edytuj alias</string>
<string name="edit_contact_groups">Edytuj grupy</string>
<string name="remove_contact">Usuń kontakt</string>
<string name="edit_account_user_info">Edytuj dane użytkownika</string>
<string name="account_user_info_save_success">Dane użytkownika zapisane poprawnie</string>
<string name="account_user_info_save_fail">Nie udało się zapisać danych użytkownika</string>
<string name="saving">Zapisuję&#8230;</string>
<string name="choose_from_gallery">Wybierz z galerii</string>
<string name="take_photo">Zrób zdjęcie</string>
<string name="remove_avatar">Usuń obraz</string>
<string name="change">Zmień</string>
</resources>
......@@ -21,4 +21,9 @@
<string name="muc_invite_confirm_reason">%2$s zaprosił cię do wzięcia udziału w konferencji %3$s: %4$s. Dołączyć z konta %1$s?</string>
<string name="muc_leave">Wyjdź z konferencji</string>
<string name="muc_save">Zachowaj konferencję</string>
<string name="muc_choose_conference">Wybierz konferencję</string>
<string name="muc_next">Dalej</string>
<string name="muc_get_hosted_conferences">Pobierz konferencje</string>
<string name="muc_error_getting_conferences">Błąd pobierania konferencji</string>
<string name="muc_type_conference_name">Wpisz nazwę konferencji</string>
</resources>
......@@ -13,19 +13,15 @@
<string name="chat_contact_quantity_5">kontaktów</string>
<string name="chat_message_quantity_1">wiadomość</string>
<string name="chat_message_quantity_2">wiadomości</string>
<string name="chat_message_quantity_5">-</string>
<string name="chat_status">%1$d %2$s od %3$d %4$s</string>
<string name="chat_messages_from_contact">%1$d %2$s od %3$s</string>
<string name="chat_contact_and_message">%1$s: %2$s</string>
<string name="connection_state_connected_1">%1$d z %2$d %3$s połączonych</string>
<string name="connection_state_connected_2">%1$d z %2$d %3$s połączono</string>
<string name="connection_state_connected_5">-</string>
<string name="connection_state_connecting_1">%1$d z %2$d %3$s łączę</string>
<string name="connection_state_connecting_2">%1$d of %2$d %3$s łączę</string>
<string name="connection_state_connecting_5">-</string>
<string name="connection_state_waiting_1">%1$d z %2$d %3$s oczekuje na połączenie</string>
<string name="connection_state_waiting_2">%1$d z %2$d %3$s czeka na połączenie</string>
<string name="connection_state_waiting_5">-</string>
<string name="connection_state_offline">%1$d %2$s niepołączone</string>
<string name="archive_available_request_message">Czy chciałbyś zapisywać historię wiadomości na serwerze?\nTo zezwala Xabberowi ładować historię rozmów z wszystkich urządzeń używających tego konta.\nTa funkcja może zwiększyć zużycie danych i lekko zredukować prędkość połączenia.\nUWAGA: Cała twoja lokalna historia zostanie usunięta.</string>
<string name="archive_available_request_title">Włączyć archiwum wiadomości?</string>
......
......@@ -29,11 +29,14 @@
<string name="account_custom_summary">Usar configurações de host personalizado em vez de registro SRV</string>
<string name="account_enabled_summary">Marque para ativar a conta</string>
<string name="account_invalid_port">A porta deve ser um número (padrão: 5222)</string>
<string name="account_invalid_port_range">A porta deve ser um número entre 1 e 65535 (o padrão é: 5222)</string>
<string name="account_invalid_priority">O valor da prioridade deve ser um número entre -128 e 128 (padrão: 10)</string>
<string name="account_oauth">Autorização</string>
<string name="account_oauth_invalidated">Não autorizado</string>
<string name="account_oauth_summary">Configuração de Autenticação</string>
<string name="account_proxy_host">Servidor proxy</string>
<string name="account_proxy_invalid_port_range">A porta de proxy deve ser um número entre 1 e 65535 (o padrão é: 8080)</string>
<string name="account_proxy_invalid_port">A porta de proxy deve ser um número (o padrão é: 8080)</string>
<string name="account_proxy_password">Senha do proxy</string>
<string name="account_proxy_port">Porta do proxy</string>
<string name="account_proxy_type">Tipo de proxy</string>
......
......@@ -49,4 +49,12 @@
<string name="edit_alias">Editar alias</string>
<string name="edit_contact_groups">Editar Grupos</string>
<string name="remove_contact">Remover o contato</string>
<string name="edit_account_user_info">Editar info. pessoais</string>
<string name="account_user_info_save_success">Informações pessoais salvas com sucesso</string>
<string name="account_user_info_save_fail">Não foi possível salvar informações pessoais</string>
<string name="saving">Salvando&#8230;</string>
<string name="choose_from_gallery">Usar foto da galeria</string>
<string name="take_photo">Tirar foto</string>
<string name="remove_avatar">Remover avatar</string>
<string name="change">Alterar foto</string>
</resources>
......@@ -21,4 +21,6 @@
<string name="muc_invite_confirm_reason">%2$s convidou você para entrar na conferência %3$s: %4$s. Entrar pela conta %1$s?</string>
<string name="muc_leave">Sair da conferência</string>
<string name="muc_save">Salvar conferência</string>
<string name="muc_get_hosted_conferences">Baixar lista de conferências</string>
<string name="muc_error_getting_conferences">Erro ao baixar conferências</string>
</resources>
......@@ -65,6 +65,7 @@
<string name="events_message_none">Não avisar</string>
<string name="events_show_text">Exibir mensagem na notificação\nExibir mensagem de texto na área de notificação</string>
<string name="events_visible_chat">Notificação na conversa atual\nNotificar mensagens entregues na conversa atual</string>
<string name="events_suppress_100">Suprimir algumas mensagens de status\nNão receber a mensagem \'Essa sala não é anônima\"</string>
<string name="negative_priotiry_summary">%s (você não receberá mensagens de nenhuma conversa)</string>
<string name="preference_accounts">Contas XMPP\nGerir contas</string>
<string name="preference_security">Segurança\nConfigurações de segurança</string>
......
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">Дата рождения</string>
<string name="vcard_url">Сайт</string>
<string name="vcard_organization">Организация</string>
<string name="vcard_organization_unit">Отдел</string>
<string name="vcard_title">Должность</string>
<string name="vcard_role">Должностные функции</string>
<string name="vcard_other">Общая информация</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Редактировать псевдоним</string>
<string name="edit_contact_groups">Редактировать группы</string>
<string name="remove_contact">Удалить контакт</string>
<string name="edit_account_user_info">Редактировать информацию о пользователе</string>
<string name="account_user_info_save_success">Информация о пользователе успешно изменена</string>
<string name="account_user_info_save_fail">Не удалось сохранить изменения информации о пользователе</string>
<string name="saving">Сохранение&#8230;</string>
<string name="choose_from_gallery">Выбрать из галереи</string>
<string name="take_photo">Сделать фотографию</string>
<string name="remove_avatar">Удалить аватар</string>
<string name="change">Изменить</string>
</resources>
......@@ -29,11 +29,14 @@
<string name="account_custom_summary">Вказати хост для підключення вручну, замість використання SRV запису</string>
<string name="account_enabled_summary">Позначте, для включення облікового запису</string>
<string name="account_invalid_port">Порт має бути числом (типове значення: 5222)</string>
<string name="account_invalid_port_range">Порт має бути від 1 до 65535 (за замовчуванням: 5222)</string>
<string name="account_invalid_priority">Пріоритет має бути в діапазоні між -128 і 128 (типове значення :10)</string>
<string name="account_oauth">Авторизація</string>
<string name="account_oauth_invalidated">Не авторизований</string>
<string name="account_oauth_summary">Налаштування OAuth</string>
<string name="account_proxy_host">Вузол проксі</string>
<string name="account_proxy_invalid_port_range">Проксі порт має бути від 1 до 65535 (за замовчуванням: 8080)</string>
<string name="account_proxy_invalid_port">Порт проксі-сервера має бути числом (за замовчуванням: 8080)</string>
<string name="account_proxy_password">Пароль</string>
<string name="account_proxy_port">Порт проксі</string>
<string name="account_proxy_type">Тип проксі</string>
......
......@@ -13,6 +13,7 @@
<string name="vcard_birth_date">День народження</string>
<string name="vcard_url">Веб-сайт</string>
<string name="vcard_organization">Організація</string>
<string name="vcard_organization_unit">Організаційна одиниця</string>
<string name="vcard_title">Посада</string>
<string name="vcard_role">Роль</string>
<string name="vcard_other">Інша інформація</string>
......@@ -49,4 +50,12 @@
<string name="edit_alias">Редагувати псевдонім</string>
<string name="edit_contact_groups">Редагувати групу</string>
<string name="remove_contact">Видалити контакт</string>
<string name="edit_account_user_info">Редагувати інформацію користувача</string>
<string name="account_user_info_save_success">Інформація про користувача успішно збережено</string>
<string name="account_user_info_save_fail">Не вдалося зберегти інформацію про користувача</string>
<string name="saving">Збереження&#8230;</string>
<string name="choose_from_gallery">Вибрати з галереї</string>
<string name="take_photo">Зробити фото</string>
<string name="remove_avatar">Видалити Аватар</string>
<string name="change">Змінити</string>
</resources>
......@@ -21,4 +21,9 @@
<string name="muc_invite_confirm_reason">%2$s запрошує Вас до конференції %3$s: %4$s. Приєднатись з облікового запису %1$s?</string>
<string name="muc_leave">Покинути конференцію</string>
<string name="muc_save">Зберегти конференцію</string>
<string name="muc_choose_conference">Вибрати конференцію</string>
<string name="muc_next">Далі</string>
<string name="muc_get_hosted_conferences">Отримати відкриті конференції</string>
<string name="muc_error_getting_conferences">Помилка отримання конференцій</string>
<string name="muc_type_conference_name">Введіть назву конференції</string>
</resources>
......@@ -65,6 +65,7 @@
<string name="events_message_none">Не сповіщати</string>
<string name="events_show_text">Повідомлення в сповіщеннях\nПоказувати текст повідомлення в області сповіщень</string>
<string name="events_visible_chat">Сповіщення в поточному чаті\nСповіщати о вхідних повідомлення в поточному чаті</string>
<string name="events_suppress_100">Приховати деякі повідомлення статусу\nНе отримувати \'Ця кімната не анонімна\' повідомлення</string>
<string name="negative_priotiry_summary">%s (Ви не зможете отримувати повідомлення із будь-яких балачок)</string>
<string name="preference_accounts">XMPP аккаунти\nУправління аккаунтами</string>
<string name="preference_security">Безпека\nНалаштування безпеки</string>
......
......@@ -40,7 +40,6 @@
<item>com.xabber.android.data.extension.cs.ChatStateManager</item>
<item>com.xabber.android.data.connection.NetworkManager</item>
<item>com.xabber.android.data.account.OAuthManager</item>
<item>com.xabber.android.data.account.WLMManager</item>
<item>com.xabber.android.data.roster.SyncManager</item>
<item>com.xabber.android.data.connection.DNSManager</item>
<item>com.xabber.android.data.connection.CertificateManager</item>
......@@ -359,7 +358,7 @@
<!-- preference_debug -->
<string name="debug_log_key">debug_log</string>
<bool name="debug_log_default">false</bool>
<bool name="debug_log_default">true</bool>
<!-- preference_about -->
<string name="preference_about">@string/about_viewer</string>
......@@ -434,7 +433,7 @@
<item>@string/account_archive_mode_dont_store</item>
</string-array>
<string name="account_archive_mode_default_value">available</string>
<string name="account_archive_mode_default_value">local</string>
<!-- preference_security -->
<string name="security_check_certificate_key">security_check_certificate</string>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment