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 implements OnConversationUpdate, OnRenameListener {
 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	@Override
 57	public void onRename(final boolean success) {
 58		runOnUiThread(new Runnable() {
 59
 60			@Override
 61			public void run() {
 62				populateView();
 63				if (success) {
 64					Toast.makeText(
 65							ConferenceDetailsActivity.this,
 66							getString(R.string.your_nick_has_been_changed),
 67							Toast.LENGTH_SHORT).show();
 68				} else {
 69					Toast.makeText(ConferenceDetailsActivity.this,
 70							getString(R.string.nick_in_use),
 71							Toast.LENGTH_SHORT).show();
 72				}
 73			}
 74		});
 75	}
 76
 77	private List<User> users = new ArrayList<>();
 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			TextView name = (TextView) view
224					.findViewById(R.id.contact_display_name);
225			TextView key = (TextView) view.findViewById(R.id.key);
226			TextView role = (TextView) view.findViewById(R.id.contact_jid);
227			if (user.getPgpKeyId() != 0) {
228				key.setVisibility(View.VISIBLE);
229				key.setOnClickListener(new OnClickListener() {
230
231					@Override
232					public void onClick(View v) {
233						viewPgpKey(user);
234					}
235				});
236				key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
237			}
238			Bitmap bm;
239			Contact contact = user.getContact();
240			if (contact != null) {
241				bm = avatarService().get(contact, getPixel(48));
242				name.setText(contact.getDisplayName());
243				role.setText(user.getName() + " \u2022 "
244						+ getReadableRole(user.getRole()));
245			} else {
246				bm = avatarService().get(user.getName(), getPixel(48));
247				name.setText(user.getName());
248				role.setText(getReadableRole(user.getRole()));
249			}
250			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
251			iv.setImageBitmap(bm);
252			membersView.addView(view);
253		}
254	}
255
256	private void viewPgpKey(User user) {
257		PgpEngine pgp = xmppConnectionService.getPgpEngine();
258		if (pgp != null) {
259			PendingIntent intent = pgp.getIntentForKey(
260					conversation.getAccount(), user.getPgpKeyId());
261			if (intent != null) {
262				try {
263					startIntentSenderForResult(intent.getIntentSender(), 0,
264							null, 0, 0, 0);
265				} catch (SendIntentException e) {
266
267				}
268			}
269		}
270	}
271}