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.setAutojoin(true);
424		account.getBookmarks().add(bookmark);
425		xmppConnectionService.pushBookmarks(account);
426		mConversation.setBookmark(bookmark);
427	}
428
429	protected void deleteBookmark() {
430		Account account = mConversation.getAccount();
431		Bookmark bookmark = mConversation.getBookmark();
432		bookmark.unregisterConversation();
433		account.getBookmarks().remove(bookmark);
434		xmppConnectionService.pushBookmarks(account);
435	}
436
437	@Override
438	void onBackendConnected() {
439		if (mPendingConferenceInvite != null) {
440			mPendingConferenceInvite.execute(this);
441			mPendingConferenceInvite = null;
442		}
443		if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
444			this.uuid = getIntent().getExtras().getString("uuid");
445		}
446		if (uuid != null) {
447			this.mConversation = xmppConnectionService
448				.findConversationByUuid(uuid);
449			if (this.mConversation != null) {
450				updateView();
451			}
452		}
453	}
454
455	private void updateView() {
456		final MucOptions mucOptions = mConversation.getMucOptions();
457		final User self = mucOptions.getSelf();
458		String account;
459		if (Config.DOMAIN_LOCK != null) {
460			account = mConversation.getAccount().getJid().getLocalpart();
461		} else {
462			account = mConversation.getAccount().getJid().toBareJid().toString();
463		}
464		mAccountJid.setText(getString(R.string.using_account, account));
465		mYourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48)));
466		setTitle(mConversation.getName());
467		mFullJid.setText(mConversation.getJid().toBareJid().toString());
468		mYourNick.setText(mucOptions.getActualNick());
469		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
470		if (mucOptions.online()) {
471			mMoreDetails.setVisibility(View.VISIBLE);
472			final String status = getStatus(self);
473			if (status != null) {
474				mRoleAffiliaton.setVisibility(View.VISIBLE);
475				mRoleAffiliaton.setText(status);
476			} else {
477				mRoleAffiliaton.setVisibility(View.GONE);
478			}
479			if (mucOptions.membersOnly()) {
480				mConferenceType.setText(R.string.private_conference);
481			} else {
482				mConferenceType.setText(R.string.public_conference);
483			}
484			if (mucOptions.mamSupport()) {
485				mConferenceInfoMam.setText(R.string.server_info_available);
486			} else {
487				mConferenceInfoMam.setText(R.string.server_info_unavailable);
488			}
489			if (self.getAffiliation().ranks(MucOptions.Affiliation.OWNER)) {
490				mChangeConferenceSettingsButton.setVisibility(View.VISIBLE);
491			} else {
492				mChangeConferenceSettingsButton.setVisibility(View.GONE);
493			}
494		}
495		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
496		membersView.removeAllViews();
497		final ArrayList<User> users = new ArrayList<>();
498		users.addAll(mConversation.getMucOptions().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			Bitmap bm;
531			Contact contact = user.getContact();
532			if (contact != null) {
533				bm = avatarService().get(contact, getPixel(48));
534				tvDisplayName.setText(contact.getDisplayName());
535				tvStatus.setText(user.getName() + " \u2022 " + getStatus(user));
536			} else {
537				bm = avatarService().get(user.getName(), getPixel(48));
538				tvDisplayName.setText(user.getName());
539				tvStatus.setText(getStatus(user));
540
541			}
542			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
543			iv.setImageBitmap(bm);
544			membersView.addView(view);
545			if (mConversation.getMucOptions().canInvite()) {
546				mInviteButton.setVisibility(View.VISIBLE);
547			} else {
548				mInviteButton.setVisibility(View.GONE);
549			}
550		}
551	}
552
553	private String getStatus(User user) {
554		if (mAdvancedMode) {
555			StringBuilder builder = new StringBuilder();
556			builder.append(getString(user.getAffiliation().getResId()));
557			builder.append(" (");
558			builder.append(getString(user.getRole().getResId()));
559			builder.append(')');
560			return builder.toString();
561		} else {
562			return getString(user.getAffiliation().getResId());
563		}
564	}
565
566	@SuppressWarnings("deprecation")
567	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
568	private void setListItemBackgroundOnView(View view) {
569		int sdk = android.os.Build.VERSION.SDK_INT;
570		if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
571			view.setBackgroundDrawable(getResources().getDrawable(R.drawable.greybackground));
572		} else {
573			view.setBackground(getResources().getDrawable(R.drawable.greybackground));
574		}
575	}
576
577	private void viewPgpKey(User user) {
578		PgpEngine pgp = xmppConnectionService.getPgpEngine();
579		if (pgp != null) {
580			PendingIntent intent = pgp.getIntentForKey(
581					mConversation.getAccount(), user.getPgpKeyId());
582			if (intent != null) {
583				try {
584					startIntentSenderForResult(intent.getIntentSender(), 0,
585							null, 0, 0, 0);
586				} catch (SendIntentException ignored) {
587
588				}
589			}
590		}
591	}
592
593	@Override
594	public void onAffiliationChangedSuccessful(Jid jid) {
595
596	}
597
598	@Override
599	public void onAffiliationChangeFailed(Jid jid, int resId) {
600		displayToast(getString(resId,jid.toBareJid().toString()));
601	}
602
603	@Override
604	public void onRoleChangedSuccessful(String nick) {
605
606	}
607
608	@Override
609	public void onRoleChangeFailed(String nick, int resId) {
610		displayToast(getString(resId,nick));
611	}
612
613	@Override
614	public void onPushSucceeded() {
615		displayToast(getString(R.string.modified_conference_options));
616	}
617
618	@Override
619	public void onPushFailed() {
620		displayToast(getString(R.string.could_not_modify_conference_options));
621	}
622
623	private void displayToast(final String msg) {
624		runOnUiThread(new Runnable() {
625			@Override
626			public void run() {
627				Toast.makeText(ConferenceDetailsActivity.this,msg,Toast.LENGTH_SHORT).show();
628			}
629		});
630	}
631}