Merge https://github.com/siacs/Conversations into development

Beriain created

Change summary

res/values-sw600dp/dimens.xml                                  |  8 
res/values-sw720dp-land/dimens.xml                             |  9 -
res/values-v11/styles.xml                                      | 11 -
res/values-v14/styles.xml                                      | 12 -
res/values/dimens.xml                                          |  7 
res/values/strings.xml                                         |  2 
res/values/styles.xml                                          | 36 +---
src/eu/siacs/conversations/services/XmppConnectionService.java | 27 ++
src/eu/siacs/conversations/ui/XmppActivity.java                |  9 
src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java   | 21 +
src/eu/siacs/conversations/xmpp/stanzas/IqPacket.java          |  3 
11 files changed, 55 insertions(+), 90 deletions(-)

Detailed changes

res/values-sw600dp/dimens.xml πŸ”—

@@ -1,8 +0,0 @@
-<resources>
-
-    <!--
-         Customize dimensions originally defined in res/values/dimens.xml (such as
-         screen margins) for sw600dp devices (e.g. 7" tablets) here.
-    -->
-
-</resources>

res/values-sw720dp-land/dimens.xml πŸ”—

@@ -1,9 +0,0 @@
-<resources>
-
-    <!--
-         Customize dimensions originally defined in res/values/dimens.xml (such as
-         screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
-    -->
-    <dimen name="activity_horizontal_margin">128dp</dimen>
-
-</resources>

res/values-v11/styles.xml πŸ”—

@@ -1,11 +0,0 @@
-<resources>
-
-    <!--
-        Base application theme for API 11+. This theme completely replaces
-        AppBaseTheme from res/values/styles.xml on API 11+ devices.
-    -->
-    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
-        <!-- API 11 theme customizations can go here. -->
-    </style>
-
-</resources>

res/values-v14/styles.xml πŸ”—

@@ -1,12 +0,0 @@
-<resources>
-
-    <!--
-        Base application theme for API 14+. This theme completely replaces
-        AppBaseTheme from BOTH res/values/styles.xml and
-        res/values-v11/styles.xml on API 14+ devices.
-    -->
-    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-        <!-- API 14 theme customizations can go here. -->
-    </style>
-
-</resources>

res/values/dimens.xml πŸ”—

@@ -1,7 +0,0 @@
-<resources>
-
-    <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
-
-</resources>

res/values/strings.xml πŸ”—

@@ -80,7 +80,7 @@
     <string name="send_unencrypted">Send unencrypted</string>
     <string name="decryption_failed">Decrpytion failed. Maybe you don’t have the proper private key.</string>
     <string name="openkeychain_required">OpenKeychain</string>
-    <string name="openkeychain_required_long">Conversations utilizes a third party called <b>OpenKeychain</b> to encrypt and decrypt messages and to mange your public keys.\n\nOpenKeychain is licensed under GPLv3 and available on F-Droid and Google Play.\n\nTo use openPGP please install the app and then restart Conversations.</string>
+    <string name="openkeychain_required_long">Conversations utilizes a third party app called <b>OpenKeychain</b> to encrypt and decrypt messages and to mange your public keys.\n\nOpenKeychain is licensed under GPLv3 and available on F-Droid and Google Play.\n\n<small>(Please restart Conversations afterwards.)</small></string>
     <string name="restart">Restart</string>
     <string name="install">Install</string>
 </resources>

res/values/styles.xml πŸ”—

@@ -1,24 +1,6 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <!--
-        Base application theme, dependent on API level. This theme is replaced
-        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-    -->
-    <style name="AppBaseTheme" parent="android:Theme.Light">
-        <!--
-            Theme customizations available in newer API levels can go in
-            res/values-vXX/styles.xml, while customizations related to
-            backward-compatibility can go here.
-        -->
-    </style>
-
-    <!-- Application theme. -->
-    <style name="AppTheme" parent="AppBaseTheme">
-        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
-    </style>
-
-    
-     <style name="sectionHeader" parent="android:Widget.Holo.Light.TextView">
+    <style name="sectionHeader" parent="android:Widget.Holo.Light.TextView">
         <item name="android:drawableBottom">@drawable/section_header</item>
         <item name="android:drawablePadding">4dp</item>
         <item name="android:layout_marginTop">8dp</item>
@@ -27,11 +9,11 @@
         <item name="android:textColor">#5b5b5b</item>
         <item name="android:textStyle">bold</item>
     </style>
-    
-     <style name="Divider">
-    <item name="android:layout_width">match_parent</item>
-    	<item name="android:layout_height">1.5dp</item>
-    	<item name="android:background">#b7b7b7</item>
-	</style>
-	
-</resources>
+
+    <style name="Divider">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">1.5dp</item>
+        <item name="android:background">#b7b7b7</item>
+    </style>
+
+</resources>

src/eu/siacs/conversations/services/XmppConnectionService.java πŸ”—

@@ -377,12 +377,14 @@ public class XmppConnectionService extends Service {
 
 		@Override
 		public void onIqPacketReceived(Account account, IqPacket packet) {
-			if (packet.hasChild("query")) {
-				Element query = packet.findChild("query");
-				String xmlns = query.getAttribute("xmlns");
-				if ((xmlns != null) && (xmlns.equals("jabber:iq:roster"))) {
+			if (packet.hasChild("query","jabber:iq:roster")) {
+				String from = packet.getFrom();
+				if ((from==null)||(from.equals(account.getJid()))) {
+					Element query = packet.findChild("query");
 					processRosterItems(account, query);
 					mergePhoneContactsWithRoster(null);
+				} else {
+					Log.d(LOGTAG,"unauthorized roster push from: "+from);
 				}
 			} else if (packet
 					.hasChild("open", "http://jabber.org/protocol/ibb")
@@ -390,8 +392,22 @@ public class XmppConnectionService extends Service {
 							.hasChild("data", "http://jabber.org/protocol/ibb")) {
 				XmppConnectionService.this.mJingleConnectionManager
 						.deliverIbbPacket(account, packet);
+			} else if (packet.hasChild("query","http://jabber.org/protocol/disco#info")) {
+				IqPacket iqResponse = packet.generateRespone(IqPacket.TYPE_RESULT);
+				Element query = iqResponse.addChild("query", "http://jabber.org/protocol/disco#info");
+				query.addChild("feature").setAttribute("var", "urn:xmpp:jingle:1");
+				query.addChild("feature").setAttribute("var", "urn:xmpp:jingle:apps:file-transfer:3");
+				query.addChild("feature").setAttribute("var", "urn:xmpp:jingle:transports:s5b:1");
+				query.addChild("feature").setAttribute("var", "urn:xmpp:jingle:transports:ibb:1");
+				account.getXmppConnection().sendIqPacket(iqResponse, null);
 			} else {
-				Log.d(LOGTAG, "iq packet arrived " + packet.toString());
+				if ((packet.getType() == IqPacket.TYPE_GET)||(packet.getType() == IqPacket.TYPE_SET)) {
+					IqPacket response = packet.generateRespone(IqPacket.TYPE_ERROR);
+					Element error = response.addChild("error");
+					error.setAttribute("type","cancel");
+					error.addChild("feature-not-implemented","urn:ietf:params:xml:ns:xmpp-stanzas");
+					account.getXmppConnection().sendIqPacket(response, null);
+				}
 			}
 		}
 	};
@@ -619,6 +635,7 @@ public class XmppConnectionService extends Service {
 
 	@Override
 	public void onDestroy() {
+		Log.d(LOGTAG,"stopping service");
 		super.onDestroy();
 		for (Account account : accounts) {
 			if (account.getXmppConnection() != null) {

src/eu/siacs/conversations/ui/XmppActivity.java πŸ”—

@@ -95,8 +95,12 @@ public abstract class XmppActivity extends Activity {
 				
 				@Override
 				public void onClick(DialogInterface dialog, int which) {
-					// TODO Auto-generated method stub
-					
+					if (xmppConnectionServiceBound) {
+						unbindService(mConnection);
+						xmppConnectionServiceBound = false;
+					}
+					stopService(new Intent(XmppActivity.this, XmppConnectionService.class));
+					finish();
 				}
 			});
 			builder.setPositiveButton(getString(R.string.install), new OnClickListener() {
@@ -106,6 +110,7 @@ public abstract class XmppActivity extends Activity {
 					Uri uri = Uri.parse("market://details?id=org.sufficientlysecure.keychain");
 					Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 					startActivity(intent);
+					finish();
 				}
 			});
 			builder.create().show();

src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java πŸ”—

@@ -52,6 +52,9 @@ public class JingleConnection {
 	private Element fileOffer;
 	private JingleFile file = null;
 	
+	private String contentName;
+	private String contentCreator;
+	
 	private boolean receivedCandidate = false;
 	private boolean sentCandidate = false;
 	
@@ -160,6 +163,8 @@ public class JingleConnection {
 	}
 	
 	public void init(Message message) {
+		this.contentCreator = "initiator";
+		this.contentName = this.mJingleConnectionManager.nextRandomId();
 		this.message = message;
 		this.account = message.getConversation().getAccount();
 		this.initiator = this.account.getFullJid();
@@ -215,6 +220,8 @@ public class JingleConnection {
 		this.responder = this.account.getFullJid();
 		this.sessionId = packet.getSessionId();
 		Content content = packet.getJingleContent();
+		this.contentCreator = content.getAttribute("creator");
+		this.contentName = content.getAttribute("name");
 		this.transportId = content.getTransportId();
 		this.mergeCandidates(JingleCandidate.parse(content.socks5transport().getChildren()));
 		this.fileOffer = packet.getJingleContent().getFileOffer();
@@ -263,10 +270,8 @@ public class JingleConnection {
 	
 	private void sendInitRequest() {
 		JinglePacket packet = this.bootstrapPacket("session-initiate");
-		Content content = new Content();
+		Content content = new Content(this.contentCreator,this.contentName);
 		if (message.getType() == Message.TYPE_IMAGE) {
-			content.setAttribute("creator", "initiator");
-			content.setAttribute("name", "a-file-offer");
 			content.setTransportId(this.transportId);
 			this.file = this.mXmppConnectionService.getFileBackend().getJingleFile(message);
 			content.setFileOffer(this.file);
@@ -295,7 +300,7 @@ public class JingleConnection {
 			@Override
 			public void onPrimaryCandidateFound(boolean success,final JingleCandidate candidate) {
 				final JinglePacket packet = bootstrapPacket("session-accept");
-				final Content content = new Content();
+				final Content content = new Content(contentCreator,contentName);
 				content.setFileOffer(fileOffer);
 				content.setTransportId(transportId);
 				if ((success)&&(!equalCandidateExists(candidate))) {
@@ -499,7 +504,7 @@ public class JingleConnection {
 	
 	private void sendFallbackToIbb() {
 		JinglePacket packet = this.bootstrapPacket("transport-replace");
-		Content content = new Content("initiator","a-file-offer");
+		Content content = new Content(this.contentCreator,this.contentName);
 		this.transportId = this.mJingleConnectionManager.nextRandomId();
 		content.setTransportId(this.transportId);
 		content.ibbTransport().setAttribute("block-size",""+this.ibbBlockSize);
@@ -613,7 +618,7 @@ public class JingleConnection {
 	
 	private void sendProxyActivated(String cid) {
 		JinglePacket packet = bootstrapPacket("transport-info");
-		Content content = new Content("inititaor","a-file-offer");
+		Content content = new Content(this.contentCreator,this.contentName);
 		content.setTransportId(this.transportId);
 		content.socks5transport().addChild("activated").setAttribute("cid", cid);
 		packet.setContent(content);
@@ -622,7 +627,7 @@ public class JingleConnection {
 	
 	private void sendCandidateUsed(final String cid) {
 		JinglePacket packet = bootstrapPacket("transport-info");
-		Content content = new Content("initiator","a-file-offer");
+		Content content = new Content(this.contentCreator,this.contentName);
 		content.setTransportId(this.transportId);
 		content.socks5transport().addChild("candidate-used").setAttribute("cid", cid);
 		packet.setContent(content);
@@ -635,7 +640,7 @@ public class JingleConnection {
 	
 	private void sendCandidateError() {
 		JinglePacket packet = bootstrapPacket("transport-info");
-		Content content = new Content("initiator","a-file-offer");
+		Content content = new Content(this.contentCreator,this.contentName);
 		content.setTransportId(this.transportId);
 		content.socks5transport().addChild("candidate-error");
 		packet.setContent(content);