diff options
author | Daniel Gultsch <daniel@gultsch.de> | 2014-03-15 06:20:59 +0100 |
---|---|---|
committer | Daniel Gultsch <daniel@gultsch.de> | 2014-03-15 06:20:59 +0100 |
commit | 841c6e04a9da5f8eaf00b5140da7b7934ad3cbe3 (patch) | |
tree | b1516e736b2ccb87814f2b50b458be60428366e0 | |
parent | afe12447098424254366f5714645420973b37f36 (diff) |
muc invites in conference details
-rw-r--r-- | res/layout/activity_muc_details.xml | 9 | ||||
-rw-r--r-- | res/menu/newconversation_context.xml | 4 | ||||
-rw-r--r-- | res/values/strings.xml | 1 | ||||
-rw-r--r-- | src/eu/siacs/conversations/services/XmppConnectionService.java | 1 | ||||
-rw-r--r-- | src/eu/siacs/conversations/ui/MucDetailsActivity.java | 17 | ||||
-rw-r--r-- | src/eu/siacs/conversations/ui/NewConversationActivity.java | 215 |
6 files changed, 166 insertions, 81 deletions
diff --git a/res/layout/activity_muc_details.xml b/res/layout/activity_muc_details.xml index 65bce365..74e3169a 100644 --- a/res/layout/activity_muc_details.xml +++ b/res/layout/activity_muc_details.xml @@ -8,7 +8,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > - <TextView style="@style/sectionHeader" android:layout_width="wrap_content" @@ -134,5 +133,13 @@ </LinearLayout> </LinearLayout> + <Button + android:layout_marginTop="24dp" + android:id="@+id/invite" + style="?android:attr/buttonStyleSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/invite_contacts" + android:layout_gravity="center_horizontal"/> </LinearLayout> </ScrollView>
\ No newline at end of file diff --git a/res/menu/newconversation_context.xml b/res/menu/newconversation_context.xml index 64c630f1..c28d839d 100644 --- a/res/menu/newconversation_context.xml +++ b/res/menu/newconversation_context.xml @@ -11,4 +11,8 @@ android:showAsAction="ifRoom" android:icon="@drawable/ic_action_chat" android:title="@string/start_conversation" /> + <item + android:id="@+id/action_invite" + android:showAsAction="ifRoom" + android:title="@string/invite_contacts" /> </menu> diff --git a/res/values/strings.xml b/res/values/strings.xml index b3a3dcd9..f04fca96 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -30,4 +30,5 @@ <string name="show_otr_key">OTR fingerprint</string> <string name="no_otr_fingerprint">No OTR Fingerprint generated. Just go ahead an start an encrypted conversation</string> <string name="start_conversation">Start Conversation</string> + <string name="invite_contacts">Invite Contacts</string> </resources> diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index 54fbbbbd..f2233130 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -1271,6 +1271,7 @@ public class XmppConnectionService extends Service { invite.setAttribute("to", contact.getJid()); x.addChild(invite); packet.addChild(x); + Log.d(LOGTAG,packet.toString()); conversation.getAccount().getXmppConnection().sendMessagePacket(packet); } diff --git a/src/eu/siacs/conversations/ui/MucDetailsActivity.java b/src/eu/siacs/conversations/ui/MucDetailsActivity.java index 75906604..73c18240 100644 --- a/src/eu/siacs/conversations/ui/MucDetailsActivity.java +++ b/src/eu/siacs/conversations/ui/MucDetailsActivity.java @@ -9,6 +9,7 @@ import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.MucOptions.User; import eu.siacs.conversations.utils.UIHelper; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; @@ -20,6 +21,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; @@ -35,6 +37,7 @@ public class MucDetailsActivity extends XmppActivity { private TextView mFullJid; private LinearLayout membersView; private LinearLayout mMoreDetails; + private Button mInviteButton; private String uuid = null; private OnClickListener changeNickListener = new OnClickListener() { @@ -62,6 +65,18 @@ public class MucDetailsActivity extends XmppActivity { } }; + private OnClickListener inviteListener = new OnClickListener() { + + @Override + public void onClick(View v) { + Intent intent = new Intent(getApplicationContext(), + NewConversationActivity.class); + intent.setAction("invite"); + intent.putExtra("uuid",conversation.getUuid()); + startActivity(intent); + } + }; + private List<User> users = new ArrayList<MucOptions.User>(); @Override @@ -81,6 +96,8 @@ public class MucDetailsActivity extends XmppActivity { mMoreDetails = (LinearLayout) findViewById(R.id.muc_more_details); mMoreDetails.setVisibility(View.GONE); mSubject = (EditText) findViewById(R.id.muc_subject); + mInviteButton = (Button) findViewById(R.id.invite); + mInviteButton.setOnClickListener(inviteListener); getActionBar().setHomeButtonEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/src/eu/siacs/conversations/ui/NewConversationActivity.java b/src/eu/siacs/conversations/ui/NewConversationActivity.java index 45e00cc0..9f8f23a4 100644 --- a/src/eu/siacs/conversations/ui/NewConversationActivity.java +++ b/src/eu/siacs/conversations/ui/NewConversationActivity.java @@ -38,7 +38,6 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.ImageView; import android.annotation.SuppressLint; -import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -57,47 +56,56 @@ public class NewConversationActivity extends XmppActivity { private TextView contactsHeader; private List<Account> accounts; private List<Contact> selectedContacts = new ArrayList<Contact>(); - + private boolean isActionMode = false; + private boolean inviteIntent = false; private ActionMode actionMode = null; private AbsListView.MultiChoiceModeListener actionModeCallback = new AbsListView.MultiChoiceModeListener() { - + @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { menu.clear(); MenuInflater inflater = mode.getMenuInflater(); - inflater.inflate(R.menu.newconversation_context, menu); - SparseBooleanArray checkedItems = contactsView.getCheckedItemPositions(); - selectedContacts.clear(); - for(int i = 0; i < aggregatedContacts.size(); ++i) { - if (checkedItems.get(i, false)) { - selectedContacts.add(aggregatedContacts.get(i)); - } - } - if (selectedContacts.size() == 0) { - menu.findItem(R.id.action_start_conversation).setVisible(false); - menu.findItem(R.id.action_contact_details).setVisible(false); - } else if (selectedContacts.size() == 1) { - menu.findItem(R.id.action_start_conversation).setVisible(true); - menu.findItem(R.id.action_contact_details).setVisible(true); - } else { - menu.findItem(R.id.action_start_conversation).setVisible(true); - menu.findItem(R.id.action_contact_details).setVisible(false); - } + inflater.inflate(R.menu.newconversation_context, menu); + SparseBooleanArray checkedItems = contactsView + .getCheckedItemPositions(); + selectedContacts.clear(); + for (int i = 0; i < aggregatedContacts.size(); ++i) { + if (checkedItems.get(i, false)) { + selectedContacts.add(aggregatedContacts.get(i)); + } + } + if (selectedContacts.size() == 0) { + menu.findItem(R.id.action_start_conversation).setVisible(false); + menu.findItem(R.id.action_contact_details).setVisible(false); + menu.findItem(R.id.action_invite).setVisible(false); + } else if ((selectedContacts.size() == 1)&&(!inviteIntent)) { + menu.findItem(R.id.action_start_conversation).setVisible(true); + menu.findItem(R.id.action_contact_details).setVisible(true); + menu.findItem(R.id.action_invite).setVisible(false); + } else if (!inviteIntent){ + menu.findItem(R.id.action_start_conversation).setVisible(true); + menu.findItem(R.id.action_contact_details).setVisible(false); + menu.findItem(R.id.action_invite).setVisible(false); + } else { + menu.findItem(R.id.action_invite).setVisible(true); + menu.findItem(R.id.action_start_conversation).setVisible(false); + menu.findItem(R.id.action_contact_details).setVisible(false); + } return true; } - + @Override public void onDestroyActionMode(ActionMode mode) { // TODO Auto-generated method stub - + } - + @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { return true; } - + @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { @@ -109,54 +117,77 @@ public class NewConversationActivity extends XmppActivity { } break; case R.id.action_contact_details: - Intent intent = new Intent(getApplicationContext(),ContactDetailsActivity.class); + Intent intent = new Intent(getApplicationContext(), + ContactDetailsActivity.class); intent.setAction(ContactDetailsActivity.ACTION_VIEW_CONTACT); intent.putExtra("uuid", selectedContacts.get(0).getUuid()); startActivity(intent); break; + case R.id.action_invite: + invite(); + break; default: break; } // TODO Auto-generated method stub return false; } - + @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { } }; + + private void invite() { + List<Conversation> conversations = xmppConnectionService + .getConversations(); + Conversation conversation = null; + for (Conversation tmpConversation : conversations) { + if (tmpConversation.getUuid().equals( + getIntent().getStringExtra("uuid"))) { + conversation = tmpConversation; + break; + } + } + if (conversation != null) { + xmppConnectionService.inviteToConference(conversation, selectedContacts); + } + finish(); + } private void startConference() { - if (accounts.size()>1) { + if (accounts.size() > 1) { getAccountChooser(new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startConference(accounts.get(which), selectedContacts); } - }).show(); + }).show(); } else { startConference(accounts.get(0), selectedContacts); } - + } - + private void startConference(Account account, List<Contact> contacts) { SecureRandom random = new SecureRandom(); - String mucName = new BigInteger(100,random).toString(32); + String mucName = new BigInteger(100, random).toString(32); String serverName = account.getXmppConnection().getMucServer(); - String jid = mucName+"@"+serverName; - Conversation conversation = xmppConnectionService.findOrCreateConversation(account, jid , true); + String jid = mucName + "@" + serverName; + Conversation conversation = xmppConnectionService + .findOrCreateConversation(account, jid, true); StringBuilder subject = new StringBuilder(); - for(int i = 0; i < selectedContacts.size(); ++i) { - if (i+1!=selectedContacts.size()) { - subject.append(selectedContacts.get(i).getDisplayName()+", "); + for (int i = 0; i < selectedContacts.size(); ++i) { + if (i + 1 != selectedContacts.size()) { + subject.append(selectedContacts.get(i).getDisplayName() + ", "); } else { subject.append(selectedContacts.get(i).getDisplayName()); } } - xmppConnectionService.sendConversationSubject(conversation, subject.toString()); + xmppConnectionService.sendConversationSubject(conversation, + subject.toString()); xmppConnectionService.inviteToConference(conversation, contacts); switchToConversation(conversation, null); } @@ -197,7 +228,7 @@ public class NewConversationActivity extends XmppActivity { contactsAdapter.notifyDataSetChanged(); contactsView.setScrollX(0); } - + private OnItemLongClickListener onLongClickListener = new OnItemLongClickListener() { @Override @@ -205,7 +236,7 @@ public class NewConversationActivity extends XmppActivity { int position, long arg3) { if (!isActionMode) { contactsView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); - contactsView.setItemChecked(position,true); + contactsView.setItemChecked(position, true); actionMode = contactsView.startActionMode(actionModeCallback); } return true; @@ -213,6 +244,17 @@ public class NewConversationActivity extends XmppActivity { }; @Override + protected void onStart() { + super.onStart(); + inviteIntent = "invite".equals(getIntent().getAction()); + if (inviteIntent) { + contactsHeader.setVisibility(View.GONE); + actionMode = contactsView.startActionMode(actionModeCallback); + search.setVisibility(View.GONE); + } + } + + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -263,7 +305,8 @@ public class NewConversationActivity extends XmppActivity { contactJid.setText(contact.getJid()); ImageView imageView = (ImageView) view .findViewById(R.id.contact_photo); - imageView.setImageBitmap(UIHelper.getContactPicture(contact,null,90,this.getContext())); + imageView.setImageBitmap(UIHelper.getContactPicture(contact, + null, 90, this.getContext())); return view; } }; @@ -277,7 +320,7 @@ public class NewConversationActivity extends XmppActivity { if (!isActionMode) { Contact clickedContact = aggregatedContacts.get(pos); startConversation(clickedContact); - + } else { actionMode.invalidate(); } @@ -285,9 +328,9 @@ public class NewConversationActivity extends XmppActivity { }); contactsView.setOnItemLongClickListener(this.onLongClickListener); } - + public void startConversation(final Contact contact) { - if ((contact.getAccount()==null)&&(accounts.size()>1)) { + if ((contact.getAccount() == null) && (accounts.size() > 1)) { getAccountChooser(new OnClickListener() { @Override @@ -295,50 +338,52 @@ public class NewConversationActivity extends XmppActivity { contact.setAccount(accounts.get(which)); showIsMucDialogIfNeeded(contact); } - }).show(); + }).show(); } else { - if (contact.getAccount()==null) { + if (contact.getAccount() == null) { contact.setAccount(accounts.get(0)); } showIsMucDialogIfNeeded(contact); } } - + protected AlertDialog getAccountChooser(OnClickListener listener) { String[] accountList = new String[accounts.size()]; for (int i = 0; i < accounts.size(); ++i) { - accountList[i] = accounts.get(i).getJid(); + accountList[i] = accounts.get(i).getJid(); } - AlertDialog.Builder accountChooser = new AlertDialog.Builder( - this); + AlertDialog.Builder accountChooser = new AlertDialog.Builder(this); accountChooser.setTitle("Choose account"); accountChooser.setItems(accountList, listener); return accountChooser.create(); } - + public void showIsMucDialogIfNeeded(final Contact clickedContact) { if (clickedContact.couldBeMuc()) { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("Multi User Conference"); dialog.setMessage("Are you trying to join a conference?"); dialog.setPositiveButton("Yes", new OnClickListener() { - + @Override public void onClick(DialogInterface dialog, int which) { - startConversation(clickedContact, clickedContact.getAccount(),true); + startConversation(clickedContact, + clickedContact.getAccount(), true); } }); dialog.setNegativeButton("No", new OnClickListener() { - + @Override public void onClick(DialogInterface dialog, int which) { - startConversation(clickedContact, clickedContact.getAccount(),false); + startConversation(clickedContact, + clickedContact.getAccount(), false); } }); dialog.create().show(); } else { - startConversation(clickedContact, clickedContact.getAccount(),false); + startConversation(clickedContact, clickedContact.getAccount(), + false); } } @@ -349,7 +394,7 @@ public class NewConversationActivity extends XmppActivity { Conversation conversation = xmppConnectionService .findOrCreateConversation(account, contact.getJid(), muc); - switchToConversation(conversation,null); + switchToConversation(conversation, null); } @Override @@ -360,38 +405,44 @@ public class NewConversationActivity extends XmppActivity { getActionBar().setHomeButtonEnabled(false); String jid; try { - jid = URLDecoder.decode(getIntent().getData().getEncodedPath(),"UTF-8").split("/")[1]; + jid = URLDecoder.decode(getIntent().getData().getEncodedPath(), + "UTF-8").split("/")[1]; } catch (UnsupportedEncodingException e) { jid = null; } - if (jid!=null) { + if (jid != null) { final String finalJid = jid; if (this.accounts.size() > 1) { getAccountChooser(new OnClickListener() { - + @Override public void onClick(DialogInterface dialog, int which) { - Conversation conversation = xmppConnectionService.findOrCreateConversation(accounts.get(which), finalJid, false); - switchToConversation(conversation,null); + Conversation conversation = xmppConnectionService + .findOrCreateConversation( + accounts.get(which), finalJid, + false); + switchToConversation(conversation, null); finish(); } }).show(); } else { - Conversation conversation = xmppConnectionService.findOrCreateConversation(this.accounts.get(0), jid, false); - switchToConversation(conversation,null); + Conversation conversation = xmppConnectionService + .findOrCreateConversation(this.accounts.get(0), + jid, false); + switchToConversation(conversation, null); finish(); } } } - - + if (xmppConnectionService.getConversationCount() == 0) { getActionBar().setDisplayHomeAsUpEnabled(false); getActionBar().setHomeButtonEnabled(false); } this.rosterContacts.clear(); for (int i = 0; i < accounts.size(); ++i) { - rosterContacts.addAll(xmppConnectionService.getRoster(accounts.get(i))); + rosterContacts.addAll(xmppConnectionService.getRoster(accounts + .get(i))); } updateAggregatedContacts(); } @@ -451,27 +502,31 @@ public class NewConversationActivity extends XmppActivity { } } } - + @Override public void onActionModeStarted(ActionMode mode) { super.onActionModeStarted(mode); this.isActionMode = true; search.setEnabled(false); } - + @Override public void onActionModeFinished(ActionMode mode) { super.onActionModeFinished(mode); - this.isActionMode = false; - contactsView.clearChoices(); - contactsView.requestLayout(); - contactsView.post(new Runnable() { - @Override - public void run() { - contactsView.setChoiceMode(ListView.CHOICE_MODE_NONE); - } - }); - search.setEnabled(true); + if (inviteIntent) { + finish(); + } else { + this.isActionMode = false; + contactsView.clearChoices(); + contactsView.requestLayout(); + contactsView.post(new Runnable() { + @Override + public void run() { + contactsView.setChoiceMode(ListView.CHOICE_MODE_NONE); + } + }); + search.setEnabled(true); + } } - + } |