ConferenceDetailsActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import android.annotation.TargetApi;
  4import android.app.AlertDialog;
  5import android.app.PendingIntent;
  6import android.content.Context;
  7import android.content.DialogInterface;
  8import android.content.IntentSender.SendIntentException;
  9import android.graphics.Bitmap;
 10import android.os.Build;
 11import android.os.Bundle;
 12import android.view.ContextMenu;
 13import android.view.LayoutInflater;
 14import android.view.Menu;
 15import android.view.MenuItem;
 16import android.view.View;
 17import android.view.View.OnClickListener;
 18import android.widget.Button;
 19import android.widget.ImageButton;
 20import android.widget.ImageView;
 21import android.widget.LinearLayout;
 22import android.widget.TableLayout;
 23import android.widget.TextView;
 24import android.widget.Toast;
 25
 26import org.openintents.openpgp.util.OpenPgpUtils;
 27
 28import java.util.ArrayList;
 29import java.util.Collections;
 30import java.util.Comparator;
 31
 32import eu.siacs.conversations.Config;
 33import eu.siacs.conversations.R;
 34import eu.siacs.conversations.crypto.PgpEngine;
 35import eu.siacs.conversations.entities.Account;
 36import eu.siacs.conversations.entities.Bookmark;
 37import eu.siacs.conversations.entities.Contact;
 38import eu.siacs.conversations.entities.Conversation;
 39import eu.siacs.conversations.entities.MucOptions;
 40import eu.siacs.conversations.entities.MucOptions.User;
 41import eu.siacs.conversations.services.XmppConnectionService;
 42import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
 43import eu.siacs.conversations.services.XmppConnectionService.OnMucRosterUpdate;
 44import eu.siacs.conversations.xmpp.jid.Jid;
 45
 46public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConferenceOptionsPushed {
 47	public static final String ACTION_VIEW_MUC = "view_muc";
 48	private Conversation mConversation;
 49	private OnClickListener inviteListener = new OnClickListener() {
 50
 51		@Override
 52		public void onClick(View v) {
 53			inviteToConversation(mConversation);
 54		}
 55	};
 56	private TextView mYourNick;
 57	private ImageView mYourPhoto;
 58	private ImageButton mEditNickButton;
 59	private TextView mRoleAffiliaton;
 60	private TextView mFullJid;
 61	private TextView mAccountJid;
 62	private LinearLayout membersView;
 63	private LinearLayout mMoreDetails;
 64	private TextView mConferenceType;
 65	private TableLayout mConferenceInfoTable;
 66	private TextView mConferenceInfoMam;
 67	private ImageButton mChangeConferenceSettingsButton;
 68	private Button mInviteButton;
 69	private String uuid = null;
 70	private User mSelectedUser = null;
 71
 72	private boolean mAdvancedMode = false;
 73
 74	private UiCallback<Conversation> renameCallback = new UiCallback<Conversation>() {
 75		@Override
 76		public void success(Conversation object) {
 77			runOnUiThread(new Runnable() {
 78				@Override
 79				public void run() {
 80					Toast.makeText(ConferenceDetailsActivity.this,getString(R.string.your_nick_has_been_changed),Toast.LENGTH_SHORT).show();
 81					updateView();
 82				}
 83			});
 84
 85		}
 86
 87		@Override
 88		public void error(final int errorCode, Conversation object) {
 89			runOnUiThread(new Runnable() {
 90				@Override
 91				public void run() {
 92					Toast.makeText(ConferenceDetailsActivity.this,getString(errorCode),Toast.LENGTH_SHORT).show();
 93				}
 94			});
 95		}
 96
 97		@Override
 98		public void userInputRequried(PendingIntent pi, Conversation object) {
 99
100		}
101	};
102	private OnClickListener mChangeConferenceSettings = new OnClickListener() {
103		@Override
104		public void onClick(View v) {
105			final MucOptions mucOptions = mConversation.getMucOptions();
106			AlertDialog.Builder builder = new AlertDialog.Builder(ConferenceDetailsActivity.this);
107			builder.setTitle(R.string.conference_options);
108			final String[] options;
109			final boolean[] values;
110			if (mAdvancedMode) {
111				options = new String[]{
112						getString(R.string.members_only),
113						getString(R.string.moderated),
114						getString(R.string.non_anonymous)
115				};
116				values = new boolean[]{
117						mucOptions.membersOnly(),
118						mucOptions.moderated(),
119						mucOptions.nonanonymous()
120				};
121			} else {
122				options = new String[]{
123						getString(R.string.members_only),
124						getString(R.string.non_anonymous)
125				};
126				values = new boolean[]{
127						mucOptions.membersOnly(),
128						mucOptions.nonanonymous()
129				};
130			}
131			builder.setMultiChoiceItems(options,values,new DialogInterface.OnMultiChoiceClickListener() {
132				@Override
133				public void onClick(DialogInterface dialog, int which, boolean isChecked) {
134					values[which] = isChecked;
135				}
136			});
137			builder.setNegativeButton(R.string.cancel, null);
138			builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() {
139				@Override
140				public void onClick(DialogInterface dialog, int which) {
141					if (!mucOptions.membersOnly() && values[0]) {
142						xmppConnectionService.changeAffiliationsInConference(mConversation,
143								MucOptions.Affiliation.NONE,
144								MucOptions.Affiliation.MEMBER);
145					}
146					Bundle options = new Bundle();
147					options.putString("muc#roomconfig_membersonly", values[0] ? "1" : "0");
148					if (values.length == 2) {
149						options.putString("muc#roomconfig_whois", values[1] ? "anyone" : "moderators");
150					} else if (values.length == 3) {
151						options.putString("muc#roomconfig_moderatedroom", values[1] ? "1" : "0");
152						options.putString("muc#roomconfig_whois", values[2] ? "anyone" : "moderators");
153					}
154					options.putString("muc#roomconfig_persistentroom", "1");
155					xmppConnectionService.pushConferenceConfiguration(mConversation,
156							options,
157							ConferenceDetailsActivity.this);
158				}
159			});
160			builder.create().show();
161		}
162	};
163	private OnValueEdited onSubjectEdited = new OnValueEdited() {
164
165		@Override
166		public void onValueEdited(String value) {
167			xmppConnectionService.pushSubjectToConference(mConversation,value);
168		}
169	};
170
171	@Override
172	public void onConversationUpdate() {
173		refreshUi();
174	}
175
176	@Override
177	public void onMucRosterUpdate() {
178		refreshUi();
179	}
180
181	@Override
182	protected void refreshUiReal() {
183		updateView();
184	}
185
186	@Override
187	protected void onCreate(Bundle savedInstanceState) {
188		super.onCreate(savedInstanceState);
189		setContentView(R.layout.activity_muc_details);
190		mYourNick = (TextView) findViewById(R.id.muc_your_nick);
191		mYourPhoto = (ImageView) findViewById(R.id.your_photo);
192		mEditNickButton = (ImageButton) findViewById(R.id.edit_nick_button);
193		mFullJid = (TextView) findViewById(R.id.muc_jabberid);
194		membersView = (LinearLayout) findViewById(R.id.muc_members);
195		mAccountJid = (TextView) findViewById(R.id.details_account);
196		mMoreDetails = (LinearLayout) findViewById(R.id.muc_more_details);
197		mMoreDetails.setVisibility(View.GONE);
198		mChangeConferenceSettingsButton = (ImageButton) findViewById(R.id.change_conference_button);
199		mChangeConferenceSettingsButton.setOnClickListener(this.mChangeConferenceSettings);
200		mInviteButton = (Button) findViewById(R.id.invite);
201		mInviteButton.setOnClickListener(inviteListener);
202		mConferenceType = (TextView) findViewById(R.id.muc_conference_type);
203		if (getActionBar() != null) {
204			getActionBar().setHomeButtonEnabled(true);
205			getActionBar().setDisplayHomeAsUpEnabled(true);
206		}
207		mEditNickButton.setOnClickListener(new OnClickListener() {
208
209			@Override
210			public void onClick(View v) {
211				quickEdit(mConversation.getMucOptions().getActualNick(),
212						new OnValueEdited() {
213
214							@Override
215							public void onValueEdited(String value) {
216								xmppConnectionService.renameInMuc(mConversation,value,renameCallback);
217							}
218						});
219			}
220		});
221		this.mAdvancedMode = getPreferences().getBoolean("advanced_muc_mode", false);
222		this.mConferenceInfoTable = (TableLayout) findViewById(R.id.muc_info_more);
223		mConferenceInfoTable.setVisibility(this.mAdvancedMode ? View.VISIBLE : View.GONE);
224		this.mConferenceInfoMam = (TextView) findViewById(R.id.muc_info_mam);
225	}
226
227	@Override
228	public boolean onOptionsItemSelected(MenuItem menuItem) {
229		switch (menuItem.getItemId()) {
230			case android.R.id.home:
231				finish();
232				break;
233			case R.id.action_edit_subject:
234				if (mConversation != null) {
235					quickEdit(mConversation.getName(),this.onSubjectEdited);
236				}
237				break;
238			case R.id.action_save_as_bookmark:
239				saveAsBookmark();
240				break;
241			case R.id.action_delete_bookmark:
242				deleteBookmark();
243				break;
244			case R.id.action_advanced_mode:
245				this.mAdvancedMode = !menuItem.isChecked();
246				menuItem.setChecked(this.mAdvancedMode);
247				getPreferences().edit().putBoolean("advanced_muc_mode", mAdvancedMode).commit();
248				mConferenceInfoTable.setVisibility(this.mAdvancedMode ? View.VISIBLE : View.GONE);
249				invalidateOptionsMenu();
250				updateView();
251				break;
252		}
253		return super.onOptionsItemSelected(menuItem);
254	}
255
256	@Override
257	protected String getShareableUri() {
258		if (mConversation != null) {
259			return "xmpp:" + mConversation.getJid().toBareJid().toString() + "?join";
260		} else {
261			return "";
262		}
263	}
264
265	@Override
266	public boolean onPrepareOptionsMenu(Menu menu) {
267		MenuItem menuItemSaveBookmark = menu.findItem(R.id.action_save_as_bookmark);
268		MenuItem menuItemDeleteBookmark = menu.findItem(R.id.action_delete_bookmark);
269		MenuItem menuItemAdvancedMode = menu.findItem(R.id.action_advanced_mode);
270		MenuItem menuItemChangeSubject = menu.findItem(R.id.action_edit_subject);
271		menuItemAdvancedMode.setChecked(mAdvancedMode);
272		if (mConversation == null) {
273			return true;
274		}
275		Account account = mConversation.getAccount();
276		if (account.hasBookmarkFor(mConversation.getJid().toBareJid())) {
277			menuItemSaveBookmark.setVisible(false);
278			menuItemDeleteBookmark.setVisible(true);
279		} else {
280			menuItemDeleteBookmark.setVisible(false);
281			menuItemSaveBookmark.setVisible(true);
282		}
283		menuItemChangeSubject.setVisible(mConversation.getMucOptions().canChangeSubject());
284		return true;
285	}
286
287	@Override
288	public boolean onCreateOptionsMenu(Menu menu) {
289		getMenuInflater().inflate(R.menu.muc_details, menu);
290		return true;
291	}
292
293	@Override
294	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
295		Object tag = v.getTag();
296		if (tag instanceof User) {
297			getMenuInflater().inflate(R.menu.muc_details_context,menu);
298			final User user = (User) tag;
299			final User self = mConversation.getMucOptions().getSelf();
300			this.mSelectedUser = user;
301			String name;
302			final Contact contact = user.getContact();
303			if (contact != null) {
304				name = contact.getDisplayName();
305			} else if (user.getJid() != null){
306				name = user.getJid().toBareJid().toString();
307			} else {
308				name = user.getName();
309			}
310			menu.setHeaderTitle(name);
311			if (user.getJid() != null) {
312				MenuItem showContactDetails = menu.findItem(R.id.action_contact_details);
313				MenuItem startConversation = menu.findItem(R.id.start_conversation);
314				MenuItem giveMembership = menu.findItem(R.id.give_membership);
315				MenuItem removeMembership = menu.findItem(R.id.remove_membership);
316				MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges);
317				MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges);
318				MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room);
319				MenuItem banFromConference = menu.findItem(R.id.ban_from_conference);
320				startConversation.setVisible(true);
321				if (contact != null) {
322					showContactDetails.setVisible(true);
323				}
324				if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) &&
325						self.getAffiliation().outranks(user.getAffiliation())) {
326					if (mAdvancedMode) {
327						if (user.getAffiliation() == MucOptions.Affiliation.NONE) {
328							giveMembership.setVisible(true);
329						} else {
330							removeMembership.setVisible(true);
331						}
332						banFromConference.setVisible(true);
333					} else {
334						removeFromRoom.setVisible(true);
335					}
336					if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) {
337						giveAdminPrivileges.setVisible(true);
338					} else {
339						removeAdminPrivileges.setVisible(true);
340					}
341				}
342			} else {
343				MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message);
344				sendPrivateMessage.setVisible(true);
345			}
346
347		}
348		super.onCreateContextMenu(menu, v, menuInfo);
349	}
350
351	@Override
352	public boolean onContextItemSelected(MenuItem item) {
353		switch (item.getItemId()) {
354			case R.id.action_contact_details:
355				Contact contact = mSelectedUser.getContact();
356				if (contact != null) {
357					switchToContactDetails(contact);
358				}
359				return true;
360			case R.id.start_conversation:
361				startConversation(mSelectedUser);
362				return true;
363			case R.id.give_admin_privileges:
364				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.ADMIN,this);
365				return true;
366			case R.id.give_membership:
367				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this);
368				return true;
369			case R.id.remove_membership:
370				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.NONE,this);
371				return true;
372			case R.id.remove_admin_privileges:
373				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this);
374				return true;
375			case R.id.remove_from_room:
376				removeFromRoom(mSelectedUser);
377				return true;
378			case R.id.ban_from_conference:
379				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.OUTCAST,this);
380				xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,this);
381				return true;
382			case R.id.send_private_message:
383				privateMsgInMuc(mConversation,mSelectedUser.getName());
384				return true;
385			default:
386				return super.onContextItemSelected(item);
387		}
388	}
389
390	private void removeFromRoom(final User user) {
391		if (mConversation.getMucOptions().membersOnly()) {
392			xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.NONE,this);
393			xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,ConferenceDetailsActivity.this);
394		} else {
395			AlertDialog.Builder builder = new AlertDialog.Builder(this);
396			builder.setTitle(R.string.ban_from_conference);
397			builder.setMessage(getString(R.string.removing_from_public_conference,user.getName()));
398			builder.setNegativeButton(R.string.cancel,null);
399			builder.setPositiveButton(R.string.ban_now,new DialogInterface.OnClickListener() {
400				@Override
401				public void onClick(DialogInterface dialog, int which) {
402					xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.OUTCAST,ConferenceDetailsActivity.this);
403					xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,ConferenceDetailsActivity.this);
404				}
405			});
406			builder.create().show();
407		}
408	}
409
410	protected void startConversation(User user) {
411		if (user.getJid() != null) {
412			Conversation conversation = xmppConnectionService.findOrCreateConversation(this.mConversation.getAccount(),user.getJid().toBareJid(),false);
413			switchToConversation(conversation);
414		}
415	}
416
417	protected void saveAsBookmark() {
418		Account account = mConversation.getAccount();
419		Bookmark bookmark = new Bookmark(account, mConversation.getJid().toBareJid());
420		if (!mConversation.getJid().isBareJid()) {
421			bookmark.setNick(mConversation.getJid().getResourcepart());
422		}
423		bookmark.setBookmarkName(mConversation.getMucOptions().getSubject());
424		bookmark.setAutojoin(true);
425		account.getBookmarks().add(bookmark);
426		xmppConnectionService.pushBookmarks(account);
427		mConversation.setBookmark(bookmark);
428	}
429
430	protected void deleteBookmark() {
431		Account account = mConversation.getAccount();
432		Bookmark bookmark = mConversation.getBookmark();
433		bookmark.unregisterConversation();
434		account.getBookmarks().remove(bookmark);
435		xmppConnectionService.pushBookmarks(account);
436	}
437
438	@Override
439	void onBackendConnected() {
440		if (mPendingConferenceInvite != null) {
441			mPendingConferenceInvite.execute(this);
442			mPendingConferenceInvite = null;
443		}
444		if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
445			this.uuid = getIntent().getExtras().getString("uuid");
446		}
447		if (uuid != null) {
448			this.mConversation = xmppConnectionService
449				.findConversationByUuid(uuid);
450			if (this.mConversation != null) {
451				updateView();
452			}
453		}
454	}
455
456	private void updateView() {
457		final MucOptions mucOptions = mConversation.getMucOptions();
458		final User self = mucOptions.getSelf();
459		String account;
460		if (Config.DOMAIN_LOCK != null) {
461			account = mConversation.getAccount().getJid().getLocalpart();
462		} else {
463			account = mConversation.getAccount().getJid().toBareJid().toString();
464		}
465		mAccountJid.setText(getString(R.string.using_account, account));
466		mYourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48)));
467		setTitle(mConversation.getName());
468		mFullJid.setText(mConversation.getJid().toBareJid().toString());
469		mYourNick.setText(mucOptions.getActualNick());
470		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
471		if (mucOptions.online()) {
472			mMoreDetails.setVisibility(View.VISIBLE);
473			final String status = getStatus(self);
474			if (status != null) {
475				mRoleAffiliaton.setVisibility(View.VISIBLE);
476				mRoleAffiliaton.setText(status);
477			} else {
478				mRoleAffiliaton.setVisibility(View.GONE);
479			}
480			if (mucOptions.membersOnly()) {
481				mConferenceType.setText(R.string.private_conference);
482			} else {
483				mConferenceType.setText(R.string.public_conference);
484			}
485			if (mucOptions.mamSupport()) {
486				mConferenceInfoMam.setText(R.string.server_info_available);
487			} else {
488				mConferenceInfoMam.setText(R.string.server_info_unavailable);
489			}
490			if (self.getAffiliation().ranks(MucOptions.Affiliation.OWNER)) {
491				mChangeConferenceSettingsButton.setVisibility(View.VISIBLE);
492			} else {
493				mChangeConferenceSettingsButton.setVisibility(View.GONE);
494			}
495		}
496		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
497		membersView.removeAllViews();
498		final ArrayList<User> users = mucOptions.getUsers();
499		Collections.sort(users,new Comparator<User>() {
500			@Override
501			public int compare(User lhs, User rhs) {
502				return lhs.getName().compareToIgnoreCase(rhs.getName());
503			}
504		});
505		for (final User user : users) {
506			View view = inflater.inflate(R.layout.contact, membersView,false);
507			this.setListItemBackgroundOnView(view);
508			view.setOnClickListener(new OnClickListener() {
509				@Override
510				public void onClick(View view) {
511					highlightInMuc(mConversation, user.getName());
512				}
513			});
514			registerForContextMenu(view);
515			view.setTag(user);
516			TextView tvDisplayName = (TextView) view.findViewById(R.id.contact_display_name);
517			TextView tvKey = (TextView) view.findViewById(R.id.key);
518			TextView tvStatus = (TextView) view.findViewById(R.id.contact_jid);
519			if (mAdvancedMode && user.getPgpKeyId() != 0) {
520				tvKey.setVisibility(View.VISIBLE);
521				tvKey.setOnClickListener(new OnClickListener() {
522
523					@Override
524					public void onClick(View v) {
525						viewPgpKey(user);
526					}
527				});
528				tvKey.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
529			}
530			Contact contact = user.getContact();
531			if (contact != null) {
532				tvDisplayName.setText(contact.getDisplayName());
533				tvStatus.setText(user.getName() + " \u2022 " + getStatus(user));
534			} else {
535				tvDisplayName.setText(user.getName());
536				tvStatus.setText(getStatus(user));
537
538			}
539			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
540			iv.setImageBitmap(avatarService().get(user, getPixel(48), false));
541			membersView.addView(view);
542			if (mConversation.getMucOptions().canInvite()) {
543				mInviteButton.setVisibility(View.VISIBLE);
544			} else {
545				mInviteButton.setVisibility(View.GONE);
546			}
547		}
548	}
549
550	private String getStatus(User user) {
551		if (mAdvancedMode) {
552			StringBuilder builder = new StringBuilder();
553			builder.append(getString(user.getAffiliation().getResId()));
554			builder.append(" (");
555			builder.append(getString(user.getRole().getResId()));
556			builder.append(')');
557			return builder.toString();
558		} else {
559			return getString(user.getAffiliation().getResId());
560		}
561	}
562
563	@SuppressWarnings("deprecation")
564	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
565	private void setListItemBackgroundOnView(View view) {
566		int sdk = android.os.Build.VERSION.SDK_INT;
567		if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
568			view.setBackgroundDrawable(getResources().getDrawable(R.drawable.greybackground));
569		} else {
570			view.setBackground(getResources().getDrawable(R.drawable.greybackground));
571		}
572	}
573
574	private void viewPgpKey(User user) {
575		PgpEngine pgp = xmppConnectionService.getPgpEngine();
576		if (pgp != null) {
577			PendingIntent intent = pgp.getIntentForKey(
578					mConversation.getAccount(), user.getPgpKeyId());
579			if (intent != null) {
580				try {
581					startIntentSenderForResult(intent.getIntentSender(), 0,
582							null, 0, 0, 0);
583				} catch (SendIntentException ignored) {
584
585				}
586			}
587		}
588	}
589
590	@Override
591	public void onAffiliationChangedSuccessful(Jid jid) {
592
593	}
594
595	@Override
596	public void onAffiliationChangeFailed(Jid jid, int resId) {
597		displayToast(getString(resId,jid.toBareJid().toString()));
598	}
599
600	@Override
601	public void onRoleChangedSuccessful(String nick) {
602
603	}
604
605	@Override
606	public void onRoleChangeFailed(String nick, int resId) {
607		displayToast(getString(resId,nick));
608	}
609
610	@Override
611	public void onPushSucceeded() {
612		displayToast(getString(R.string.modified_conference_options));
613	}
614
615	@Override
616	public void onPushFailed() {
617		displayToast(getString(R.string.could_not_modify_conference_options));
618	}
619
620	private void displayToast(final String msg) {
621		runOnUiThread(new Runnable() {
622			@Override
623			public void run() {
624				Toast.makeText(ConferenceDetailsActivity.this,msg,Toast.LENGTH_SHORT).show();
625			}
626		});
627	}
628}