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