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