Commit ad91b14b authored by Grigory Fedorov's avatar Grigory Fedorov

Merge branch 'release/1.0.45'

parents 483b58d5 a0a657b7
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
url = https://github.com/otr4j/otr4j.git url = https://github.com/otr4j/otr4j.git
[submodule "app/MemorizingTrustManager"] [submodule "app/MemorizingTrustManager"]
path = app/MemorizingTrustManager path = app/MemorizingTrustManager
url = https://github.com/ge0rg/MemorizingTrustManager.git url = https://github.com/redsolution/MemorizingTrustManager.git
Subproject commit 8b80fb176542fa96c1028c379be8de7e32c730df Subproject commit a1cea31efeab968683e461e6b4ab1e0b87293103
...@@ -7,8 +7,8 @@ android { ...@@ -7,8 +7,8 @@ android {
defaultConfig { defaultConfig {
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 23 targetSdkVersion 23
versionCode 217 versionCode 218
versionName '1.0.44' versionName '1.0.45'
} }
compileOptions { compileOptions {
......
...@@ -30,6 +30,7 @@ import java.util.List; ...@@ -30,6 +30,7 @@ import java.util.List;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
import android.support.v4.view.PagerAdapter; import android.support.v4.view.PagerAdapter;
...@@ -85,6 +86,7 @@ public class EmojiconsPopup extends PopupWindow implements ViewPager.OnPageChang ...@@ -85,6 +86,7 @@ public class EmojiconsPopup extends PopupWindow implements ViewPager.OnPageChang
//default size //default size
setSize((int) mContext.getResources().getDimension(R.dimen.keyboard_height), LayoutParams.MATCH_PARENT); setSize((int) mContext.getResources().getDimension(R.dimen.keyboard_height), LayoutParams.MATCH_PARENT);
setBackgroundDrawable(new BitmapDrawable());
} }
/** /**
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
android:id="@+id/Emoji_GridView" android:id="@+id/Emoji_GridView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"
android:columnWidth="40dip" android:columnWidth="40dip"
android:horizontalSpacing="0dip" android:horizontalSpacing="0dip"
android:numColumns="auto_fit" android:numColumns="auto_fit"
......
...@@ -16,9 +16,10 @@ ...@@ -16,9 +16,10 @@
--> -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/keyboard_background_holo" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_height="match_parent"> android:background="@android:color/darker_gray">
<LinearLayout <LinearLayout
android:id="@+id/emojis_tab" android:id="@+id/emojis_tab"
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -105,15 +106,12 @@ ...@@ -105,15 +106,12 @@
android:id="@+id/emojis_backspace" android:id="@+id/emojis_backspace"
android:src="@drawable/sym_keyboard_delete_holo_dark"/> android:src="@drawable/sym_keyboard_delete_holo_dark"/>
</LinearLayout> </LinearLayout>
<android.support.v4.view.ViewPager <android.support.v4.view.ViewPager
android:layout_below="@id/emojis_tab" android:layout_below="@id/emojis_tab"
android:id="@+id/emojis_pager" android:id="@+id/emojis_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentBottom="true"/> android:layout_alignParentBottom="true"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@id/emojis_tab"
android:background="#8f8f8f"/>
</RelativeLayout> </RelativeLayout>
...@@ -46,6 +46,8 @@ import java.util.HashMap; ...@@ -46,6 +46,8 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import de.duenndns.ssl.MemorizingTrustManager;
/** /**
* Manage certificate exceptions. * Manage certificate exceptions.
* <p/> * <p/>
...@@ -402,9 +404,9 @@ public class CertificateManager implements OnLoadListener, OnClearListener { ...@@ -402,9 +404,9 @@ public class CertificateManager implements OnLoadListener, OnClearListener {
public void removeCertificates() { public void removeCertificates() {
pendingCertificateProvider.clearNotifications(); pendingCertificateProvider.clearNotifications();
ignoreCertificates.clear(); ignoreCertificates.clear();
for (CertificateInvalidReason reason : CertificateInvalidReason for (CertificateInvalidReason reason : CertificateInvalidReason.values()) {
.values())
keyStores.put(reason, createKeyStore(reason)); keyStores.put(reason, createKeyStore(reason));
}
Application.getInstance().runInBackground(new Runnable() { Application.getInstance().runInBackground(new Runnable() {
@Override @Override
...@@ -414,5 +416,16 @@ public class CertificateManager implements OnLoadListener, OnClearListener { ...@@ -414,5 +416,16 @@ public class CertificateManager implements OnLoadListener, OnClearListener {
} }
}); });
MemorizingTrustManager mtm = new MemorizingTrustManager(Application.getInstance());
final Enumeration<String> certificates = mtm.getCertificates();
while (certificates.hasMoreElements()) {
try {
mtm.deleteCertificate(certificates.nextElement());
} catch (KeyStoreException e) {
e.printStackTrace();
}
}
} }
} }
...@@ -189,6 +189,7 @@ public class ConnectionThread implements ...@@ -189,6 +189,7 @@ public class ConnectionThread implements
try { try {
SSLContext sslContext = SSLContext.getInstance("TLS"); SSLContext sslContext = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(Application.getInstance()); MemorizingTrustManager mtm = new MemorizingTrustManager(Application.getInstance());
mtm.setTrustByDefault(!SettingsManager.securityCheckCertificate());
sslContext.init(null, new X509TrustManager[]{mtm}, new java.security.SecureRandom()); sslContext.init(null, new X509TrustManager[]{mtm}, new java.security.SecureRandom());
builder.setCustomSSLContext(sslContext); builder.setCustomSSLContext(sslContext);
builder.setHostnameVerifier( builder.setHostnameVerifier(
......
...@@ -244,8 +244,9 @@ public class ChatStateManager implements OnDisconnectListener, ...@@ -244,8 +244,9 @@ public class ChatStateManager implements OnDisconnectListener,
if (text.length() == 0) { if (text.length() == 0) {
updateChatState(account, user, ChatState.active); updateChatState(account, user, ChatState.active);
return; return;
} else } else {
updateChatState(account, user, ChatState.composing); updateChatState(account, user, ChatState.composing);
}
Intent intent = ComposingPausedReceiver.createIntent( Intent intent = ComposingPausedReceiver.createIntent(
Application.getInstance(), account, user); Application.getInstance(), account, user);
PendingIntent pendingIntent = PendingIntent.getBroadcast( PendingIntent pendingIntent = PendingIntent.getBroadcast(
...@@ -261,6 +262,10 @@ public class ChatStateManager implements OnDisconnectListener, ...@@ -261,6 +262,10 @@ public class ChatStateManager implements OnDisconnectListener,
public void onPaused(String account, String user) { public void onPaused(String account, String user) {
if (account == null || user == null) if (account == null || user == null)
return; return;
if (sent.get(account, user) != ChatState.composing) {
return;
}
updateChatState(account, user, ChatState.paused); updateChatState(account, user, ChatState.paused);
pauseIntents.remove(account, user); pauseIntents.remove(account, user);
} }
......
...@@ -172,7 +172,7 @@ public class MessageManager implements OnLoadListener, OnPacketListener, OnDisco ...@@ -172,7 +172,7 @@ public class MessageManager implements OnLoadListener, OnPacketListener, OnDisco
* @return * @return
*/ */
private RegularChat createChat(String account, String user) { private RegularChat createChat(String account, String user) {
RegularChat chat = new RegularChat(account, user); RegularChat chat = new RegularChat(account, Jid.getBareAddress(user));
addChat(chat); addChat(chat);
return chat; return chat;
} }
......
...@@ -56,6 +56,9 @@ import com.xabber.android.ui.helper.AccountPainter; ...@@ -56,6 +56,9 @@ import com.xabber.android.ui.helper.AccountPainter;
import com.xabber.android.ui.helper.ContactTitleInflater; import com.xabber.android.ui.helper.ContactTitleInflater;
import com.xabber.android.ui.preferences.ChatContactSettings; import com.xabber.android.ui.preferences.ChatContactSettings;
import java.util.Timer;
import java.util.TimerTask;
import github.ankushsachdeva.emojicon.EmojiconGridView; import github.ankushsachdeva.emojicon.EmojiconGridView;
import github.ankushsachdeva.emojicon.EmojiconsPopup; import github.ankushsachdeva.emojicon.EmojiconsPopup;
import github.ankushsachdeva.emojicon.emoji.Emojicon; import github.ankushsachdeva.emojicon.emoji.Emojicon;
...@@ -86,6 +89,9 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem ...@@ -86,6 +89,9 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
private MessageItem clickedMessageItem; private MessageItem clickedMessageItem;
private AccountPainter accountPainter; private AccountPainter accountPainter;
private Timer stopTypingTimer = new Timer();
private final long STOP_TYPING_DELAY = 4000; // in ms
public static ChatViewerFragment newInstance(String account, String user) { public static ChatViewerFragment newInstance(String account, String user) {
ChatViewerFragment fragment = new ChatViewerFragment(); ChatViewerFragment fragment = new ChatViewerFragment();
...@@ -150,7 +156,6 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem ...@@ -150,7 +156,6 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
AbstractChat abstractChat = MessageManager.getInstance().getChat(account, user); AbstractChat abstractChat = MessageManager.getInstance().getChat(account, user);
securityButton = (ImageButton) view.findViewById(R.id.button_security); securityButton = (ImageButton) view.findViewById(R.id.button_security);
View spacer = view.findViewById(R.id.button_security_spacer);
if (abstractChat instanceof RegularChat) { if (abstractChat instanceof RegularChat) {
securityButton.setOnClickListener(new View.OnClickListener() { securityButton.setOnClickListener(new View.OnClickListener() {
...@@ -161,7 +166,6 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem ...@@ -161,7 +166,6 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
}); });
} else { } else {
securityButton.setVisibility(View.GONE); securityButton.setVisibility(View.GONE);
spacer.setVisibility(View.VISIBLE);
} }
chatMessageAdapter = new ChatMessageAdapter(getActivity(), account, user, this); chatMessageAdapter = new ChatMessageAdapter(getActivity(), account, user, this);
...@@ -202,6 +206,9 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem ...@@ -202,6 +206,9 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!skipOnTextChanges && stopTypingTimer != null) {
stopTypingTimer.cancel();
}
} }
@Override @Override
...@@ -212,10 +219,25 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem ...@@ -212,10 +219,25 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
public void afterTextChanged(Editable text) { public void afterTextChanged(Editable text) {
setUpInputViewButtons(); setUpInputViewButtons();
if (skipOnTextChanges) {
if (!skipOnTextChanges) { return;
ChatStateManager.getInstance().onComposing(account, user, text);
} }
ChatStateManager.getInstance().onComposing(account, user, text);
stopTypingTimer = new Timer();
stopTypingTimer.schedule(new TimerTask() {
@Override
public void run() {
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
ChatStateManager.getInstance().onPaused(account, user);
}
});
}
}, STOP_TYPING_DELAY);
} }
}); });
...@@ -404,6 +426,9 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem ...@@ -404,6 +426,9 @@ public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItem
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
ChatStateManager.getInstance().onPaused(account, user);
saveInputState(); saveInputState();
listener.unregisterChat(this); listener.unregisterChat(this);
} }
......
...@@ -17,6 +17,7 @@ package com.xabber.android.ui; ...@@ -17,6 +17,7 @@ package com.xabber.android.ui;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
...@@ -35,7 +36,7 @@ import com.xabber.android.ui.helper.AccountPainter; ...@@ -35,7 +36,7 @@ import com.xabber.android.ui.helper.AccountPainter;
import com.xabber.android.ui.helper.BarPainter; import com.xabber.android.ui.helper.BarPainter;
import com.xabber.android.ui.helper.SingleActivity; import com.xabber.android.ui.helper.SingleActivity;
public class ContactSubscription extends SingleActivity implements View.OnClickListener { public class ContactSubscription extends SingleActivity implements View.OnClickListener, ContactVcardViewerFragment.Listener {
private String account; private String account;
private String user; private String user;
...@@ -71,10 +72,14 @@ public class ContactSubscription extends SingleActivity implements View.OnClickL ...@@ -71,10 +72,14 @@ public class ContactSubscription extends SingleActivity implements View.OnClickL
setContentView(R.layout.contact_subscription); setContentView(R.layout.contact_subscription);
Toolbar toolbar = (Toolbar) findViewById(R.id.top_toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.top_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setTitle(getString(R.string.subscription_request_message)); toolbar.setTitle(getString(R.string.subscription_request_message));
toolbar.setNavigationIcon(R.drawable.ic_clear_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
BarPainter barPainter = new BarPainter(this, toolbar); BarPainter barPainter = new BarPainter(this, toolbar);
barPainter.updateWithAccountName(account); barPainter.updateWithAccountName(account);
...@@ -142,4 +147,8 @@ public class ContactSubscription extends SingleActivity implements View.OnClickL ...@@ -142,4 +147,8 @@ public class ContactSubscription extends SingleActivity implements View.OnClickL
finish(); finish();
} }
@Override
public void onVCardReceived() {
}
} }
...@@ -74,13 +74,6 @@ ...@@ -74,13 +74,6 @@
android:alpha="0.5" android:alpha="0.5"
/> />
<Space
android:id="@+id/button_security_spacer"
android:layout_width="16dp"
android:layout_height="match_parent"
android:visibility="gone"
/>
<github.ankushsachdeva.emojicon.EmojiconEditText <github.ankushsachdeva.emojicon.EmojiconEditText
android:id="@+id/chat_input" android:id="@+id/chat_input"
android:layout_width="0dp" android:layout_width="0dp"
......
...@@ -439,7 +439,7 @@ ...@@ -439,7 +439,7 @@
<!-- preference_security --> <!-- preference_security -->
<string name="security_check_certificate_key">security_check_certificate</string> <string name="security_check_certificate_key">security_check_certificate</string>
<bool name="security_check_certificate_default">false</bool> <bool name="security_check_certificate_default">true</bool>
<string name="security_clear_certificate_key">security_clear_certificate</string> <string name="security_clear_certificate_key">security_clear_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