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.Account;
 11import eu.siacs.conversations.entities.Contact;
 12import eu.siacs.conversations.entities.Conversation;
 13import eu.siacs.conversations.entities.MucOptions;
 14import eu.siacs.conversations.entities.MucOptions.OnRenameListener;
 15import eu.siacs.conversations.entities.MucOptions.User;
 16import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
 17import eu.siacs.conversations.utils.UIHelper;
 18import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 19import android.app.PendingIntent;
 20import android.content.Context;
 21import android.content.IntentSender.SendIntentException;
 22import android.graphics.Bitmap;
 23import android.os.Bundle;
 24import android.view.LayoutInflater;
 25import android.view.Menu;
 26import android.view.MenuItem;
 27import android.view.View;
 28import android.view.View.OnClickListener;
 29import android.widget.Button;
 30import android.widget.ImageButton;
 31import android.widget.ImageView;
 32import android.widget.LinearLayout;
 33import android.widget.TextView;
 34import android.widget.Toast;
 35
 36public class ConferenceDetailsActivity extends XmppActivity {
 37	public static final String ACTION_VIEW_MUC = "view_muc";
 38	private Conversation conversation;
 39	private TextView mYourNick;
 40	private ImageView mYourPhoto;
 41	private ImageButton mEditNickButton;
 42	private TextView mRoleAffiliaton;
 43	private TextView mFullJid;
 44	private LinearLayout membersView;
 45	private LinearLayout mMoreDetails;
 46	private Button mInviteButton;
 47	private String uuid = null;
 48
 49	private OnClickListener inviteListener = new OnClickListener() {
 50
 51		@Override
 52		public void onClick(View v) {
 53			inviteToConversation(conversation);
 54		}
 55	};
 56
 57	private List<User> users = new ArrayList<MucOptions.User>();
 58	private OnConversationUpdate onConvChanged = new OnConversationUpdate() {
 59
 60		@Override
 61		public void onConversationUpdate() {
 62			runOnUiThread(new Runnable() {
 63
 64				@Override
 65				public void run() {
 66					populateView();
 67				}
 68			});
 69		}
 70	};
 71
 72	@Override
 73	protected void onCreate(Bundle savedInstanceState) {
 74		super.onCreate(savedInstanceState);
 75		setContentView(R.layout.activity_muc_details);
 76		mYourNick = (TextView) findViewById(R.id.muc_your_nick);
 77		mYourPhoto = (ImageView) findViewById(R.id.your_photo);
 78		mEditNickButton = (ImageButton) findViewById(R.id.edit_nick_button);
 79		mFullJid = (TextView) findViewById(R.id.muc_jabberid);
 80		membersView = (LinearLayout) findViewById(R.id.muc_members);
 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	public boolean onCreateOptionsMenu(Menu menu) {
144		getMenuInflater().inflate(R.menu.muc_details, menu);
145		return true;
146	}
147
148	@Override
149	void onBackendConnected() {
150		registerListener();
151		if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
152			this.uuid = getIntent().getExtras().getString("uuid");
153		}
154		if (uuid != null) {
155			this.conversation = xmppConnectionService
156					.findConversationByUuid(uuid);
157			if (this.conversation != null) {
158				populateView();
159			}
160		}
161	}
162
163	@Override
164	protected void onStop() {
165		if (xmppConnectionServiceBound) {
166			xmppConnectionService.removeOnConversationListChangedListener();
167		}
168		super.onStop();
169	}
170
171	protected void registerListener() {
172		if (xmppConnectionServiceBound) {
173			xmppConnectionService
174					.setOnConversationListChangedListener(this.onConvChanged);
175			xmppConnectionService.setOnRenameListener(new OnRenameListener() {
176
177				@Override
178				public void onRename(final boolean success) {
179					runOnUiThread(new Runnable() {
180
181						@Override
182						public void run() {
183							populateView();
184							if (success) {
185								Toast.makeText(
186										ConferenceDetailsActivity.this,
187										getString(R.string.your_nick_has_been_changed),
188										Toast.LENGTH_SHORT).show();
189							} else {
190								Toast.makeText(ConferenceDetailsActivity.this,
191										getString(R.string.nick_in_use),
192										Toast.LENGTH_SHORT).show();
193							}
194						}
195					});
196				}
197			});
198		}
199	}
200
201	private void populateView() {
202		mYourPhoto.setImageBitmap(conversation.getAccount().getImage(this, 48));
203		setTitle(conversation.getName());
204		mFullJid.setText(conversation.getContactJid().split("/",2)[0]);
205		mYourNick.setText(conversation.getMucOptions().getActualNick());
206		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
207		if (conversation.getMucOptions().online()) {
208			mMoreDetails.setVisibility(View.VISIBLE);
209			User self = conversation.getMucOptions().getSelf();
210			switch (self.getAffiliation()) {
211			case User.AFFILIATION_ADMIN:
212				mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
213						+ getString(R.string.admin) + ")");
214				break;
215			case User.AFFILIATION_OWNER:
216				mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
217						+ getString(R.string.owner) + ")");
218				break;
219			default:
220				mRoleAffiliaton.setText(getReadableRole(self.getRole()));
221				break;
222			}
223		}
224		this.users.clear();
225		this.users.addAll(conversation.getMucOptions().getUsers());
226		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
227		membersView.removeAllViews();
228		Account account = conversation.getAccount();
229		for (final User user : conversation.getMucOptions().getUsers()) {
230			View view = (View) inflater.inflate(R.layout.contact, membersView,
231					false);
232			TextView name = (TextView) view
233					.findViewById(R.id.contact_display_name);
234			TextView key = (TextView) view.findViewById(R.id.key);
235			TextView role = (TextView) view.findViewById(R.id.contact_jid);
236			if (user.getPgpKeyId() != 0) {
237				key.setVisibility(View.VISIBLE);
238				key.setOnClickListener(new OnClickListener() {
239
240					@Override
241					public void onClick(View v) {
242						viewPgpKey(user);
243					}
244				});
245				key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
246			}
247			Bitmap bm;
248			if (user.getJid() != null) {
249				Contact contact = account.getRoster().getContact(user.getJid());
250				if (contact.showInRoster()) {
251					bm = contact.getImage(48, this);
252					name.setText(contact.getDisplayName());
253					role.setText(user.getName() + " \u2022 "
254							+ getReadableRole(user.getRole()));
255				} else {
256					bm = UIHelper.getContactPicture(user.getName(), 48, this,
257							false);
258					name.setText(user.getName());
259					role.setText(getReadableRole(user.getRole()));
260				}
261			} else {
262				bm = UIHelper
263						.getContactPicture(user.getName(), 48, this, false);
264				name.setText(user.getName());
265				role.setText(getReadableRole(user.getRole()));
266			}
267			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
268			iv.setImageBitmap(bm);
269			membersView.addView(view);
270		}
271	}
272
273	private void viewPgpKey(User user) {
274		PgpEngine pgp = xmppConnectionService.getPgpEngine();
275		if (pgp != null) {
276			PendingIntent intent = pgp.getIntentForKey(
277					conversation.getAccount(), user.getPgpKeyId());
278			if (intent != null) {
279				try {
280					startIntentSenderForResult(intent.getIntentSender(), 0,
281							null, 0, 0, 0);
282				} catch (SendIntentException e) {
283
284				}
285			}
286		}
287	}
288}