ConferenceDetailsActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import java.util.ArrayList;
  4import java.util.List;
  5
  6import org.openintents.openpgp.util.OpenPgpUtils;
  7
  8import eu.siacs.conversations.R;
  9import eu.siacs.conversations.crypto.PgpEngine;
 10import eu.siacs.conversations.entities.Contact;
 11import eu.siacs.conversations.entities.Conversation;
 12import eu.siacs.conversations.entities.MucOptions;
 13import eu.siacs.conversations.entities.MucOptions.OnRenameListener;
 14import eu.siacs.conversations.entities.MucOptions.User;
 15import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
 16import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 17import android.app.PendingIntent;
 18import android.content.Context;
 19import android.content.IntentSender.SendIntentException;
 20import android.graphics.Bitmap;
 21import android.os.Bundle;
 22import android.view.LayoutInflater;
 23import android.view.Menu;
 24import android.view.MenuItem;
 25import android.view.View;
 26import android.view.View.OnClickListener;
 27import android.widget.Button;
 28import android.widget.ImageButton;
 29import android.widget.ImageView;
 30import android.widget.LinearLayout;
 31import android.widget.TextView;
 32import android.widget.Toast;
 33
 34public class ConferenceDetailsActivity extends XmppActivity {
 35	public static final String ACTION_VIEW_MUC = "view_muc";
 36	private Conversation conversation;
 37	private TextView mYourNick;
 38	private ImageView mYourPhoto;
 39	private ImageButton mEditNickButton;
 40	private TextView mRoleAffiliaton;
 41	private TextView mFullJid;
 42	private TextView mAccountJid;
 43	private LinearLayout membersView;
 44	private LinearLayout mMoreDetails;
 45	private Button mInviteButton;
 46	private String uuid = null;
 47
 48	private OnClickListener inviteListener = new OnClickListener() {
 49
 50		@Override
 51		public void onClick(View v) {
 52			inviteToConversation(conversation);
 53		}
 54	};
 55
 56	private List<User> users = new ArrayList<MucOptions.User>();
 57	private OnConversationUpdate onConvChanged = new OnConversationUpdate() {
 58
 59		@Override
 60		public void onConversationUpdate() {
 61			runOnUiThread(new Runnable() {
 62
 63				@Override
 64				public void run() {
 65					populateView();
 66				}
 67			});
 68		}
 69	};
 70
 71	@Override
 72	protected void onCreate(Bundle savedInstanceState) {
 73		super.onCreate(savedInstanceState);
 74		setContentView(R.layout.activity_muc_details);
 75		mYourNick = (TextView) findViewById(R.id.muc_your_nick);
 76		mYourPhoto = (ImageView) findViewById(R.id.your_photo);
 77		mEditNickButton = (ImageButton) findViewById(R.id.edit_nick_button);
 78		mFullJid = (TextView) findViewById(R.id.muc_jabberid);
 79		membersView = (LinearLayout) findViewById(R.id.muc_members);
 80		mAccountJid = (TextView) findViewById(R.id.details_account);
 81		mMoreDetails = (LinearLayout) findViewById(R.id.muc_more_details);
 82		mMoreDetails.setVisibility(View.GONE);
 83		mInviteButton = (Button) findViewById(R.id.invite);
 84		mInviteButton.setOnClickListener(inviteListener);
 85		getActionBar().setHomeButtonEnabled(true);
 86		getActionBar().setDisplayHomeAsUpEnabled(true);
 87		mEditNickButton.setOnClickListener(new OnClickListener() {
 88
 89			@Override
 90			public void onClick(View v) {
 91				quickEdit(conversation.getMucOptions().getActualNick(),
 92						new OnValueEdited() {
 93
 94							@Override
 95							public void onValueEdited(String value) {
 96								xmppConnectionService.renameInMuc(conversation,
 97										value);
 98							}
 99						});
100			}
101		});
102	}
103
104	@Override
105	public boolean onOptionsItemSelected(MenuItem menuItem) {
106		switch (menuItem.getItemId()) {
107		case android.R.id.home:
108			finish();
109			break;
110		case R.id.action_edit_subject:
111			if (conversation != null) {
112				quickEdit(conversation.getName(), new OnValueEdited() {
113
114					@Override
115					public void onValueEdited(String value) {
116						MessagePacket packet = xmppConnectionService
117								.getMessageGenerator().conferenceSubject(
118										conversation, value);
119						xmppConnectionService.sendMessagePacket(
120								conversation.getAccount(), packet);
121					}
122				});
123			}
124			break;
125		}
126		return super.onOptionsItemSelected(menuItem);
127	}
128
129	public String getReadableRole(int role) {
130		switch (role) {
131		case User.ROLE_MODERATOR:
132			return getString(R.string.moderator);
133		case User.ROLE_PARTICIPANT:
134			return getString(R.string.participant);
135		case User.ROLE_VISITOR:
136			return getString(R.string.visitor);
137		default:
138			return "";
139		}
140	}
141
142	@Override
143	protected String getShareableUri() {
144		if (conversation!=null) {
145			return "xmpp:"+conversation.getContactJid().split("/")[0]+"?join";
146		} else {
147			return "";
148		}
149	}
150
151	@Override
152	public boolean onCreateOptionsMenu(Menu menu) {
153		getMenuInflater().inflate(R.menu.muc_details, menu);
154		return true;
155	}
156
157	@Override
158	void onBackendConnected() {
159		registerListener();
160		if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
161			this.uuid = getIntent().getExtras().getString("uuid");
162		}
163		if (uuid != null) {
164			this.conversation = xmppConnectionService
165					.findConversationByUuid(uuid);
166			if (this.conversation != null) {
167				populateView();
168			}
169		}
170	}
171
172	@Override
173	protected void onStop() {
174		if (xmppConnectionServiceBound) {
175			xmppConnectionService.removeOnConversationListChangedListener();
176		}
177		super.onStop();
178	}
179
180	protected void registerListener() {
181		xmppConnectionService
182				.setOnConversationListChangedListener(this.onConvChanged);
183		xmppConnectionService.setOnRenameListener(new OnRenameListener() {
184
185			@Override
186			public void onRename(final boolean success) {
187				runOnUiThread(new Runnable() {
188
189					@Override
190					public void run() {
191						populateView();
192						if (success) {
193							Toast.makeText(
194									ConferenceDetailsActivity.this,
195									getString(R.string.your_nick_has_been_changed),
196									Toast.LENGTH_SHORT).show();
197						} else {
198							Toast.makeText(ConferenceDetailsActivity.this,
199									getString(R.string.nick_in_use),
200									Toast.LENGTH_SHORT).show();
201						}
202					}
203				});
204			}
205		});
206	}
207
208	private void populateView() {
209		mAccountJid.setText(getString(R.string.using_account, conversation
210				.getAccount().getJid()));
211		mYourPhoto.setImageBitmap(avatarService().get(
212				conversation.getAccount(), getPixel(48)));
213		setTitle(conversation.getName());
214		mFullJid.setText(conversation.getContactJid().split("/", 2)[0]);
215		mYourNick.setText(conversation.getMucOptions().getActualNick());
216		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
217		if (conversation.getMucOptions().online()) {
218			mMoreDetails.setVisibility(View.VISIBLE);
219			User self = conversation.getMucOptions().getSelf();
220			switch (self.getAffiliation()) {
221			case User.AFFILIATION_ADMIN:
222				mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
223						+ getString(R.string.admin) + ")");
224				break;
225			case User.AFFILIATION_OWNER:
226				mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
227						+ getString(R.string.owner) + ")");
228				break;
229			default:
230				mRoleAffiliaton.setText(getReadableRole(self.getRole()));
231				break;
232			}
233		}
234		this.users.clear();
235		this.users.addAll(conversation.getMucOptions().getUsers());
236		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
237		membersView.removeAllViews();
238		for (final User user : conversation.getMucOptions().getUsers()) {
239			View view = inflater.inflate(R.layout.contact, membersView,
240					false);
241			TextView name = (TextView) view
242					.findViewById(R.id.contact_display_name);
243			TextView key = (TextView) view.findViewById(R.id.key);
244			TextView role = (TextView) view.findViewById(R.id.contact_jid);
245			if (user.getPgpKeyId() != 0) {
246				key.setVisibility(View.VISIBLE);
247				key.setOnClickListener(new OnClickListener() {
248
249					@Override
250					public void onClick(View v) {
251						viewPgpKey(user);
252					}
253				});
254				key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
255			}
256			Bitmap bm;
257			Contact contact = user.getContact();
258			if (contact != null) {
259				bm = avatarService().get(contact, getPixel(48));
260				name.setText(contact.getDisplayName());
261				role.setText(user.getName() + " \u2022 "
262						+ getReadableRole(user.getRole()));
263			} else {
264				bm = avatarService().get(user.getName(), getPixel(48));
265				name.setText(user.getName());
266				role.setText(getReadableRole(user.getRole()));
267			}
268			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
269			iv.setImageBitmap(bm);
270			membersView.addView(view);
271		}
272	}
273
274	private void viewPgpKey(User user) {
275		PgpEngine pgp = xmppConnectionService.getPgpEngine();
276		if (pgp != null) {
277			PendingIntent intent = pgp.getIntentForKey(
278					conversation.getAccount(), user.getPgpKeyId());
279			if (intent != null) {
280				try {
281					startIntentSenderForResult(intent.getIntentSender(), 0,
282							null, 0, 0, 0);
283				} catch (SendIntentException e) {
284
285				}
286			}
287		}
288	}
289}