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		menuItemAdvancedMode.setChecked(mAdvancedMode);
271		if (mConversation == null) {
272			return true;
273		}
274		Account account = mConversation.getAccount();
275		if (account.hasBookmarkFor(mConversation.getJid().toBareJid())) {
276			menuItemSaveBookmark.setVisible(false);
277			menuItemDeleteBookmark.setVisible(true);
278		} else {
279			menuItemDeleteBookmark.setVisible(false);
280			menuItemSaveBookmark.setVisible(true);
281		}
282		return true;
283	}
284
285	@Override
286	public boolean onCreateOptionsMenu(Menu menu) {
287		getMenuInflater().inflate(R.menu.muc_details, menu);
288		return true;
289	}
290
291	@Override
292	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
293		Object tag = v.getTag();
294		if (tag instanceof User) {
295			getMenuInflater().inflate(R.menu.muc_details_context,menu);
296			final User user = (User) tag;
297			final User self = mConversation.getMucOptions().getSelf();
298			this.mSelectedUser = user;
299			String name;
300			final Contact contact = user.getContact();
301			if (contact != null) {
302				name = contact.getDisplayName();
303			} else if (user.getJid() != null){
304				name = user.getJid().toBareJid().toString();
305			} else {
306				name = user.getName();
307			}
308			menu.setHeaderTitle(name);
309			if (user.getJid() != null) {
310				MenuItem showContactDetails = menu.findItem(R.id.action_contact_details);
311				MenuItem startConversation = menu.findItem(R.id.start_conversation);
312				MenuItem giveMembership = menu.findItem(R.id.give_membership);
313				MenuItem removeMembership = menu.findItem(R.id.remove_membership);
314				MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges);
315				MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges);
316				MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room);
317				MenuItem banFromConference = menu.findItem(R.id.ban_from_conference);
318				startConversation.setVisible(true);
319				if (contact != null) {
320					showContactDetails.setVisible(true);
321				}
322				if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) &&
323						self.getAffiliation().outranks(user.getAffiliation())) {
324					if (mAdvancedMode) {
325						if (user.getAffiliation() == MucOptions.Affiliation.NONE) {
326							giveMembership.setVisible(true);
327						} else {
328							removeMembership.setVisible(true);
329						}
330						banFromConference.setVisible(true);
331					} else {
332						removeFromRoom.setVisible(true);
333					}
334					if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) {
335						giveAdminPrivileges.setVisible(true);
336					} else {
337						removeAdminPrivileges.setVisible(true);
338					}
339				}
340			} else {
341				MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message);
342				sendPrivateMessage.setVisible(true);
343			}
344
345		}
346		super.onCreateContextMenu(menu, v, menuInfo);
347	}
348
349	@Override
350	public boolean onContextItemSelected(MenuItem item) {
351		switch (item.getItemId()) {
352			case R.id.action_contact_details:
353				Contact contact = mSelectedUser.getContact();
354				if (contact != null) {
355					switchToContactDetails(contact);
356				}
357				return true;
358			case R.id.start_conversation:
359				startConversation(mSelectedUser);
360				return true;
361			case R.id.give_admin_privileges:
362				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.ADMIN,this);
363				return true;
364			case R.id.give_membership:
365				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this);
366				return true;
367			case R.id.remove_membership:
368				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.NONE,this);
369				return true;
370			case R.id.remove_admin_privileges:
371				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this);
372				return true;
373			case R.id.remove_from_room:
374				removeFromRoom(mSelectedUser);
375				return true;
376			case R.id.ban_from_conference:
377				xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.OUTCAST,this);
378				xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,this);
379				return true;
380			case R.id.send_private_message:
381				privateMsgInMuc(mConversation,mSelectedUser.getName());
382				return true;
383			default:
384				return super.onContextItemSelected(item);
385		}
386	}
387
388	private void removeFromRoom(final User user) {
389		if (mConversation.getMucOptions().membersOnly()) {
390			xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.NONE,this);
391			xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,ConferenceDetailsActivity.this);
392		} else {
393			AlertDialog.Builder builder = new AlertDialog.Builder(this);
394			builder.setTitle(R.string.ban_from_conference);
395			builder.setMessage(getString(R.string.removing_from_public_conference,user.getName()));
396			builder.setNegativeButton(R.string.cancel,null);
397			builder.setPositiveButton(R.string.ban_now,new DialogInterface.OnClickListener() {
398				@Override
399				public void onClick(DialogInterface dialog, int which) {
400					xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.OUTCAST,ConferenceDetailsActivity.this);
401					xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,ConferenceDetailsActivity.this);
402				}
403			});
404			builder.create().show();
405		}
406	}
407
408	protected void startConversation(User user) {
409		if (user.getJid() != null) {
410			Conversation conversation = xmppConnectionService.findOrCreateConversation(this.mConversation.getAccount(),user.getJid().toBareJid(),false);
411			switchToConversation(conversation);
412		}
413	}
414
415	protected void saveAsBookmark() {
416		Account account = mConversation.getAccount();
417		Bookmark bookmark = new Bookmark(account, mConversation.getJid().toBareJid());
418		if (!mConversation.getJid().isBareJid()) {
419			bookmark.setNick(mConversation.getJid().getResourcepart());
420		}
421		bookmark.setAutojoin(true);
422		account.getBookmarks().add(bookmark);
423		xmppConnectionService.pushBookmarks(account);
424		mConversation.setBookmark(bookmark);
425	}
426
427	protected void deleteBookmark() {
428		Account account = mConversation.getAccount();
429		Bookmark bookmark = mConversation.getBookmark();
430		bookmark.unregisterConversation();
431		account.getBookmarks().remove(bookmark);
432		xmppConnectionService.pushBookmarks(account);
433	}
434
435	@Override
436	void onBackendConnected() {
437		if (mPendingConferenceInvite != null) {
438			mPendingConferenceInvite.execute(this);
439			mPendingConferenceInvite = null;
440		}
441		if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
442			this.uuid = getIntent().getExtras().getString("uuid");
443		}
444		if (uuid != null) {
445			this.mConversation = xmppConnectionService
446				.findConversationByUuid(uuid);
447			if (this.mConversation != null) {
448				updateView();
449			}
450		}
451	}
452
453	private void updateView() {
454		final MucOptions mucOptions = mConversation.getMucOptions();
455		final User self = mucOptions.getSelf();
456		String account;
457		if (Config.DOMAIN_LOCK != null) {
458			account = mConversation.getAccount().getJid().getLocalpart();
459		} else {
460			account = mConversation.getAccount().getJid().toBareJid().toString();
461		}
462		mAccountJid.setText(getString(R.string.using_account, account));
463		mYourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48)));
464		setTitle(mConversation.getName());
465		mFullJid.setText(mConversation.getJid().toBareJid().toString());
466		mYourNick.setText(mucOptions.getActualNick());
467		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
468		if (mucOptions.online()) {
469			mMoreDetails.setVisibility(View.VISIBLE);
470			final String status = getStatus(self);
471			if (status != null) {
472				mRoleAffiliaton.setVisibility(View.VISIBLE);
473				mRoleAffiliaton.setText(status);
474			} else {
475				mRoleAffiliaton.setVisibility(View.GONE);
476			}
477			if (mucOptions.membersOnly()) {
478				mConferenceType.setText(R.string.private_conference);
479			} else {
480				mConferenceType.setText(R.string.public_conference);
481			}
482			if (mucOptions.mamSupport()) {
483				mConferenceInfoMam.setText(R.string.server_info_available);
484			} else {
485				mConferenceInfoMam.setText(R.string.server_info_unavailable);
486			}
487			if (self.getAffiliation().ranks(MucOptions.Affiliation.OWNER)) {
488				mChangeConferenceSettingsButton.setVisibility(View.VISIBLE);
489			} else {
490				mChangeConferenceSettingsButton.setVisibility(View.GONE);
491			}
492		}
493		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
494		membersView.removeAllViews();
495		final ArrayList<User> users = new ArrayList<>();
496		users.addAll(mConversation.getMucOptions().getUsers());
497		Collections.sort(users,new Comparator<User>() {
498			@Override
499			public int compare(User lhs, User rhs) {
500				return lhs.getName().compareToIgnoreCase(rhs.getName());
501			}
502		});
503		for (final User user : users) {
504			View view = inflater.inflate(R.layout.contact, membersView,false);
505			this.setListItemBackgroundOnView(view);
506			view.setOnClickListener(new OnClickListener() {
507				@Override
508				public void onClick(View view) {
509					highlightInMuc(mConversation, user.getName());
510				}
511			});
512			registerForContextMenu(view);
513			view.setTag(user);
514			TextView tvDisplayName = (TextView) view.findViewById(R.id.contact_display_name);
515			TextView tvKey = (TextView) view.findViewById(R.id.key);
516			TextView tvStatus = (TextView) view.findViewById(R.id.contact_jid);
517			if (mAdvancedMode && user.getPgpKeyId() != 0) {
518				tvKey.setVisibility(View.VISIBLE);
519				tvKey.setOnClickListener(new OnClickListener() {
520
521					@Override
522					public void onClick(View v) {
523						viewPgpKey(user);
524					}
525				});
526				tvKey.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
527			}
528			Bitmap bm;
529			Contact contact = user.getContact();
530			if (contact != null) {
531				bm = avatarService().get(contact, getPixel(48));
532				tvDisplayName.setText(contact.getDisplayName());
533				tvStatus.setText(user.getName() + " \u2022 " + getStatus(user));
534			} else {
535				bm = avatarService().get(user.getName(), getPixel(48));
536				tvDisplayName.setText(user.getName());
537				tvStatus.setText(getStatus(user));
538
539			}
540			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
541			iv.setImageBitmap(bm);
542			membersView.addView(view);
543			if (mConversation.getMucOptions().canInvite()) {
544				mInviteButton.setVisibility(View.VISIBLE);
545			} else {
546				mInviteButton.setVisibility(View.GONE);
547			}
548		}
549	}
550
551	private String getStatus(User user) {
552		if (mAdvancedMode) {
553			StringBuilder builder = new StringBuilder();
554			builder.append(getString(user.getAffiliation().getResId()));
555			builder.append(" (");
556			builder.append(getString(user.getRole().getResId()));
557			builder.append(')');
558			return builder.toString();
559		} else {
560			return getString(user.getAffiliation().getResId());
561		}
562	}
563
564	@SuppressWarnings("deprecation")
565	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
566	private void setListItemBackgroundOnView(View view) {
567		int sdk = android.os.Build.VERSION.SDK_INT;
568		if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
569			view.setBackgroundDrawable(getResources().getDrawable(R.drawable.greybackground));
570		} else {
571			view.setBackground(getResources().getDrawable(R.drawable.greybackground));
572		}
573	}
574
575	private void viewPgpKey(User user) {
576		PgpEngine pgp = xmppConnectionService.getPgpEngine();
577		if (pgp != null) {
578			PendingIntent intent = pgp.getIntentForKey(
579					mConversation.getAccount(), user.getPgpKeyId());
580			if (intent != null) {
581				try {
582					startIntentSenderForResult(intent.getIntentSender(), 0,
583							null, 0, 0, 0);
584				} catch (SendIntentException ignored) {
585
586				}
587			}
588		}
589	}
590
591	@Override
592	public void onAffiliationChangedSuccessful(Jid jid) {
593
594	}
595
596	@Override
597	public void onAffiliationChangeFailed(Jid jid, int resId) {
598		displayToast(getString(resId,jid.toBareJid().toString()));
599	}
600
601	@Override
602	public void onRoleChangedSuccessful(String nick) {
603
604	}
605
606	@Override
607	public void onRoleChangeFailed(String nick, int resId) {
608		displayToast(getString(resId,nick));
609	}
610
611	@Override
612	public void onPushSucceeded() {
613		displayToast(getString(R.string.modified_conference_options));
614	}
615
616	@Override
617	public void onPushFailed() {
618		displayToast(getString(R.string.could_not_modify_conference_options));
619	}
620
621	private void displayToast(final String msg) {
622		runOnUiThread(new Runnable() {
623			@Override
624			public void run() {
625				Toast.makeText(ConferenceDetailsActivity.this,msg,Toast.LENGTH_SHORT).show();
626			}
627		});
628	}
629}