otr messages are now ignored if conversations isnt 100% sure the message is ours
This commit is contained in:
parent
389d4db311
commit
6be2a08f19
|
@ -81,8 +81,24 @@
|
||||||
android:textSize="18sp"/>
|
android:textSize="18sp"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/features_header"
|
android:id="@+id/textView10"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@+id/textView4"
|
android:layout_below="@+id/textView4"
|
||||||
|
android:text="Connected accounts"
|
||||||
|
android:textSize="18sp"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/number_presences"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignBaseline="@+id/textView10"
|
||||||
|
android:layout_alignBottom="@+id/textView10"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:textSize="18sp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/features_header"
|
||||||
|
android:layout_below="@+id/textView10"
|
||||||
style="@style/sectionHeader"
|
style="@style/sectionHeader"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
@ -60,6 +60,7 @@ public class Account extends AbstractEntity{
|
||||||
|
|
||||||
transient OtrEngine otrEngine = null;
|
transient OtrEngine otrEngine = null;
|
||||||
transient XmppConnection xmppConnection = null;
|
transient XmppConnection xmppConnection = null;
|
||||||
|
transient protected Presences presences = new Presences();
|
||||||
|
|
||||||
private String otrFingerprint;
|
private String otrFingerprint;
|
||||||
|
|
||||||
|
@ -249,4 +250,20 @@ public class Account extends AbstractEntity{
|
||||||
this.getOtrEngine(applicationContext);
|
this.getOtrEngine(applicationContext);
|
||||||
return this.getOtrFingerprint();
|
return this.getOtrFingerprint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updatePresence(String resource, int status) {
|
||||||
|
this.presences.updatePresence(resource, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removePresence(String resource) {
|
||||||
|
this.presences.removePresence(resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearPresences() {
|
||||||
|
this.presences = new Presences();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int countPresences() {
|
||||||
|
return this.presences.size();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import eu.siacs.conversations.xml.Element;
|
||||||
|
|
||||||
public class Presences {
|
public class Presences {
|
||||||
|
|
||||||
public static final int CHAT = -1;
|
public static final int CHAT = -1;
|
||||||
|
@ -73,4 +75,24 @@ public class Presences {
|
||||||
}
|
}
|
||||||
return presences;
|
return presences;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int parseShow(Element show) {
|
||||||
|
if (show == null) {
|
||||||
|
return Presences.ONLINE;
|
||||||
|
} else if (show.getContent().equals("away")) {
|
||||||
|
return Presences.AWAY;
|
||||||
|
} else if (show.getContent().equals("xa")) {
|
||||||
|
return Presences.XA;
|
||||||
|
} else if (show.getContent().equals("chat")) {
|
||||||
|
return Presences.CHAT;
|
||||||
|
} else if (show.getContent().equals("dnd")) {
|
||||||
|
return Presences.DND;
|
||||||
|
} else {
|
||||||
|
return Presences.OFFLINE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size() {
|
||||||
|
return presences.size();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ package eu.siacs.conversations.services;
|
||||||
|
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -81,7 +83,7 @@ public class XmppConnectionService extends Service {
|
||||||
public OnConversationListChangedListener convChangedListener = null;
|
public OnConversationListChangedListener convChangedListener = null;
|
||||||
private OnAccountListChangedListener accountChangedListener = null;
|
private OnAccountListChangedListener accountChangedListener = null;
|
||||||
private OnTLSExceptionReceived tlsException = null;
|
private OnTLSExceptionReceived tlsException = null;
|
||||||
|
|
||||||
public void setOnTLSExceptionReceivedListener(
|
public void setOnTLSExceptionReceivedListener(
|
||||||
OnTLSExceptionReceived listener) {
|
OnTLSExceptionReceived listener) {
|
||||||
tlsException = listener;
|
tlsException = listener;
|
||||||
|
@ -152,18 +154,20 @@ public class XmppConnectionService extends Service {
|
||||||
if (packet.hasChild("x")) {
|
if (packet.hasChild("x")) {
|
||||||
Element x = packet.findChild("x");
|
Element x = packet.findChild("x");
|
||||||
if (x.hasChild("invite")) {
|
if (x.hasChild("invite")) {
|
||||||
findOrCreateConversation(account, packet.getFrom(), true);
|
findOrCreateConversation(account, packet.getFrom(),
|
||||||
|
true);
|
||||||
if (convChangedListener != null) {
|
if (convChangedListener != null) {
|
||||||
convChangedListener.onConversationListChanged();
|
convChangedListener.onConversationListChanged();
|
||||||
}
|
}
|
||||||
Log.d(LOGTAG,"invitation received to "+packet.getFrom());
|
Log.d(LOGTAG,
|
||||||
|
"invitation received to " + packet.getFrom());
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//Log.d(LOGTAG, "unparsed message " + packet.toString());
|
// Log.d(LOGTAG, "unparsed message " + packet.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((message == null)||(message.getBody() == null)) {
|
if ((message == null) || (message.getBody() == null)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (packet.hasChild("delay")) {
|
if (packet.hasChild("delay")) {
|
||||||
|
@ -221,8 +225,8 @@ public class XmppConnectionService extends Service {
|
||||||
if (packet.hasChild("x")
|
if (packet.hasChild("x")
|
||||||
&& (packet.findChild("x").getAttribute("xmlns")
|
&& (packet.findChild("x").getAttribute("xmlns")
|
||||||
.startsWith("http://jabber.org/protocol/muc"))) {
|
.startsWith("http://jabber.org/protocol/muc"))) {
|
||||||
Conversation muc = findMuc(packet.getAttribute("from").split(
|
Conversation muc = findMuc(
|
||||||
"/")[0],account);
|
packet.getAttribute("from").split("/")[0], account);
|
||||||
if (muc != null) {
|
if (muc != null) {
|
||||||
int error = muc.getMucOptions().getError();
|
int error = muc.getMucOptions().getError();
|
||||||
muc.getMucOptions().processPacket(packet);
|
muc.getMucOptions().processPacket(packet);
|
||||||
|
@ -234,73 +238,75 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String[] fromParts = packet.getAttribute("from").split("/");
|
String[] fromParts = packet.getAttribute("from").split("/");
|
||||||
Contact contact = findContact(account, fromParts[0]);
|
|
||||||
if (contact == null) {
|
|
||||||
// most likely self or roster not synced
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String type = packet.getAttribute("type");
|
String type = packet.getAttribute("type");
|
||||||
if (type == null) {
|
if (fromParts[0].equals(account.getJid())) {
|
||||||
if (fromParts.length == 2) {
|
if (fromParts.length==2) {
|
||||||
Element show = packet.findChild("show");
|
if (type == null) {
|
||||||
if (show == null) {
|
account.updatePresence(fromParts[1],Presences.parseShow(packet.findChild("show")));
|
||||||
contact.updatePresence(fromParts[1], Presences.ONLINE);
|
} else if (type.equals("unavailable")) {
|
||||||
} else if (show.getContent().equals("away")) {
|
account.removePresence(fromParts[1]);
|
||||||
contact.updatePresence(fromParts[1], Presences.AWAY);
|
|
||||||
} else if (show.getContent().equals("xa")) {
|
|
||||||
contact.updatePresence(fromParts[1], Presences.XA);
|
|
||||||
} else if (show.getContent().equals("chat")) {
|
|
||||||
contact.updatePresence(fromParts[1], Presences.CHAT);
|
|
||||||
} else if (show.getContent().equals("dnd")) {
|
|
||||||
contact.updatePresence(fromParts[1], Presences.DND);
|
|
||||||
}
|
}
|
||||||
PgpEngine pgp = getPgpEngine();
|
}
|
||||||
if (pgp != null) {
|
|
||||||
Element x = packet.findChild("x");
|
} else {
|
||||||
if ((x != null)
|
Contact contact = findContact(account, fromParts[0]);
|
||||||
&& (x.getAttribute("xmlns")
|
if (contact == null) {
|
||||||
.equals("jabber:x:signed"))) {
|
// most likely roster not synced
|
||||||
try {
|
return;
|
||||||
contact.setPgpKeyId(pgp.fetchKeyId(packet
|
}
|
||||||
.findChild("status").getContent(), x
|
if (type == null) {
|
||||||
.getContent()));
|
if (fromParts.length == 2) {
|
||||||
} catch (OpenPgpException e) {
|
contact.updatePresence(fromParts[1], Presences.parseShow(packet.findChild("show")));
|
||||||
Log.d(LOGTAG, "faulty pgp. just ignore");
|
PgpEngine pgp = getPgpEngine();
|
||||||
|
if (pgp != null) {
|
||||||
|
Element x = packet.findChild("x");
|
||||||
|
if ((x != null)
|
||||||
|
&& (x.getAttribute("xmlns")
|
||||||
|
.equals("jabber:x:signed"))) {
|
||||||
|
try {
|
||||||
|
contact.setPgpKeyId(pgp.fetchKeyId(
|
||||||
|
packet.findChild("status")
|
||||||
|
.getContent(), x
|
||||||
|
.getContent()));
|
||||||
|
} catch (OpenPgpException e) {
|
||||||
|
Log.d(LOGTAG, "faulty pgp. just ignore");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
databaseBackend.updateContact(contact);
|
||||||
|
} else {
|
||||||
|
// Log.d(LOGTAG,"presence without resource "+packet.toString());
|
||||||
}
|
}
|
||||||
databaseBackend.updateContact(contact);
|
} else if (type.equals("unavailable")) {
|
||||||
} else {
|
if (fromParts.length != 2) {
|
||||||
//Log.d(LOGTAG,"presence without resource "+packet.toString());
|
// Log.d(LOGTAG,"received presence with no resource "+packet.toString());
|
||||||
}
|
} else {
|
||||||
} else if (type.equals("unavailable")) {
|
contact.removePresence(fromParts[1]);
|
||||||
if (fromParts.length != 2) {
|
databaseBackend.updateContact(contact);
|
||||||
// Log.d(LOGTAG,"received presence with no resource "+packet.toString());
|
}
|
||||||
} else {
|
} else if (type.equals("subscribe")) {
|
||||||
contact.removePresence(fromParts[1]);
|
if (contact
|
||||||
databaseBackend.updateContact(contact);
|
.getSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT)) {
|
||||||
}
|
sendPresenceUpdatesTo(contact);
|
||||||
} else if (type.equals("subscribe")) {
|
contact.setSubscriptionOption(Contact.Subscription.FROM);
|
||||||
if (contact
|
contact.resetSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT);
|
||||||
.getSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT)) {
|
replaceContactInConversation(contact.getJid(),
|
||||||
sendPresenceUpdatesTo(contact);
|
contact);
|
||||||
contact.setSubscriptionOption(Contact.Subscription.FROM);
|
databaseBackend.updateContact(contact);
|
||||||
contact.resetSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT);
|
if ((contact
|
||||||
replaceContactInConversation(contact.getJid(), contact);
|
.getSubscriptionOption(Contact.Subscription.ASKING))
|
||||||
databaseBackend.updateContact(contact);
|
&& (!contact
|
||||||
if ((contact
|
.getSubscriptionOption(Contact.Subscription.TO))) {
|
||||||
.getSubscriptionOption(Contact.Subscription.ASKING))
|
requestPresenceUpdatesFrom(contact);
|
||||||
&& (!contact
|
}
|
||||||
.getSubscriptionOption(Contact.Subscription.TO))) {
|
} else {
|
||||||
requestPresenceUpdatesFrom(contact);
|
// TODO: ask user to handle it maybe
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: ask user to handle it maybe
|
// Log.d(LOGTAG, packet.toString());
|
||||||
}
|
}
|
||||||
} else {
|
replaceContactInConversation(contact.getJid(), contact);
|
||||||
//Log.d(LOGTAG, packet.toString());
|
|
||||||
}
|
}
|
||||||
replaceContactInConversation(contact.getJid(), contact);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -341,7 +347,8 @@ public class XmppConnectionService extends Service {
|
||||||
|
|
||||||
protected Conversation findMuc(String name, Account account) {
|
protected Conversation findMuc(String name, Account account) {
|
||||||
for (Conversation conversation : this.conversations) {
|
for (Conversation conversation : this.conversations) {
|
||||||
if (conversation.getContactJid().split("/")[0].equals(name)&&(conversation.getAccount() == account)) {
|
if (conversation.getContactJid().split("/")[0].equals(name)
|
||||||
|
&& (conversation.getAccount() == account)) {
|
||||||
return conversation;
|
return conversation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -401,7 +408,7 @@ public class XmppConnectionService extends Service {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
//Log.d(LOGTAG,"calling start service. caller was:"+intent.getAction());
|
// Log.d(LOGTAG,"calling start service. caller was:"+intent.getAction());
|
||||||
ConnectivityManager cm = (ConnectivityManager) getApplicationContext()
|
ConnectivityManager cm = (ConnectivityManager) getApplicationContext()
|
||||||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
|
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
|
||||||
|
@ -412,13 +419,13 @@ public class XmppConnectionService extends Service {
|
||||||
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
|
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
|
||||||
if (!isConnected) {
|
if (!isConnected) {
|
||||||
account.setStatus(Account.STATUS_NO_INTERNET);
|
account.setStatus(Account.STATUS_NO_INTERNET);
|
||||||
if (statusListener!=null) {
|
if (statusListener != null) {
|
||||||
statusListener.onStatusChanged(account);
|
statusListener.onStatusChanged(account);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (account.getStatus() == Account.STATUS_NO_INTERNET) {
|
if (account.getStatus() == Account.STATUS_NO_INTERNET) {
|
||||||
account.setStatus(Account.STATUS_OFFLINE);
|
account.setStatus(Account.STATUS_OFFLINE);
|
||||||
if (statusListener!=null) {
|
if (statusListener != null) {
|
||||||
statusListener.onStatusChanged(account);
|
statusListener.onStatusChanged(account);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -429,10 +436,11 @@ public class XmppConnectionService extends Service {
|
||||||
long lastSent = account.getXmppConnection().lastPingSent;
|
long lastSent = account.getXmppConnection().lastPingSent;
|
||||||
if (lastSent - lastReceived >= PING_TIMEOUT * 1000) {
|
if (lastSent - lastReceived >= PING_TIMEOUT * 1000) {
|
||||||
Log.d(LOGTAG, account.getJid() + ": ping timeout");
|
Log.d(LOGTAG, account.getJid() + ": ping timeout");
|
||||||
this.reconnectAccount(account,true);
|
this.reconnectAccount(account, true);
|
||||||
} else if (SystemClock.elapsedRealtime() - lastReceived >= PING_MIN_INTERVAL * 1000) {
|
} else if (SystemClock.elapsedRealtime() - lastReceived >= PING_MIN_INTERVAL * 1000) {
|
||||||
account.getXmppConnection().sendPing();
|
account.getXmppConnection().sendPing();
|
||||||
account.getXmppConnection().lastPingSent = SystemClock.elapsedRealtime();
|
account.getXmppConnection().lastPingSent = SystemClock
|
||||||
|
.elapsedRealtime();
|
||||||
this.scheduleWakeupCall(2, false);
|
this.scheduleWakeupCall(2, false);
|
||||||
}
|
}
|
||||||
} else if (account.getStatus() == Account.STATUS_OFFLINE) {
|
} else if (account.getStatus() == Account.STATUS_OFFLINE) {
|
||||||
|
@ -440,17 +448,27 @@ public class XmppConnectionService extends Service {
|
||||||
account.setXmppConnection(this
|
account.setXmppConnection(this
|
||||||
.createConnection(account));
|
.createConnection(account));
|
||||||
}
|
}
|
||||||
account.getXmppConnection().lastPingSent = SystemClock.elapsedRealtime();
|
account.getXmppConnection().lastPingSent = SystemClock
|
||||||
|
.elapsedRealtime();
|
||||||
new Thread(account.getXmppConnection()).start();
|
new Thread(account.getXmppConnection()).start();
|
||||||
} else if ((account.getStatus() == Account.STATUS_CONNECTING)&&((SystemClock.elapsedRealtime() - account.getXmppConnection().lastConnect) / 1000 >= CONNECT_TIMEOUT)) {
|
} else if ((account.getStatus() == Account.STATUS_CONNECTING)
|
||||||
Log.d(LOGTAG,account.getJid()+": time out during connect reconnecting");
|
&& ((SystemClock.elapsedRealtime() - account
|
||||||
reconnectAccount(account,true);
|
.getXmppConnection().lastConnect) / 1000 >= CONNECT_TIMEOUT)) {
|
||||||
|
Log.d(LOGTAG, account.getJid()
|
||||||
|
+ ": time out during connect reconnecting");
|
||||||
|
reconnectAccount(account, true);
|
||||||
} else {
|
} else {
|
||||||
Log.d(LOGTAG,"seconds since last connect:"+((SystemClock.elapsedRealtime() - account.getXmppConnection().lastConnect) / 1000));
|
Log.d(LOGTAG,
|
||||||
Log.d(LOGTAG,account.getJid()+": status="+account.getStatus());
|
"seconds since last connect:"
|
||||||
// TODO notify user of ssl cert problem or auth problem or what ever
|
+ ((SystemClock.elapsedRealtime() - account
|
||||||
|
.getXmppConnection().lastConnect) / 1000));
|
||||||
|
Log.d(LOGTAG,
|
||||||
|
account.getJid() + ": status="
|
||||||
|
+ account.getStatus());
|
||||||
|
// TODO notify user of ssl cert problem or auth problem
|
||||||
|
// or what ever
|
||||||
}
|
}
|
||||||
//in any case. reschedule wakup call
|
// in any case. reschedule wakup call
|
||||||
this.scheduleWakeupCall(PING_MAX_INTERVAL, true);
|
this.scheduleWakeupCall(PING_MAX_INTERVAL, true);
|
||||||
}
|
}
|
||||||
if (accountChangedListener != null) {
|
if (accountChangedListener != null) {
|
||||||
|
@ -490,27 +508,28 @@ public class XmppConnectionService extends Service {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
AlarmManager alarmManager = (AlarmManager) context
|
AlarmManager alarmManager = (AlarmManager) context
|
||||||
.getSystemService(Context.ALARM_SERVICE);
|
.getSystemService(Context.ALARM_SERVICE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (ping) {
|
if (ping) {
|
||||||
if (this.pingIntent==null) {
|
if (this.pingIntent == null) {
|
||||||
this.pingIntent = new Intent(context, EventReceiver.class);
|
this.pingIntent = new Intent(context, EventReceiver.class);
|
||||||
this.pingIntent.setAction("ping");
|
this.pingIntent.setAction("ping");
|
||||||
this.pingIntent.putExtra("time", timeToWake);
|
this.pingIntent.putExtra("time", timeToWake);
|
||||||
this.pendingPingIntent = PendingIntent.getBroadcast(context, 0,
|
this.pendingPingIntent = PendingIntent.getBroadcast(context, 0,
|
||||||
this.pingIntent, 0);
|
this.pingIntent, 0);
|
||||||
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,timeToWake, pendingPingIntent);
|
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
||||||
//Log.d(LOGTAG,"schedule ping in "+seconds+" seconds");
|
timeToWake, pendingPingIntent);
|
||||||
|
// Log.d(LOGTAG,"schedule ping in "+seconds+" seconds");
|
||||||
} else {
|
} else {
|
||||||
long scheduledTime = this.pingIntent.getLongExtra("time", 0);
|
long scheduledTime = this.pingIntent.getLongExtra("time", 0);
|
||||||
if (scheduledTime<SystemClock.elapsedRealtime() || (scheduledTime > timeToWake)) {
|
if (scheduledTime < SystemClock.elapsedRealtime()
|
||||||
|
|| (scheduledTime > timeToWake)) {
|
||||||
this.pingIntent.putExtra("time", timeToWake);
|
this.pingIntent.putExtra("time", timeToWake);
|
||||||
alarmManager.cancel(this.pendingPingIntent);
|
alarmManager.cancel(this.pendingPingIntent);
|
||||||
this.pendingPingIntent = PendingIntent.getBroadcast(context, 0,
|
this.pendingPingIntent = PendingIntent.getBroadcast(
|
||||||
this.pingIntent, 0);
|
context, 0, this.pingIntent, 0);
|
||||||
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,timeToWake, pendingPingIntent);
|
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
||||||
//Log.d(LOGTAG,"reschedule old ping to ping in "+seconds+" seconds");
|
timeToWake, pendingPingIntent);
|
||||||
|
// Log.d(LOGTAG,"reschedule old ping to ping in "+seconds+" seconds");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -518,7 +537,8 @@ public class XmppConnectionService extends Service {
|
||||||
intent.setAction("ping_check");
|
intent.setAction("ping_check");
|
||||||
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0,
|
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0,
|
||||||
intent, 0);
|
intent, 0);
|
||||||
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,timeToWake, alarmIntent);
|
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeToWake,
|
||||||
|
alarmIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -545,10 +565,11 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
connection.setOnBindListener(new OnBindListener() {
|
connection.setOnBindListener(new OnBindListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBind(Account account) {
|
public void onBind(Account account) {
|
||||||
databaseBackend.clearPresences(account);
|
databaseBackend.clearPresences(account);
|
||||||
|
account.clearPresences(); // self presences
|
||||||
if (account.getXmppConnection().hasFeatureRosterManagment()) {
|
if (account.getXmppConnection().hasFeatureRosterManagment()) {
|
||||||
updateRoster(account, null);
|
updateRoster(account, null);
|
||||||
}
|
}
|
||||||
|
@ -703,7 +724,7 @@ public class XmppConnectionService extends Service {
|
||||||
listener.onRosterFetched(contacts);
|
listener.onRosterFetched(contacts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Contact> getRoster(Account account) {
|
public List<Contact> getRoster(Account account) {
|
||||||
List<Contact> contacts = databaseBackend.getContactsByAccount(account);
|
List<Contact> contacts = databaseBackend.getContactsByAccount(account);
|
||||||
for (int i = 0; i < contacts.size(); ++i) {
|
for (int i = 0; i < contacts.size(); ++i) {
|
||||||
|
@ -834,6 +855,13 @@ public class XmppConnectionService extends Service {
|
||||||
conv.setMessages(databaseBackend.getMessages(conv, 50));
|
conv.setMessages(databaseBackend.getMessages(conv, 50));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Collections.sort(this.conversations, new Comparator<Conversation>() {
|
||||||
|
@Override
|
||||||
|
public int compare(Conversation lhs, Conversation rhs) {
|
||||||
|
return (int) (rhs.getLatestMessage().getTimeSent() - lhs
|
||||||
|
.getLatestMessage().getTimeSent());
|
||||||
|
}
|
||||||
|
});
|
||||||
return this.conversations;
|
return this.conversations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -870,7 +898,8 @@ public class XmppConnectionService extends Service {
|
||||||
} else {
|
} else {
|
||||||
conversation.setMode(Conversation.MODE_SINGLE);
|
conversation.setMode(Conversation.MODE_SINGLE);
|
||||||
}
|
}
|
||||||
conversation.setMessages(databaseBackend.getMessages(conversation, 50));
|
conversation.setMessages(databaseBackend.getMessages(conversation,
|
||||||
|
50));
|
||||||
this.databaseBackend.updateConversation(conversation);
|
this.databaseBackend.updateConversation(conversation);
|
||||||
conversation.setContact(findContact(account,
|
conversation.setContact(findContact(account,
|
||||||
conversation.getContactJid()));
|
conversation.getContactJid()));
|
||||||
|
@ -943,7 +972,7 @@ public class XmppConnectionService extends Service {
|
||||||
|
|
||||||
public void updateAccount(Account account) {
|
public void updateAccount(Account account) {
|
||||||
databaseBackend.updateAccount(account);
|
databaseBackend.updateAccount(account);
|
||||||
reconnectAccount(account,false);
|
reconnectAccount(account, false);
|
||||||
if (accountChangedListener != null)
|
if (accountChangedListener != null)
|
||||||
accountChangedListener.onAccountListChangedListener();
|
accountChangedListener.onAccountListChangedListener();
|
||||||
}
|
}
|
||||||
|
@ -1065,7 +1094,8 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect(Account account, boolean force) {
|
public void disconnect(Account account, boolean force) {
|
||||||
if ((account.getStatus() == Account.STATUS_ONLINE)||(account.getStatus() == Account.STATUS_DISABLED)) {
|
if ((account.getStatus() == Account.STATUS_ONLINE)
|
||||||
|
|| (account.getStatus() == Account.STATUS_DISABLED)) {
|
||||||
if (!force) {
|
if (!force) {
|
||||||
List<Conversation> conversations = getConversations();
|
List<Conversation> conversations = getConversations();
|
||||||
for (int i = 0; i < conversations.size(); i++) {
|
for (int i = 0; i < conversations.size(); i++) {
|
||||||
|
@ -1203,8 +1233,8 @@ public class XmppConnectionService extends Service {
|
||||||
this.tlsException = null;
|
this.tlsException = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO dont let thread sleep but schedule wake up
|
// TODO dont let thread sleep but schedule wake up
|
||||||
public void reconnectAccount(final Account account,final boolean force) {
|
public void reconnectAccount(final Account account, final boolean force) {
|
||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1218,14 +1248,14 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
Thread thread = new Thread(account.getXmppConnection());
|
Thread thread = new Thread(account.getXmppConnection());
|
||||||
thread.start();
|
thread.start();
|
||||||
scheduleWakeupCall((int) (CONNECT_TIMEOUT * 1.2),false);
|
scheduleWakeupCall((int) (CONNECT_TIMEOUT * 1.2), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateConversationInGui() {
|
public void updateConversationInGui() {
|
||||||
if (convChangedListener!=null) {
|
if (convChangedListener != null) {
|
||||||
convChangedListener.onConversationListChanged();
|
convChangedListener.onConversationListChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1247,7 +1277,7 @@ public class XmppConnectionService extends Service {
|
||||||
|
|
||||||
public void inviteToConference(Conversation conversation,
|
public void inviteToConference(Conversation conversation,
|
||||||
List<Contact> contacts) {
|
List<Contact> contacts) {
|
||||||
for(Contact contact : contacts) {
|
for (Contact contact : contacts) {
|
||||||
MessagePacket packet = new MessagePacket();
|
MessagePacket packet = new MessagePacket();
|
||||||
packet.setTo(conversation.getContactJid().split("/")[0]);
|
packet.setTo(conversation.getContactJid().split("/")[0]);
|
||||||
packet.setFrom(conversation.getAccount().getFullJid());
|
packet.setFrom(conversation.getAccount().getFullJid());
|
||||||
|
@ -1257,9 +1287,10 @@ public class XmppConnectionService extends Service {
|
||||||
invite.setAttribute("to", contact.getJid());
|
invite.setAttribute("to", contact.getJid());
|
||||||
x.addChild(invite);
|
x.addChild(invite);
|
||||||
packet.addChild(x);
|
packet.addChild(x);
|
||||||
Log.d(LOGTAG,packet.toString());
|
Log.d(LOGTAG, packet.toString());
|
||||||
conversation.getAccount().getXmppConnection().sendMessagePacket(packet);
|
conversation.getAccount().getXmppConnection()
|
||||||
|
.sendMessagePacket(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,8 +1,6 @@
|
||||||
package eu.siacs.conversations.ui;
|
package eu.siacs.conversations.ui;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
|
@ -62,9 +60,6 @@ public class ConversationActivity extends XmppActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onConversationListChanged() {
|
public void onConversationListChanged() {
|
||||||
conversationList.clear();
|
|
||||||
conversationList.addAll(xmppConnectionService
|
|
||||||
.getConversations());
|
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -120,18 +115,6 @@ public class ConversationActivity extends XmppActivity {
|
||||||
return paneShouldBeOpen;
|
return paneShouldBeOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateConversationList() {
|
|
||||||
if (conversationList.size() >= 1) {
|
|
||||||
Collections.sort(this.conversationList, new Comparator<Conversation>() {
|
|
||||||
@Override
|
|
||||||
public int compare(Conversation lhs, Conversation rhs) {
|
|
||||||
return (int) (rhs.getLatestMessage().getTimeSent() - lhs.getLatestMessage().getTimeSent());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.listView.invalidateViews();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
@ -229,7 +212,7 @@ public class ConversationActivity extends XmppActivity {
|
||||||
if (!getSelectedConversation().isRead()) {
|
if (!getSelectedConversation().isRead()) {
|
||||||
getSelectedConversation().markRead();
|
getSelectedConversation().markRead();
|
||||||
UIHelper.updateNotification(getApplicationContext(), getConversationList(), null, false);
|
UIHelper.updateNotification(getApplicationContext(), getConversationList(), null, false);
|
||||||
updateConversationList();
|
listView.invalidateViews();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -434,10 +417,7 @@ public class ConversationActivity extends XmppActivity {
|
||||||
|
|
||||||
this.registerListener();
|
this.registerListener();
|
||||||
if (conversationList.size()==0) {
|
if (conversationList.size()==0) {
|
||||||
conversationList.addAll(xmppConnectionService
|
updateConversationList();
|
||||||
.getConversations());
|
|
||||||
|
|
||||||
this.updateConversationList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getIntent().getAction()!=null)&&(getIntent().getAction().equals(Intent.ACTION_VIEW) && (!handledViewIntent))) {
|
if ((getIntent().getAction()!=null)&&(getIntent().getAction().equals(Intent.ACTION_VIEW) && (!handledViewIntent))) {
|
||||||
|
@ -495,4 +475,11 @@ public class ConversationActivity extends XmppActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateConversationList() {
|
||||||
|
conversationList.clear();
|
||||||
|
conversationList.addAll(xmppConnectionService
|
||||||
|
.getConversations());
|
||||||
|
listView.invalidateViews();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,6 +316,8 @@ public class ManageAccountActivity extends XmppActivity {
|
||||||
TextView carbon = (TextView) view.findViewById(R.id.carbon);
|
TextView carbon = (TextView) view.findViewById(R.id.carbon);
|
||||||
TextView stream = (TextView) view.findViewById(R.id.stream);
|
TextView stream = (TextView) view.findViewById(R.id.stream);
|
||||||
TextView roster = (TextView) view.findViewById(R.id.roster);
|
TextView roster = (TextView) view.findViewById(R.id.roster);
|
||||||
|
TextView presences = (TextView) view.findViewById(R.id.number_presences);
|
||||||
|
presences.setText(selectedAccountForActionMode.countPresences()+"");
|
||||||
pcks_received.setText(""+xmpp.getReceivedStanzas());
|
pcks_received.setText(""+xmpp.getReceivedStanzas());
|
||||||
pcks_sent.setText(""+xmpp.getSentStanzas());
|
pcks_sent.setText(""+xmpp.getSentStanzas());
|
||||||
if (connectionAgeHours >= 2) {
|
if (connectionAgeHours >= 2) {
|
||||||
|
|
|
@ -31,18 +31,26 @@ public class MessageParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Message parseOtrChat(MessagePacket packet, Account account, XmppConnectionService service) {
|
public static Message parseOtrChat(MessagePacket packet, Account account, XmppConnectionService service) {
|
||||||
|
boolean properlyAddressed = (packet.getTo().split("/").length == 2) || (account.countPresences() == 1);
|
||||||
String[] fromParts = packet.getFrom().split("/");
|
String[] fromParts = packet.getFrom().split("/");
|
||||||
Conversation conversation = service.findOrCreateConversation(account, fromParts[0],false);
|
Conversation conversation = service.findOrCreateConversation(account, fromParts[0],false);
|
||||||
String body = packet.getBody();
|
String body = packet.getBody();
|
||||||
if (!conversation.hasValidOtrSession()) {
|
if (!conversation.hasValidOtrSession()) {
|
||||||
conversation.startOtrSession(service.getApplicationContext(), fromParts[1]);
|
if (properlyAddressed) {
|
||||||
|
conversation.startOtrSession(service.getApplicationContext(), fromParts[1]);
|
||||||
|
} else {
|
||||||
|
Log.d("xmppService",account.getJid()+": ignoring otr session with "+fromParts[0]);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
String foreignPresence = conversation.getOtrSession().getSessionID().getUserID();
|
String foreignPresence = conversation.getOtrSession().getSessionID().getUserID();
|
||||||
if (!foreignPresence.equals(fromParts[1])) {
|
if (!foreignPresence.equals(fromParts[1])) {
|
||||||
Log.d(LOGTAG,"new otr during existing otr session requested. ending old one");
|
|
||||||
conversation.resetOtrSession();
|
conversation.resetOtrSession();
|
||||||
Log.d("xmppService","starting new one with "+fromParts[1]);
|
if (properlyAddressed) {
|
||||||
conversation.startOtrSession(service.getApplicationContext(), fromParts[1]);
|
conversation.startOtrSession(service.getApplicationContext(), fromParts[1]);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -554,7 +554,7 @@ public class XmppConnection implements Runnable {
|
||||||
if (bindListener !=null) {
|
if (bindListener !=null) {
|
||||||
bindListener.onBind(account);
|
bindListener.onBind(account);
|
||||||
}
|
}
|
||||||
account.setStatus(Account.STATUS_ONLINE);
|
changeStatus(Account.STATUS_ONLINE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue