Merge pull request #524 from betheg/muc_errors_conditions

Daniel Gultsch created

MUC: differentiated a few more errors.

Change summary

res/values-de/strings.xml                               |  3 +
res/values/strings.xml                                  |  3 +
src/eu/siacs/conversations/entities/MucOptions.java     | 23 +++++++++++
src/eu/siacs/conversations/ui/ConversationFragment.java | 14 ++++++
4 files changed, 42 insertions(+), 1 deletion(-)

Detailed changes

res/values-de/strings.xml πŸ”—

@@ -262,5 +262,8 @@
     <string name="pref_conference_name">Konferenz-Name</string>
     <string name="pref_conference_name_summary">Konferenz-Thema statt Raum-JID als Name verwenden</string>
     <string name="toast_message_otr_fingerprint">OTR Fingerabdruck in die Zwischenablage kopiert!</string>
+    <string name="conference_banned">Du wurdest aus dem Konferenzraum verbannt</string>
+    <string name="conference_members_only">Der Konferenzraum ist nur fΓΌr Mitglieder</string>
+    <string name="conference_kicked">Du wurdest aus dem Konferenzraum geworfen</string>
 
 </resources>

res/values/strings.xml πŸ”—

@@ -262,5 +262,8 @@
     <string name="pref_conference_name">Conference name</string>
     <string name="pref_conference_name_summary">Use room’s subject instead of JID to identify conferences</string>
     <string name="toast_message_otr_fingerprint">OTR fingerprint copied to clipboard!</string>
+    <string name="conference_banned">You were been banned from the conference room</string>
+    <string name="conference_members_only">The conference room is only for members</string>
+    <string name="conference_kicked">You were been kicked from the conference room</string>
 
 </resources>

src/eu/siacs/conversations/entities/MucOptions.java πŸ”—

@@ -15,6 +15,13 @@ public class MucOptions {
 	public static final int ERROR_NICK_IN_USE = 1;
 	public static final int ERROR_ROOM_NOT_FOUND = 2;
 	public static final int ERROR_PASSWORD_REQUIRED = 3;
+	public static final int ERROR_BANNED = 4;
+	public static final int ERROR_MEMBERS_ONLY = 5;
+
+	public static final int KICKED_FROM_ROOM = 9;
+
+	public static final String STATUS_CODE_BANNED = "301";
+	public static final String STATUS_CODE_KICKED = "307";
 
 	public interface OnRenameListener {
 		public void onRename(boolean success);
@@ -179,6 +186,18 @@ public class MucOptions {
 								x.getContent()));
 					}
 				}
+			} else if (type.equals("unavailable") && name.equals(this.joinnick)) {
+				Element status = packet.findChild("x",
+						"http://jabber.org/protocol/muc#user").findChild(
+						"status");
+				String code = status.getAttribute("code");
+				if (code.equals(STATUS_CODE_KICKED)) {
+					this.isOnline = false;
+					this.error = KICKED_FROM_ROOM;
+				} else if (code.equals(STATUS_CODE_BANNED)) {
+					this.isOnline = false;
+					this.error = ERROR_BANNED;
+				}
 			} else if (type.equals("unavailable")) {
 				deleteUser(packet.getAttribute("from").split("/", 2)[1]);
 			} else if (type.equals("error")) {
@@ -199,6 +218,10 @@ public class MucOptions {
 						this.passwordChanged = true;
 					}
 					this.error = ERROR_PASSWORD_REQUIRED;
+				} else if (error.hasChild("forbidden")) {
+					this.error = ERROR_BANNED;
+				} else if (error.hasChild("registration-required")) {
+					this.error = ERROR_MEMBERS_ONLY;
 				}
 			}
 		}

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

@@ -485,6 +485,18 @@ public class ConversationFragment extends Fragment {
 						showSnackbar(R.string.conference_requires_password,
 								R.string.enter_password, enterPassword);
 						break;
+					case MucOptions.ERROR_BANNED:
+						showSnackbar(R.string.conference_banned,
+								R.string.leave, leaveMuc);
+						break;
+					case MucOptions.ERROR_MEMBERS_ONLY:
+						showSnackbar(R.string.conference_members_only,
+								R.string.leave, leaveMuc);
+						break;
+					case MucOptions.KICKED_FROM_ROOM:
+						showSnackbar(R.string.conference_kicked,
+								R.string.leave, leaveMuc);
+						break;
 					default:
 						break;
 					}
@@ -493,7 +505,7 @@ public class ConversationFragment extends Fragment {
 			getActivity().invalidateOptionsMenu();
 			updateChatMsgHint();
 			if (!activity.shouldPaneBeOpen()) {
-				activity.xmppConnectionService.markRead(conversation,true);
+				activity.xmppConnectionService.markRead(conversation, true);
 				activity.updateConversationList();
 			}
 			this.updateSendButton();