ConferenceDetailsActivity.java

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