incomming jingle packets are routed to their connection. added presence chooser in gui
This commit is contained in:
		
							parent
							
								
									ba0bedc5fa
								
							
						
					
					
						commit
						644473205a
					
				|  | @ -48,4 +48,6 @@ | |||
|     <string name="problem_connecting_to_accounts">Unable to connect to multiple accounts</string> | ||||
|     <string name="touch_to_fix">Touch here to manage your accounts</string> | ||||
|     <string name="action_attach_file">Attach file</string> | ||||
|     <string name="not_in_roster">The contact is not in your roster. Would you like to add it?</string> | ||||
|     <string name="add_contact">Add contact</string> | ||||
| </resources> | ||||
|  |  | |||
|  | @ -46,6 +46,8 @@ public class Conversation extends AbstractEntity { | |||
| 	private long created; | ||||
| 	private int mode; | ||||
| 	 | ||||
| 	private String nextPresence; | ||||
| 
 | ||||
| 	private transient List<Message> messages = null; | ||||
| 	private transient Account account = null; | ||||
| 	private transient Contact contact; | ||||
|  | @ -308,4 +310,12 @@ public class Conversation extends AbstractEntity { | |||
| 	public void setContactJid(String jid) { | ||||
| 		this.contactJid = jid; | ||||
| 	} | ||||
| 	 | ||||
| 	public void setNextPresence(String presence) { | ||||
| 		this.nextPresence = presence; | ||||
| 	} | ||||
| 	 | ||||
| 	public String getNextPresence() { | ||||
| 		return this.nextPresence; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -166,4 +166,8 @@ public class Message extends AbstractEntity { | |||
| 	public int getType() { | ||||
| 		return this.type; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setPresence(String presence) { | ||||
| 		this.counterpart = this.counterpart.split("/")[0] + "/" + presence; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -372,7 +372,7 @@ public class XmppConnectionService extends Service { | |||
| 		 | ||||
| 		@Override | ||||
| 		public void onJinglePacketReceived(Account account, JinglePacket packet) { | ||||
| 			Log.d(LOGTAG,account.getJid()+": jingle packet received"+packet.toString()); | ||||
| 			mJingleConnectionManager.deliverPacket(account, packet); | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
|  | @ -401,8 +401,9 @@ public class XmppConnectionService extends Service { | |||
| 		return this.fileBackend; | ||||
| 	} | ||||
| 	 | ||||
| 	public Message attachImageToConversation(Conversation conversation, Uri uri) { | ||||
| 	public Message attachImageToConversation(Conversation conversation, String presence, Uri uri) { | ||||
| 		Message message = new Message(conversation, "", Message.ENCRYPTION_NONE); | ||||
| 		message.setPresence(presence); | ||||
| 		message.setType(Message.TYPE_IMAGE); | ||||
| 		File file = this.fileBackend.copyImageToPrivateStorage(message, uri); | ||||
| 		Log.d(LOGTAG,"new file"+file.getAbsolutePath()); | ||||
|  |  | |||
|  | @ -1,9 +1,7 @@ | |||
| package eu.siacs.conversations.ui; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.io.InputStream; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Hashtable; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import eu.siacs.conversations.R; | ||||
|  | @ -11,11 +9,8 @@ import eu.siacs.conversations.entities.Account; | |||
| import eu.siacs.conversations.entities.Contact; | ||||
| import eu.siacs.conversations.entities.Conversation; | ||||
| import eu.siacs.conversations.entities.Message; | ||||
| import eu.siacs.conversations.persistance.FileBackend; | ||||
| import eu.siacs.conversations.utils.ExceptionHelper; | ||||
| import eu.siacs.conversations.utils.PhoneHelper; | ||||
| import eu.siacs.conversations.utils.UIHelper; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.app.AlertDialog; | ||||
|  | @ -24,12 +19,10 @@ import android.content.Context; | |||
| import android.content.DialogInterface; | ||||
| import android.content.Intent; | ||||
| import android.content.SharedPreferences; | ||||
| import android.graphics.Bitmap; | ||||
| import android.graphics.Color; | ||||
| import android.graphics.Typeface; | ||||
| import android.support.v4.widget.SlidingPaneLayout; | ||||
| import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener; | ||||
| import android.util.Log; | ||||
| import android.view.KeyEvent; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.Menu; | ||||
|  | @ -50,6 +43,7 @@ public class ConversationActivity extends XmppActivity { | |||
| 	public static final String VIEW_CONVERSATION = "viewConversation"; | ||||
| 	public static final String CONVERSATION = "conversationUuid"; | ||||
| 	public static final String TEXT = "text"; | ||||
| 	public static final String PRESENCE = "eu.siacs.conversations.presence"; | ||||
| 
 | ||||
| 	public static final int REQUEST_SEND_MESSAGE = 0x75441; | ||||
| 	public static final int REQUEST_DECRYPT_PGP = 0x76783; | ||||
|  | @ -78,11 +72,13 @@ public class ConversationActivity extends XmppActivity { | |||
| 						if (conversationList.size() >= 1) { | ||||
| 							swapConversationFragment(); | ||||
| 						} else { | ||||
| 							startActivity(new Intent(getApplicationContext(), ContactsActivity.class)); | ||||
| 							startActivity(new Intent(getApplicationContext(), | ||||
| 									ContactsActivity.class)); | ||||
| 							finish(); | ||||
| 						} | ||||
| 					} | ||||
| 					ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation"); | ||||
| 					ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager() | ||||
| 							.findFragmentByTag("conversation"); | ||||
| 					if (selectedFragment != null) { | ||||
| 						selectedFragment.updateMessages(); | ||||
| 					} | ||||
|  | @ -91,17 +87,6 @@ public class ConversationActivity extends XmppActivity { | |||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	private DialogInterface.OnClickListener addToRoster = new DialogInterface.OnClickListener() { | ||||
| 		 | ||||
| 		@Override | ||||
| 		public void onClick(DialogInterface dialog, int which) { | ||||
| 			String jid = getSelectedConversation().getContactJid(); | ||||
| 			Account account = getSelectedConversation().getAccount(); | ||||
| 			String name = jid.split("@")[0]; | ||||
| 			Contact contact = new Contact(account, name, jid, null); | ||||
| 			xmppConnectionService.createContact(contact); | ||||
| 		} | ||||
| 	}; | ||||
| 	protected ConversationActivity activity = this; | ||||
| 
 | ||||
| 	public List<Conversation> getConversationList() { | ||||
|  | @ -157,9 +142,11 @@ public class ConversationActivity extends XmppActivity { | |||
| 				} else { | ||||
| 					view.setBackgroundColor(Color.TRANSPARENT); | ||||
| 				} | ||||
| 				TextView convName = (TextView) view.findViewById(R.id.conversation_name); | ||||
| 				TextView convName = (TextView) view | ||||
| 						.findViewById(R.id.conversation_name); | ||||
| 				convName.setText(conv.getName(useSubject)); | ||||
| 				TextView convLastMsg = (TextView) view.findViewById(R.id.conversation_lastmsg); | ||||
| 				TextView convLastMsg = (TextView) view | ||||
| 						.findViewById(R.id.conversation_lastmsg); | ||||
| 				convLastMsg.setText(conv.getLatestMessage().getBody()); | ||||
| 
 | ||||
| 				if (!conv.isRead()) { | ||||
|  | @ -171,10 +158,14 @@ public class ConversationActivity extends XmppActivity { | |||
| 				} | ||||
| 
 | ||||
| 				((TextView) view.findViewById(R.id.conversation_lastupdate)) | ||||
| 				.setText(UIHelper.readableTimeDifference(conv.getLatestMessage().getTimeSent())); | ||||
| 						.setText(UIHelper.readableTimeDifference(conv | ||||
| 								.getLatestMessage().getTimeSent())); | ||||
| 
 | ||||
| 				ImageView imageView = (ImageView) view.findViewById(R.id.conversation_image); | ||||
| 				imageView.setImageBitmap(UIHelper.getContactPicture(conv.getContact(), conv.getName(useSubject),200, activity.getApplicationContext())); | ||||
| 				ImageView imageView = (ImageView) view | ||||
| 						.findViewById(R.id.conversation_image); | ||||
| 				imageView.setImageBitmap(UIHelper.getContactPicture( | ||||
| 						conv.getContact(), conv.getName(useSubject), 200, | ||||
| 						activity.getApplicationContext())); | ||||
| 				return view; | ||||
| 			} | ||||
| 
 | ||||
|  | @ -214,13 +205,16 @@ public class ConversationActivity extends XmppActivity { | |||
| 			@Override | ||||
| 			public void onPanelClosed(View arg0) { | ||||
| 				paneShouldBeOpen = false; | ||||
| 				if ((conversationList.size() > 0)&&(getSelectedConversation()!=null)) { | ||||
| 				if ((conversationList.size() > 0) | ||||
| 						&& (getSelectedConversation() != null)) { | ||||
| 					getActionBar().setDisplayHomeAsUpEnabled(true); | ||||
| 					getActionBar().setTitle(getSelectedConversation().getName(useSubject)); | ||||
| 					getActionBar().setTitle( | ||||
| 							getSelectedConversation().getName(useSubject)); | ||||
| 					invalidateOptionsMenu(); | ||||
| 					if (!getSelectedConversation().isRead()) { | ||||
| 						getSelectedConversation().markRead(); | ||||
| 						UIHelper.updateNotification(getApplicationContext(), getConversationList(), null, false); | ||||
| 						UIHelper.updateNotification(getApplicationContext(), | ||||
| 								getConversationList(), null, false); | ||||
| 						listView.invalidateViews(); | ||||
| 					} | ||||
| 				} | ||||
|  | @ -239,9 +233,12 @@ public class ConversationActivity extends XmppActivity { | |||
| 		getMenuInflater().inflate(R.menu.conversations, menu); | ||||
| 		MenuItem menuSecure = (MenuItem) menu.findItem(R.id.action_security); | ||||
| 		MenuItem menuArchive = (MenuItem) menu.findItem(R.id.action_archive); | ||||
| 		MenuItem menuMucDetails = (MenuItem) menu.findItem(R.id.action_muc_details); | ||||
| 		MenuItem menuContactDetails = (MenuItem) menu.findItem(R.id.action_contact_details); | ||||
| 		MenuItem menuInviteContacts = (MenuItem) menu.findItem(R.id.action_invite); | ||||
| 		MenuItem menuMucDetails = (MenuItem) menu | ||||
| 				.findItem(R.id.action_muc_details); | ||||
| 		MenuItem menuContactDetails = (MenuItem) menu | ||||
| 				.findItem(R.id.action_contact_details); | ||||
| 		MenuItem menuInviteContacts = (MenuItem) menu | ||||
| 				.findItem(R.id.action_invite); | ||||
| 		MenuItem menuAttach = (MenuItem) menu.findItem(R.id.action_attach_file); | ||||
| 
 | ||||
| 		if ((spl.isOpen() && (spl.isSlideable()))) { | ||||
|  | @ -252,7 +249,8 @@ public class ConversationActivity extends XmppActivity { | |||
| 			menuInviteContacts.setVisible(false); | ||||
| 			menuAttach.setVisible(false); | ||||
| 		} else { | ||||
| 			((MenuItem) menu.findItem(R.id.action_add)).setVisible(!spl.isSlideable()); | ||||
| 			((MenuItem) menu.findItem(R.id.action_add)).setVisible(!spl | ||||
| 					.isSlideable()); | ||||
| 			if (this.getSelectedConversation() != null) { | ||||
| 				if (this.getSelectedConversation().getMode() == Conversation.MODE_MULTI) { | ||||
| 					menuMucDetails.setVisible(true); | ||||
|  | @ -265,7 +263,8 @@ public class ConversationActivity extends XmppActivity { | |||
| 					menuMucDetails.setVisible(false); | ||||
| 					menuInviteContacts.setVisible(false); | ||||
| 					menuAttach.setVisible(true); | ||||
| 					if (this.getSelectedConversation().getLatestMessage().getEncryption() != Message.ENCRYPTION_NONE) { | ||||
| 					if (this.getSelectedConversation().getLatestMessage() | ||||
| 							.getEncryption() != Message.ENCRYPTION_NONE) { | ||||
| 						menuSecure.setIcon(R.drawable.ic_action_secure); | ||||
| 					} | ||||
| 				} | ||||
|  | @ -281,11 +280,19 @@ public class ConversationActivity extends XmppActivity { | |||
| 			spl.openPane(); | ||||
| 			break; | ||||
| 		case R.id.action_attach_file: | ||||
| 			selectPresence(getSelectedConversation(), new OnPresenceSelected() { | ||||
| 				 | ||||
| 				@Override | ||||
| 				public void onPresenceSelected(boolean success, String presence) { | ||||
| 					if (success) { | ||||
| 						Intent attachFileIntent = new Intent(); | ||||
| 						attachFileIntent.setType("image/*"); | ||||
| 						attachFileIntent.setAction(Intent.ACTION_GET_CONTENT); | ||||
|             startActivityForResult(Intent.createChooser(attachFileIntent, | ||||
|                     "Attach File"), ATTACH_FILE); | ||||
| 						Intent chooser = Intent.createChooser(attachFileIntent, "Attach File"); | ||||
| 						startActivityForResult(chooser,	ATTACH_FILE); | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
| 			break; | ||||
| 		case R.id.action_add: | ||||
| 			startActivity(new Intent(this, ContactsActivity.class)); | ||||
|  | @ -310,13 +317,7 @@ public class ConversationActivity extends XmppActivity { | |||
| 				intent.putExtra("uuid", contact.getUuid()); | ||||
| 				startActivity(intent); | ||||
| 			} else { | ||||
| 				String jid = getSelectedConversation().getContactJid(); | ||||
| 				AlertDialog.Builder builder = new AlertDialog.Builder(this); | ||||
| 				builder.setTitle(jid); | ||||
| 				builder.setMessage("The contact is not in your roster. Would you like to add it."); | ||||
| 				builder.setNegativeButton("Cancel", null); | ||||
| 				builder.setPositiveButton("Add",addToRoster); | ||||
| 				builder.create().show(); | ||||
| 				showAddToRosterDialog(getSelectedConversation()); | ||||
| 			} | ||||
| 			break; | ||||
| 		case R.id.action_muc_details: | ||||
|  | @ -336,7 +337,8 @@ public class ConversationActivity extends XmppActivity { | |||
| 			final Conversation selConv = getSelectedConversation(); | ||||
| 			View menuItemView = findViewById(R.id.action_security); | ||||
| 			PopupMenu popup = new PopupMenu(this, menuItemView); | ||||
| 			final ConversationFragment fragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation"); | ||||
| 			final ConversationFragment fragment = (ConversationFragment) getFragmentManager() | ||||
| 					.findFragmentByTag("conversation"); | ||||
| 			if (fragment != null) { | ||||
| 				popup.setOnMenuItemClickListener(new OnMenuItemClickListener() { | ||||
| 
 | ||||
|  | @ -366,19 +368,24 @@ public class ConversationActivity extends XmppActivity { | |||
| 				popup.inflate(R.menu.encryption_choices); | ||||
| 				switch (selConv.nextMessageEncryption) { | ||||
| 				case Message.ENCRYPTION_NONE: | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_none).setChecked(true); | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_none) | ||||
| 							.setChecked(true); | ||||
| 					break; | ||||
| 				case Message.ENCRYPTION_OTR: | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_otr).setChecked(true); | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_otr) | ||||
| 							.setChecked(true); | ||||
| 					break; | ||||
| 				case Message.ENCRYPTION_PGP: | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_pgp).setChecked(true); | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_pgp) | ||||
| 							.setChecked(true); | ||||
| 					break; | ||||
| 				case Message.ENCRYPTION_DECRYPTED: | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_pgp).setChecked(true); | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_pgp) | ||||
| 							.setChecked(true); | ||||
| 					break; | ||||
| 				default: | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_none).setChecked(true); | ||||
| 					popup.getMenu().findItem(R.id.encryption_choice_none) | ||||
| 							.setChecked(true); | ||||
| 					break; | ||||
| 				} | ||||
| 				popup.show(); | ||||
|  | @ -396,7 +403,8 @@ public class ConversationActivity extends XmppActivity { | |||
| 
 | ||||
| 		FragmentTransaction transaction = getFragmentManager() | ||||
| 				.beginTransaction(); | ||||
| 		transaction.replace(R.id.selected_conversation, selectedFragment,"conversation"); | ||||
| 		transaction.replace(R.id.selected_conversation, selectedFragment, | ||||
| 				"conversation"); | ||||
| 		transaction.commit(); | ||||
| 		return selectedFragment; | ||||
| 	} | ||||
|  | @ -415,7 +423,8 @@ public class ConversationActivity extends XmppActivity { | |||
| 	@Override | ||||
| 	public void onStart() { | ||||
| 		super.onStart(); | ||||
| 		SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); | ||||
| 		SharedPreferences preferences = PreferenceManager | ||||
| 				.getDefaultSharedPreferences(this); | ||||
| 		this.useSubject = preferences.getBoolean("use_subject_in_muc", true); | ||||
| 		if (this.xmppConnectionServiceBound) { | ||||
| 			this.onBackendConnected(); | ||||
|  | @ -440,12 +449,14 @@ public class ConversationActivity extends XmppActivity { | |||
| 			updateConversationList(); | ||||
| 		} | ||||
| 
 | ||||
| 		if ((getIntent().getAction()!=null)&&(getIntent().getAction().equals(Intent.ACTION_VIEW) && (!handledViewIntent))) { | ||||
| 		if ((getIntent().getAction() != null) | ||||
| 				&& (getIntent().getAction().equals(Intent.ACTION_VIEW) && (!handledViewIntent))) { | ||||
| 			if (getIntent().getType().equals( | ||||
| 					ConversationActivity.VIEW_CONVERSATION)) { | ||||
| 				handledViewIntent = true; | ||||
| 
 | ||||
| 				String convToView = (String) getIntent().getExtras().get(CONVERSATION); | ||||
| 				String convToView = (String) getIntent().getExtras().get( | ||||
| 						CONVERSATION); | ||||
| 
 | ||||
| 				for (int i = 0; i < conversationList.size(); ++i) { | ||||
| 					if (conversationList.get(i).getUuid().equals(convToView)) { | ||||
|  | @ -467,7 +478,8 @@ public class ConversationActivity extends XmppActivity { | |||
| 			} else { | ||||
| 				spl.openPane(); | ||||
| 				// find currently loaded fragment | ||||
| 				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation"); | ||||
| 				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager() | ||||
| 						.findFragmentByTag("conversation"); | ||||
| 				if (selectedFragment != null) { | ||||
| 					selectedFragment.onBackendConnected(); | ||||
| 				} else { | ||||
|  | @ -478,31 +490,90 @@ public class ConversationActivity extends XmppActivity { | |||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void registerListener() { | ||||
| 		if (xmppConnectionServiceBound) { | ||||
| 			 xmppConnectionService.setOnConversationListChangedListener(this.onConvChanged); | ||||
| 			xmppConnectionService | ||||
| 					.setOnConversationListChangedListener(this.onConvChanged); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	 protected void onActivityResult(int requestCode, int resultCode, Intent data) { | ||||
| 	protected void onActivityResult(int requestCode, int resultCode, final Intent data) { | ||||
| 		super.onActivityResult(requestCode, resultCode, data); | ||||
| 		if (resultCode == RESULT_OK) { | ||||
| 			if (requestCode == REQUEST_DECRYPT_PGP) { | ||||
| 				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation"); | ||||
| 				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager() | ||||
| 						.findFragmentByTag("conversation"); | ||||
| 				if (selectedFragment != null) { | ||||
| 					selectedFragment.hidePgpPassphraseBox(); | ||||
| 				} | ||||
| 			} else if (requestCode == ATTACH_FILE) { | ||||
| 				xmppConnectionService.attachImageToConversation(getSelectedConversation(), data.getData()); | ||||
| 				Conversation conversation = getSelectedConversation(); | ||||
| 				String presence = conversation.getNextPresence(); | ||||
| 				xmppConnectionService.attachImageToConversation(conversation, presence, data.getData()); | ||||
| 				 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void updateConversationList() { | ||||
| 		conversationList.clear(); | ||||
| 		conversationList.addAll(xmppConnectionService | ||||
| 				.getConversations()); | ||||
| 		conversationList.addAll(xmppConnectionService.getConversations()); | ||||
| 		listView.invalidateViews(); | ||||
| 	} | ||||
| 	 | ||||
| 	public void selectPresence(final Conversation conversation, final OnPresenceSelected listener) { | ||||
| 		Contact contact = conversation.getContact(); | ||||
| 		if (contact==null) { | ||||
| 			showAddToRosterDialog(conversation); | ||||
| 			listener.onPresenceSelected(false,null); | ||||
| 		} else { | ||||
| 			Hashtable<String, Integer> presences = contact.getPresences(); | ||||
| 			if (presences.size() == 0) { | ||||
| 				listener.onPresenceSelected(false, null); | ||||
| 			} else if (presences.size() == 1) { | ||||
| 				String presence = (String) presences.keySet().toArray()[0]; | ||||
| 				conversation.setNextPresence(presence); | ||||
| 				listener.onPresenceSelected(true, presence); | ||||
| 			} else { | ||||
| 				AlertDialog.Builder builder = new AlertDialog.Builder(this); | ||||
| 				builder.setTitle("Choose Presence"); | ||||
| 				final String[] presencesArray = new String[presences.size()]; | ||||
| 				presences.keySet().toArray(presencesArray); | ||||
| 				builder.setItems(presencesArray, | ||||
| 						new DialogInterface.OnClickListener() { | ||||
| 
 | ||||
| 							@Override | ||||
| 							public void onClick(DialogInterface dialog, | ||||
| 									int which) { | ||||
| 								String presence = presencesArray[which]; | ||||
| 								conversation.setNextPresence(presence); | ||||
| 								listener.onPresenceSelected(true,presence); | ||||
| 							} | ||||
| 						}); | ||||
| 				builder.create().show(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	private void showAddToRosterDialog(final Conversation conversation) { | ||||
| 		String jid = conversation.getContactJid(); | ||||
| 		AlertDialog.Builder builder = new AlertDialog.Builder(this); | ||||
| 		builder.setTitle(jid); | ||||
| 		builder.setMessage(getString(R.string.not_in_roster)); | ||||
| 		builder.setNegativeButton(getString(R.string.cancel), null); | ||||
| 		builder.setPositiveButton(getString(R.string.add_contact), new DialogInterface.OnClickListener() { | ||||
| 
 | ||||
| 			@Override | ||||
| 			public void onClick(DialogInterface dialog, int which) { | ||||
| 				String jid = conversation.getContactJid(); | ||||
| 				Account account = getSelectedConversation().getAccount(); | ||||
| 				String name = jid.split("@")[0]; | ||||
| 				Contact contact = new Contact(account, name, jid, null); | ||||
| 				xmppConnectionService.createContact(contact); | ||||
| 			} | ||||
| 		}); | ||||
| 		builder.create().show(); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| package eu.siacs.conversations.ui; | ||||
| 
 | ||||
| public interface OnPresenceSelected { | ||||
| 	public void onPresenceSelected(boolean success, String presence); | ||||
| } | ||||
|  | @ -19,6 +19,11 @@ public class JingleConnection { | |||
| 	private JingleConnectionManager mJingleConnectionManager; | ||||
| 	private XmppConnectionService mXmppConnectionService; | ||||
| 	 | ||||
| 	public static final int STATUS_INITIATED = 0; | ||||
| 	public static final int STATUS_ACCEPTED = 1; | ||||
| 	public static final int STATUS_FAILED = 99; | ||||
| 	 | ||||
| 	private int status = -1; | ||||
| 	private Message message; | ||||
| 	private String sessionId; | ||||
| 	private Account account; | ||||
|  | @ -30,7 +35,9 @@ public class JingleConnection { | |||
| 		 | ||||
| 		@Override | ||||
| 		public void onIqPacketReceived(Account account, IqPacket packet) { | ||||
| 			Log.d("xmppService",packet.toString()); | ||||
| 			if (packet.getType() == IqPacket.TYPE_ERROR) { | ||||
| 				status = STATUS_FAILED; | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
|  | @ -44,6 +51,21 @@ public class JingleConnection { | |||
| 		return this.sessionId; | ||||
| 	} | ||||
| 	 | ||||
| 	public String getAccountJid() { | ||||
| 		return this.account.getJid(); | ||||
| 	} | ||||
| 	 | ||||
| 	public String getCounterPart() { | ||||
| 		return this.message.getCounterpart(); | ||||
| 	} | ||||
| 	 | ||||
| 	public void deliverPacket(JinglePacket packet) { | ||||
| 		Log.d("xmppService","packet arrived in connection"); | ||||
| 		if (packet.isAction("")) { | ||||
| 			 | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public void init(Message message) { | ||||
| 		this.message = message; | ||||
| 		this.account = message.getConversation().getAccount(); | ||||
|  | @ -78,13 +100,14 @@ public class JingleConnection { | |||
| 			packet.setContent(content); | ||||
| 			Log.d("xmppService",packet.toString()); | ||||
| 			account.getXmppConnection().sendIqPacket(packet, this.responseListener); | ||||
| 			this.status = STATUS_INITIATED; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	private JinglePacket bootstrapPacket() { | ||||
| 		JinglePacket packet = new JinglePacket(); | ||||
| 		packet.setFrom(account.getFullJid()); | ||||
| 		packet.setTo(this.message.getCounterpart()+"/Gajim"); //fixme, not right in all cases; | ||||
| 		packet.setTo(this.message.getCounterpart()); //fixme, not right in all cases; | ||||
| 		packet.setSessionId(this.sessionId); | ||||
| 		return packet; | ||||
| 	} | ||||
|  |  | |||
|  | @ -20,7 +20,8 @@ public class JingleConnectionManager { | |||
| 
 | ||||
| 	private XmppConnectionService xmppConnectionService; | ||||
| 
 | ||||
| 	private List<JingleConnection> connections = new ArrayList<JingleConnection>(); //make concurrent | ||||
| 	private List<JingleConnection> connections = new ArrayList<JingleConnection>(); // make | ||||
| 																					// concurrent | ||||
| 
 | ||||
| 	private ConcurrentHashMap<String, Element> primaryCanditates = new ConcurrentHashMap<String, Element>(); | ||||
| 
 | ||||
|  | @ -31,18 +32,33 @@ public class JingleConnectionManager { | |||
| 	} | ||||
| 
 | ||||
| 	public void deliverPacket(Account account, JinglePacket packet) { | ||||
| 		String id = generateInternalId(account.getJid(), packet.getFrom(), packet.getSessionId()); | ||||
| 		for (JingleConnection connection : connections) { | ||||
| 			if (connection.getAccountJid().equals(account.getJid()) && connection | ||||
| 					.getSessionId().equals(packet.getSessionId()) && connection | ||||
| 					.getCounterPart().equals(packet.getFrom())) { | ||||
| 				connection.deliverPacket(packet); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		Log.d("xmppService","delivering packet failed "+packet.toString()); | ||||
| 	} | ||||
| 
 | ||||
| 	public JingleConnection createNewConnection(Message message) { | ||||
| 		Account account = message.getConversation().getAccount(); | ||||
| 		JingleConnection connection = new JingleConnection(this); | ||||
| 		String id = generateInternalId(account.getJid(), message.getCounterpart(), connection.getSessionId()); | ||||
| 		connection.init(message); | ||||
| 		connections.add(connection); | ||||
| 		return connection; | ||||
| 	} | ||||
| 
 | ||||
| 	private String generateInternalId(String account, String counterpart, String sid) { | ||||
| 	public JingleConnection createNewConnection(JinglePacket packet) { | ||||
| 		JingleConnection connection = new JingleConnection(this); | ||||
| 		connections.add(connection); | ||||
| 		return connection; | ||||
| 	} | ||||
| 
 | ||||
| 	private String generateInternalId(String account, String counterpart, | ||||
| 			String sid) { | ||||
| 		return account + "#" + counterpart + "#" + sid; | ||||
| 
 | ||||
| 	} | ||||
|  | @ -51,30 +67,47 @@ public class JingleConnectionManager { | |||
| 		return this.xmppConnectionService; | ||||
| 	} | ||||
| 
 | ||||
| 	public void getPrimaryCanditate(Account account, final OnPrimaryCanditateFound listener) { | ||||
| 	public void getPrimaryCanditate(Account account, | ||||
| 			final OnPrimaryCanditateFound listener) { | ||||
| 		if (!this.primaryCanditates.containsKey(account.getJid())) { | ||||
| 			String xmlns = "http://jabber.org/protocol/bytestreams"; | ||||
| 			String proxy = account.getXmppConnection().findDiscoItemByFeature(xmlns); | ||||
| 			final String proxy = account.getXmppConnection() | ||||
| 					.findDiscoItemByFeature(xmlns); | ||||
| 			if (proxy != null) { | ||||
| 				IqPacket iq = new IqPacket(IqPacket.TYPE_GET); | ||||
| 				iq.setTo(proxy); | ||||
| 				iq.query(xmlns); | ||||
| 				account.getXmppConnection().sendIqPacket(iq, new OnIqPacketReceived() { | ||||
| 				account.getXmppConnection().sendIqPacket(iq, | ||||
| 						new OnIqPacketReceived() { | ||||
| 
 | ||||
| 							@Override | ||||
| 					public void onIqPacketReceived(Account account, IqPacket packet) { | ||||
| 						Element streamhost = packet.query().findChild("streamhost","http://jabber.org/protocol/bytestreams"); | ||||
| 							public void onIqPacketReceived(Account account, | ||||
| 									IqPacket packet) { | ||||
| 								Element streamhost = packet | ||||
| 										.query() | ||||
| 										.findChild("streamhost", | ||||
| 												"http://jabber.org/protocol/bytestreams"); | ||||
| 								if (streamhost != null) { | ||||
| 							Log.d("xmppService","streamhost found "+streamhost.toString()); | ||||
| 									Log.d("xmppService", "streamhost found " | ||||
| 											+ streamhost.toString()); | ||||
| 									Element canditate = new Element("canditate"); | ||||
| 							canditate.setAttribute("cid",nextRandomId()); | ||||
| 							canditate.setAttribute("host", streamhost.getAttribute("host")); | ||||
| 							canditate.setAttribute("port",streamhost.getAttribute("port")); | ||||
| 									canditate.setAttribute("cid", | ||||
| 											nextRandomId()); | ||||
| 									canditate.setAttribute("host", | ||||
| 											streamhost.getAttribute("host")); | ||||
| 									canditate.setAttribute("port", | ||||
| 											streamhost.getAttribute("port")); | ||||
| 									canditate.setAttribute("type", "proxy"); | ||||
| 							primaryCanditates.put(account.getJid(), canditate); | ||||
| 							listener.onPrimaryCanditateFound(true, canditate); | ||||
| 									canditate.setAttribute("jid", proxy); | ||||
| 									canditate | ||||
| 											.setAttribute("priority", "655360"); | ||||
| 									primaryCanditates.put(account.getJid(), | ||||
| 											canditate); | ||||
| 									listener.onPrimaryCanditateFound(true, | ||||
| 											canditate); | ||||
| 								} else { | ||||
| 							listener.onPrimaryCanditateFound(false, null); | ||||
| 									listener.onPrimaryCanditateFound(false, | ||||
| 											null); | ||||
| 								} | ||||
| 							} | ||||
| 						}); | ||||
|  | @ -83,7 +116,8 @@ public class JingleConnectionManager { | |||
| 			} | ||||
| 
 | ||||
| 		} else { | ||||
| 			listener.onPrimaryCanditateFound(true, this.primaryCanditates.get(account.getJid())); | ||||
| 			listener.onPrimaryCanditateFound(true, | ||||
| 					this.primaryCanditates.get(account.getJid())); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -70,7 +70,15 @@ public class JinglePacket extends IqPacket { | |||
| 		this.jingle.setAttribute("action", action); | ||||
| 	} | ||||
| 	 | ||||
| 	public String getAction() { | ||||
| 		return this.jingle.getAttribute("action"); | ||||
| 	} | ||||
| 	 | ||||
| 	public void setInitiator(String initiator) { | ||||
| 		this.jingle.setAttribute("initiator", initiator); | ||||
| 	} | ||||
| 
 | ||||
| 	public boolean isAction(String action) { | ||||
| 		return action.equalsIgnoreCase(this.getAction()); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Daniel Gultsch
						Daniel Gultsch