aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoriNPUTmice <daniel@gultsch.de>2014-11-17 20:02:46 +0100
committeriNPUTmice <daniel@gultsch.de>2014-11-17 20:02:46 +0100
commitf41c3eee04a647fa3f44da20ca77928731ce8946 (patch)
tree1b60f0b00425ed4d4f354aef33f7a9eb8282337e
parent283d5058e5f91e11fc651a83ce2968580bd94d4a (diff)
context menu for muc participants + refactor trueCounterpart to use Jid class
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Message.java25
-rw-r--r--src/main/java/eu/siacs/conversations/entities/MucOptions.java10
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Roster.java5
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java2
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java93
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationFragment.java3
-rw-r--r--src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java2
-rw-r--r--src/main/res/menu/muc_details_context.xml5
8 files changed, 106 insertions, 39 deletions
diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java
index 33f3443b7..eae08f316 100644
--- a/src/main/java/eu/siacs/conversations/entities/Message.java
+++ b/src/main/java/eu/siacs/conversations/entities/Message.java
@@ -49,7 +49,7 @@ public class Message extends AbstractEntity {
public boolean markable = false;
protected String conversationUuid;
protected Jid counterpart;
- protected String trueCounterpart;
+ protected Jid trueCounterpart;
protected String body;
protected String encryptedBody;
protected long timeSent;
@@ -81,7 +81,7 @@ public class Message extends AbstractEntity {
}
public Message(final String uuid, final String conversationUUid, final Jid counterpart,
- final String trueCounterpart, final String body, final long timeSent,
+ final Jid trueCounterpart, final String body, final long timeSent,
final int encryption, final int status, final int type, final String remoteMsgId, final String relativeFilePath) {
this.uuid = uuid;
this.conversationUuid = conversationUUid;
@@ -108,10 +108,21 @@ public class Message extends AbstractEntity {
} catch (InvalidJidException e) {
jid = null;
}
+ Jid trueCounterpart;
+ try {
+ String value = cursor.getString(cursor.getColumnIndex(TRUE_COUNTERPART));
+ if (value!=null) {
+ trueCounterpart = Jid.fromString(value);
+ } else {
+ trueCounterpart = null;
+ }
+ } catch (InvalidJidException e) {
+ trueCounterpart = null;
+ }
return new Message(cursor.getString(cursor.getColumnIndex(UUID)),
cursor.getString(cursor.getColumnIndex(CONVERSATION)),
jid,
- cursor.getString(cursor.getColumnIndex(TRUE_COUNTERPART)),
+ trueCounterpart,
cursor.getString(cursor.getColumnIndex(BODY)),
cursor.getLong(cursor.getColumnIndex(TIME_SENT)),
cursor.getInt(cursor.getColumnIndex(ENCRYPTION)),
@@ -138,7 +149,11 @@ public class Message extends AbstractEntity {
} else {
values.put(COUNTERPART, counterpart.toString());
}
- values.put(TRUE_COUNTERPART, trueCounterpart);
+ if (trueCounterpart == null ) {
+ values.putNull(TRUE_COUNTERPART);
+ } else {
+ values.put(TRUE_COUNTERPART, trueCounterpart.toString());
+ }
values.put(BODY, body);
values.put(TIME_SENT, timeSent);
values.put(ENCRYPTION, encryption);
@@ -258,7 +273,7 @@ public class Message extends AbstractEntity {
this.type = type;
}
- public void setTrueCounterpart(String trueCounterpart) {
+ public void setTrueCounterpart(Jid trueCounterpart) {
this.trueCounterpart = trueCounterpart;
}
diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java
index 6eb1d43c7..4725bffad 100644
--- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java
+++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java
@@ -43,7 +43,7 @@ public class MucOptions {
private int role;
private int affiliation;
private String name;
- private String jid;
+ private Jid jid;
private long pgpKeyId = 0;
public String getName() {
@@ -54,11 +54,11 @@ public class MucOptions {
this.name = user;
}
- public void setJid(String jid) {
+ public void setJid(Jid jid) {
this.jid = jid;
}
- public String getJid() {
+ public Jid getJid() {
return this.jid;
}
@@ -165,7 +165,7 @@ public class MucOptions {
user.setName(name);
user.setAffiliation(item.getAttribute("affiliation"));
user.setRole(item.getAttribute("role"));
- user.setJid(item.getAttribute("jid"));
+ user.setJid(item.getAttributeAsJid("jid"));
user.setName(name);
if (name.equals(this.joinnick)) {
this.isOnline = true;
@@ -346,7 +346,7 @@ public class MucOptions {
}
}
- public String getTrueCounterpart(String counterpart) {
+ public Jid getTrueCounterpart(String counterpart) {
for (User user : this.getUsers()) {
if (user.getName().equals(counterpart)) {
return user.getJid();
diff --git a/src/main/java/eu/siacs/conversations/entities/Roster.java b/src/main/java/eu/siacs/conversations/entities/Roster.java
index 27d4deb02..12a89cec2 100644
--- a/src/main/java/eu/siacs/conversations/entities/Roster.java
+++ b/src/main/java/eu/siacs/conversations/entities/Roster.java
@@ -15,12 +15,11 @@ public class Roster {
this.account = account;
}
- public Contact getContactFromRoster(String jid) {
+ public Contact getContactFromRoster(Jid jid) {
if (jid == null) {
return null;
}
- String cleanJid = jid.split("/", 2)[0];
- Contact contact = contacts.get(cleanJid);
+ Contact contact = contacts.get(jid.toBareJid().toString());
if (contact != null && contact.showInRoster()) {
return contact;
} else {
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index d2cbbe7c3..e7bf52073 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -1971,7 +1971,7 @@ public class XmppConnectionService extends Service {
return this.mJingleConnectionManager;
}
- public List<Contact> findContacts(String jid) {
+ public List<Contact> findContacts(Jid jid) {
ArrayList<Contact> contacts = new ArrayList<>();
for (Account account : getAccounts()) {
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
index 780f02177..c97f9e56a 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
@@ -7,6 +7,7 @@ import android.content.IntentSender.SendIntentException;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
+import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -35,12 +36,12 @@ import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnRenameListener {
public static final String ACTION_VIEW_MUC = "view_muc";
- private Conversation conversation;
+ private Conversation mConversation;
private OnClickListener inviteListener = new OnClickListener() {
@Override
public void onClick(View v) {
- inviteToConversation(conversation);
+ inviteToConversation(mConversation);
}
};
private TextView mYourNick;
@@ -54,6 +55,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
private Button mInviteButton;
private String uuid = null;
private List<User> users = new ArrayList<>();
+ private User mSelectedUser = null;
@Override
public void onRename(final boolean success) {
@@ -107,12 +109,12 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
@Override
public void onClick(View v) {
- quickEdit(conversation.getMucOptions().getActualNick(),
+ quickEdit(mConversation.getMucOptions().getActualNick(),
new OnValueEdited() {
@Override
public void onValueEdited(String value) {
- xmppConnectionService.renameInMuc(conversation,
+ xmppConnectionService.renameInMuc(mConversation,
value);
}
});
@@ -127,16 +129,16 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
finish();
break;
case R.id.action_edit_subject:
- if (conversation != null) {
- quickEdit(conversation.getName(), new OnValueEdited() {
+ if (mConversation != null) {
+ quickEdit(mConversation.getName(), new OnValueEdited() {
@Override
public void onValueEdited(String value) {
MessagePacket packet = xmppConnectionService
.getMessageGenerator().conferenceSubject(
- conversation, value);
+ mConversation, value);
xmppConnectionService.sendMessagePacket(
- conversation.getAccount(), packet);
+ mConversation.getAccount(), packet);
}
});
}
@@ -160,8 +162,8 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
@Override
protected String getShareableUri() {
- if (conversation != null) {
- return "xmpp:" + conversation.getContactJid().toBareJid().toString() + "?join";
+ if (mConversation != null) {
+ return "xmpp:" + mConversation.getContactJid().toBareJid().toString() + "?join";
} else {
return "";
}
@@ -174,31 +176,74 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
}
@Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ Object tag = v.getTag();
+ if (tag instanceof User) {
+ getMenuInflater().inflate(R.menu.muc_details_context,menu);
+ final User user = (User) tag;
+ this.mSelectedUser = user;
+ String name;
+ final Contact contact = user.getContact();
+ if (contact != null) {
+ name = contact.getDisplayName();
+ } else if (user.getJid() != null) {
+ name = user.getJid().toBareJid().toString();
+ } else {
+ name = user.getName();
+ }
+ menu.setHeaderTitle(name);
+ MenuItem startConversation = menu.findItem(R.id.start_conversation);
+ if (user.getJid() == null) {
+ startConversation.setVisible(false);
+ }
+ }
+ super.onCreateContextMenu(menu,v,menuInfo);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.start_conversation:
+ startConversation(mSelectedUser);
+ return true;
+ default:
+ return super.onContextItemSelected(item);
+ }
+ }
+
+ protected void startConversation(User user) {
+ if (user.getJid() != null) {
+ Conversation conversation = xmppConnectionService.findOrCreateConversation(this.mConversation.getAccount(),user.getJid(),false);
+ switchToConversation(conversation);
+ }
+ }
+
+ @Override
void onBackendConnected() {
if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
this.uuid = getIntent().getExtras().getString("uuid");
}
if (uuid != null) {
- this.conversation = xmppConnectionService
+ this.mConversation = xmppConnectionService
.findConversationByUuid(uuid);
- if (this.conversation != null) {
+ if (this.mConversation != null) {
populateView();
}
}
}
private void populateView() {
- mAccountJid.setText(getString(R.string.using_account, conversation
+ mAccountJid.setText(getString(R.string.using_account, mConversation
.getAccount().getJid().toBareJid()));
mYourPhoto.setImageBitmap(avatarService().get(
- conversation.getAccount(), getPixel(48)));
- setTitle(conversation.getName());
- mFullJid.setText(conversation.getContactJid().toBareJid().toString());
- mYourNick.setText(conversation.getMucOptions().getActualNick());
+ mConversation.getAccount(), getPixel(48)));
+ setTitle(mConversation.getName());
+ mFullJid.setText(mConversation.getContactJid().toBareJid().toString());
+ mYourNick.setText(mConversation.getMucOptions().getActualNick());
mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
- if (conversation.getMucOptions().online()) {
+ if (mConversation.getMucOptions().online()) {
mMoreDetails.setVisibility(View.VISIBLE);
- User self = conversation.getMucOptions().getSelf();
+ User self = mConversation.getMucOptions().getSelf();
switch (self.getAffiliation()) {
case User.AFFILIATION_ADMIN:
mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
@@ -214,19 +259,21 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
}
}
this.users.clear();
- this.users.addAll(conversation.getMucOptions().getUsers());
+ this.users.addAll(mConversation.getMucOptions().getUsers());
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
membersView.removeAllViews();
- for (final User user : conversation.getMucOptions().getUsers()) {
+ for (final User user : mConversation.getMucOptions().getUsers()) {
View view = inflater.inflate(R.layout.contact, membersView,
false);
this.setListItemBackgroundOnView(view);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
- highlightInMuc(conversation, user.getName());
+ highlightInMuc(mConversation, user.getName());
}
});
+ registerForContextMenu(view);
+ view.setTag(user);
TextView name = (TextView) view
.findViewById(R.id.contact_display_name);
TextView key = (TextView) view.findViewById(R.id.key);
@@ -274,7 +321,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
PgpEngine pgp = xmppConnectionService.getPgpEngine();
if (pgp != null) {
PendingIntent intent = pgp.getIntentForKey(
- conversation.getAccount(), user.getPgpKeyId());
+ mConversation.getAccount(), user.getPgpKeyId());
if (intent != null) {
try {
startIntentSenderForResult(intent.getIntentSender(), 0,
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index 0742e17e3..cf02c9709 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -494,6 +494,9 @@ public class ConversationFragment extends Fragment {
}
public void reInit(Conversation conversation) {
+ if (conversation == null) {
+ return;
+ }
if (this.conversation != null) {
this.conversation.setNextMessage(mEditMessage.getText().toString());
}
diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
index cdd096f5e..c8b418212 100644
--- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
@@ -622,7 +622,7 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
}
private boolean handleJid(Invite invite) {
- List<Contact> contacts = xmppConnectionService.findContacts(invite.getJid().toString());
+ List<Contact> contacts = xmppConnectionService.findContacts(invite.getJid());
if (contacts.size() == 0) {
showCreateContactDialog(invite.getJid().toString(),invite.getFingerprint());
return false;
diff --git a/src/main/res/menu/muc_details_context.xml b/src/main/res/menu/muc_details_context.xml
index fe187c0cf..113934f3d 100644
--- a/src/main/res/menu/muc_details_context.xml
+++ b/src/main/res/menu/muc_details_context.xml
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
+ <item
+ android:id="@+id/start_conversation"
+ android:title="@string/start_conversation"
+ />
</menu> \ No newline at end of file