finished registration

This commit is contained in:
Daniel Gultsch 2014-03-13 17:29:22 +01:00
parent dab3c99b56
commit 678dbd37c6
7 changed files with 202 additions and 15 deletions

View file

@ -5,12 +5,22 @@
android:padding="8dp" > android:padding="8dp" >
<TextView <TextView
android:id="@+id/stats_header"
style="@style/sectionHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingBottom="8dp"
android:text="Statistics" />
<TextView
android:layout_below="@+id/stats_header"
android:id="@+id/textView1" android:id="@+id/textView1"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Connection age" android:text="Connection age"
android:textSize="18sp"/> android:textSize="18sp"/>
<TextView <TextView
android:id="@+id/connection" android:id="@+id/connection"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -28,7 +38,6 @@
android:layout_below="@+id/textView1" android:layout_below="@+id/textView1"
android:text="Session age" android:text="Session age"
android:textSize="18sp"/> android:textSize="18sp"/>
<TextView <TextView
android:id="@+id/session" android:id="@+id/session"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -46,7 +55,6 @@
android:layout_below="@+id/textView2" android:layout_below="@+id/textView2"
android:text="Packets sent" android:text="Packets sent"
android:textSize="18sp"/> android:textSize="18sp"/>
<TextView <TextView
android:id="@+id/pcks_sent" android:id="@+id/pcks_sent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -56,7 +64,6 @@
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:textSize="18sp"/> android:textSize="18sp"/>
<TextView <TextView
android:id="@+id/textView4" android:id="@+id/textView4"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -64,9 +71,6 @@
android:layout_below="@+id/textView3" android:layout_below="@+id/textView3"
android:text="Packets received" android:text="Packets received"
android:textSize="18sp"/> android:textSize="18sp"/>
<TextView <TextView
android:id="@+id/pcks_received" android:id="@+id/pcks_received"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -76,4 +80,62 @@
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:textSize="18sp"/> android:textSize="18sp"/>
<TextView
android:id="@+id/features_header"
android:layout_below="@+id/textView4"
style="@style/sectionHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="Server Features" />
<TextView
android:layout_below="@+id/features_header"
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Roster Versioning"
android:textSize="18sp"/>
<TextView
android:id="@+id/roster"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView5"
android:layout_alignBottom="@+id/textView5"
android:layout_alignParentRight="true"
android:textSize="18sp"/>
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView5"
android:text="Carbon Messages"
android:textSize="18sp"/>
<TextView
android:id="@+id/carbon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView6"
android:layout_alignBottom="@+id/textView6"
android:layout_alignParentRight="true"
android:textSize="18sp"/>
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView6"
android:text="Stream Managment"
android:textSize="18sp"/>
<TextView
android:id="@+id/stream"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView7"
android:layout_alignBottom="@+id/textView7"
android:layout_alignParentRight="true"
android:textSize="18sp"/>
</RelativeLayout> </RelativeLayout>

View file

@ -58,7 +58,7 @@ public class PgpEngine {
public long fetchKeyId(String status, String signature) public long fetchKeyId(String status, String signature)
throws OpenPgpException { throws OpenPgpException {
if (signature==null) { if ((signature==null)||(api==null)) {
return 0; return 0;
} }
if (status==null) { if (status==null) {

View file

@ -42,6 +42,10 @@ public class Account extends AbstractEntity{
public static final int STATUS_SERVER_REQUIRES_TLS = 6; public static final int STATUS_SERVER_REQUIRES_TLS = 6;
public static final int STATUS_REGISTRATION_FAILED = 7;
public static final int STATUS_REGISTRATION_CONFLICT = 8;
public static final int STATUS_REGISTRATION_SUCCESSFULL = 9;
protected String username; protected String username;
protected String server; protected String server;
protected String password; protected String password;

View file

@ -208,6 +208,9 @@ public class XmppConnectionService extends Service {
scheduleWakeupCall(timeToReconnect, false); scheduleWakeupCall(timeToReconnect, false);
} }
} else if (account.getStatus() == Account.STATUS_REGISTRATION_SUCCESSFULL) {
databaseBackend.updateAccount(account);
reconnectAccount(account, true);
} }
} }
}; };

View file

@ -163,7 +163,20 @@ public class ManageAccountActivity extends XmppActivity {
statusView.setText("untrusted cerficate"); statusView.setText("untrusted cerficate");
statusView.setTextColor(0xFFe92727); statusView.setTextColor(0xFFe92727);
break; break;
case Account.STATUS_REGISTRATION_FAILED:
statusView.setText("registration failed");
statusView.setTextColor(0xFFe92727);
break;
case Account.STATUS_REGISTRATION_CONFLICT:
statusView.setText("username already in use");
statusView.setTextColor(0xFFe92727);
break;
case Account.STATUS_REGISTRATION_SUCCESSFULL:
statusView.setText("registration completed");
statusView.setTextColor(0xFF83b600);
break;
default: default:
statusView.setText("");
break; break;
} }
@ -179,7 +192,7 @@ public class ManageAccountActivity extends XmppActivity {
int position, long arg3) { int position, long arg3) {
if (!isActionMode) { if (!isActionMode) {
Account account = accountList.get(position); Account account = accountList.get(position);
if ((account.getStatus() != Account.STATUS_ONLINE)&&(account.getStatus() != Account.STATUS_CONNECTING)&&(!account.isOptionSet(Account.OPTION_DISABLED))) { if ((account.getStatus() == Account.STATUS_OFFLINE)||(account.getStatus() == Account.STATUS_TLS_ERROR)) {
activity.xmppConnectionService.reconnectAccount(accountList.get(position),true); activity.xmppConnectionService.reconnectAccount(accountList.get(position),true);
} else if (account.getStatus() == Account.STATUS_ONLINE) { } else if (account.getStatus() == Account.STATUS_ONLINE) {
activity.startActivity(new Intent(activity.getApplicationContext(),NewConversationActivity.class)); activity.startActivity(new Intent(activity.getApplicationContext(),NewConversationActivity.class));
@ -281,10 +294,29 @@ public class ManageAccountActivity extends XmppActivity {
TextView session = (TextView) view.findViewById(R.id.session); TextView session = (TextView) view.findViewById(R.id.session);
TextView pcks_sent = (TextView) view.findViewById(R.id.pcks_sent); TextView pcks_sent = (TextView) view.findViewById(R.id.pcks_sent);
TextView pcks_received = (TextView) view.findViewById(R.id.pcks_received); TextView pcks_received = (TextView) view.findViewById(R.id.pcks_received);
TextView carbon = (TextView) view.findViewById(R.id.carbon);
TextView stream = (TextView) view.findViewById(R.id.stream);
TextView roster = (TextView) view.findViewById(R.id.roster);
pcks_received.setText(""+xmpp.getReceivedStanzas()); pcks_received.setText(""+xmpp.getReceivedStanzas());
pcks_sent.setText(""+xmpp.getSentStanzas()); pcks_sent.setText(""+xmpp.getSentStanzas());
connection.setText(connectionAge+" mins"); connection.setText(connectionAge+" mins");
session.setText(sessionAge+" mins"); if (xmpp.hasFeatureStreamManagment()) {
session.setText(sessionAge+" mins");
stream.setText("Yes");
} else {
stream.setText("No");
session.setText(connectionAge+" mins");
}
if (xmpp.hasFeaturesCarbon()) {
carbon.setText("Yes");
} else {
carbon.setText("No");
}
if (xmpp.hasFeatureRosterManagment()) {
roster.setText("Yes");
} else {
roster.setText("No");
}
builder.setView(view); builder.setView(view);
} else { } else {
builder.setMessage("Account is offline"); builder.setMessage("Account is offline");
@ -356,7 +388,9 @@ public class ManageAccountActivity extends XmppActivity {
@Override @Override
public void onAccountEdited(Account account) { public void onAccountEdited(Account account) {
xmppConnectionService.updateAccount(account); xmppConnectionService.updateAccount(account);
actionMode.finish(); if (actionMode != null) {
actionMode.finish();
}
} }
}); });
dialog.show(getFragmentManager(), "edit_account"); dialog.show(getFragmentManager(), "edit_account");

View file

@ -98,6 +98,9 @@ public class XmppConnection implements Runnable {
protected void changeStatus(int nextStatus) { protected void changeStatus(int nextStatus) {
if (account.getStatus() != nextStatus) { if (account.getStatus() != nextStatus) {
if ((nextStatus == Account.STATUS_OFFLINE)&&(account.getStatus() != Account.STATUS_CONNECTING)&&(account.getStatus() != Account.STATUS_ONLINE)) {
return;
}
account.setStatus(nextStatus); account.setStatus(nextStatus);
if (statusListener != null) { if (statusListener != null) {
statusListener.onStatusChanged(account); statusListener.onStatusChanged(account);
@ -186,9 +189,6 @@ public class XmppConnection implements Runnable {
&& (!account.isOptionSet(Account.OPTION_USETLS))) { && (!account.isOptionSet(Account.OPTION_USETLS))) {
changeStatus(Account.STATUS_SERVER_REQUIRES_TLS); changeStatus(Account.STATUS_SERVER_REQUIRES_TLS);
} }
if (account.isOptionSet(Account.OPTION_REGISTER)) {
Log.d(LOGTAG,account.getJid()+": trying to register");
}
} else if (nextTag.isStart("proceed")) { } else if (nextTag.isStart("proceed")) {
switchOverToTls(nextTag); switchOverToTls(nextTag);
} else if (nextTag.isStart("success")) { } else if (nextTag.isStart("success")) {
@ -440,6 +440,43 @@ public class XmppConnection implements Runnable {
if (this.streamFeatures.hasChild("starttls") if (this.streamFeatures.hasChild("starttls")
&& account.isOptionSet(Account.OPTION_USETLS)) { && account.isOptionSet(Account.OPTION_USETLS)) {
sendStartTLS(); sendStartTLS();
} else if (this.streamFeatures.hasChild("register")&&(account.isOptionSet(Account.OPTION_REGISTER))) {
IqPacket register = new IqPacket(IqPacket.TYPE_GET);
register.query("jabber:iq:register");
register.setTo(account.getServer());
sendIqPacket(register, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
Element instructions = packet.query().findChild("instructions");
if (packet.query().hasChild("username")&&(packet.query().hasChild("password"))) {
IqPacket register = new IqPacket(IqPacket.TYPE_SET);
Element username = new Element("username").setContent(account.getUsername());
Element password = new Element("password").setContent(account.getPassword());
register.query("jabber:iq:register").addChild(username).addChild(password);
sendIqPacket(register, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
if (packet.getType()==IqPacket.TYPE_RESULT) {
account.setOption(Account.OPTION_REGISTER, false);
changeStatus(Account.STATUS_REGISTRATION_SUCCESSFULL);
Log.d(LOGTAG,"successfull");
} else if (packet.hasChild("error")&&(packet.findChild("error").hasChild("conflict"))){
changeStatus(Account.STATUS_REGISTRATION_CONFLICT);
} else {
changeStatus(Account.STATUS_REGISTRATION_FAILED);
Log.d(LOGTAG,packet.toString());
}
disconnect(true);
}
});
Log.d(LOGTAG,"registering: "+register.toString());
} else {
Log.d(LOGTAG,account.getJid()+": could not register. instructions are"+instructions.getContent());
}
}
});
} else if (this.streamFeatures.hasChild("mechanisms") } else if (this.streamFeatures.hasChild("mechanisms")
&& shouldAuthenticate) { && shouldAuthenticate) {
sendSaslAuth(); sendSaslAuth();
@ -651,6 +688,7 @@ public class XmppConnection implements Runnable {
} }
public void disconnect(boolean force) { public void disconnect(boolean force) {
changeStatus(Account.STATUS_OFFLINE);
Log.d(LOGTAG,"disconnecting"); Log.d(LOGTAG,"disconnecting");
try { try {
if (force) { if (force) {
@ -678,6 +716,18 @@ public class XmppConnection implements Runnable {
} }
} }
public boolean hasFeatureStreamManagment() {
if (this.streamFeatures==null) {
return false;
} else {
return this.streamFeatures.hasChild("has");
}
}
public boolean hasFeaturesCarbon() {
return discoFeatures.contains("urn:xmpp:carbons:2");
}
public void r() { public void r() {
this.tagWriter.writeStanzaAsync(new RequestPacket()); this.tagWriter.writeStanzaAsync(new RequestPacket());
} }

View file

@ -1,8 +1,12 @@
package eu.siacs.conversations.xmpp.stanzas; package eu.siacs.conversations.xmpp.stanzas;
import android.graphics.YuvImage;
import eu.siacs.conversations.xml.Element;
public class IqPacket extends AbstractStanza { public class IqPacket extends AbstractStanza {
public static final int TYPE_ERROR = -1;
public static final int TYPE_SET = 0; public static final int TYPE_SET = 0;
public static final int TYPE_RESULT = 1; public static final int TYPE_RESULT = 1;
public static final int TYPE_GET = 2; public static final int TYPE_GET = 2;
@ -32,4 +36,34 @@ public class IqPacket extends AbstractStanza {
super("iq"); super("iq");
} }
public Element query() {
Element query = findChild("query");
if (query==null) {
query = new Element("query");
addChild(query);
}
return query;
}
public Element query(String xmlns) {
Element query = query();
query.setAttribute("xmlns", xmlns);
return query();
}
public int getType() {
String type = getAttribute("type");
if ("error".equals(type)) {
return TYPE_ERROR;
} else if ("result".equals(type)) {
return TYPE_RESULT;
} else if ("set".equals(type)) {
return TYPE_SET;
} else if ("get".equals(type)) {
return TYPE_GET;
} else {
return 1000;
}
}
} }