ConferenceDetailsActivity.java

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