allow filtering in participant view. fixes #3371

This commit is contained in:
Daniel Gultsch 2019-02-15 14:00:42 +01:00
parent 5f543e8314
commit 6b5e81df49
4 changed files with 95 additions and 7 deletions

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
app:actionLayout="@layout/actionview_search"
android:icon="?attr/icon_search"
app:showAsAction="collapseActionView|always"
android:title="@string/search"/>
</menu>

View file

@ -1,18 +1,27 @@
package eu.siacs.conversations.ui; package eu.siacs.conversations.ui;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.databinding.DataBindingUtil; import android.databinding.DataBindingUtil;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Locale;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R; import eu.siacs.conversations.R;
import eu.siacs.conversations.databinding.ActivityMucUsersBinding; import eu.siacs.conversations.databinding.ActivityMucUsersBinding;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.services.XmppConnectionService;
@ -20,12 +29,16 @@ import eu.siacs.conversations.ui.adapter.UserAdapter;
import eu.siacs.conversations.ui.util.MucDetailsContextMenuHelper; import eu.siacs.conversations.ui.util.MucDetailsContextMenuHelper;
import rocks.xmpp.addr.Jid; import rocks.xmpp.addr.Jid;
public class MucUsersActivity extends XmppActivity implements XmppConnectionService.OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged { public class MucUsersActivity extends XmppActivity implements XmppConnectionService.OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, MenuItem.OnActionExpandListener, TextWatcher {
private UserAdapter userAdapter; private UserAdapter userAdapter;
private Conversation mConversation = null; private Conversation mConversation = null;
private EditText mSearchEditText;
private ArrayList<MucOptions.User> allUsers = new ArrayList<>();
@Override @Override
protected void refreshUiReal() { protected void refreshUiReal() {
} }
@ -42,9 +55,26 @@ public class MucUsersActivity extends XmppActivity implements XmppConnectionServ
private void loadAndSubmitUsers() { private void loadAndSubmitUsers() {
if (mConversation != null) { if (mConversation != null) {
ArrayList<MucOptions.User> users = mConversation.getMucOptions().getUsers(); allUsers = mConversation.getMucOptions().getUsers();
Collections.sort(users); Collections.sort(allUsers);
userAdapter.submitList(users); submitFilteredList(mSearchEditText != null ? mSearchEditText.getText().toString() : null);
}
}
private void submitFilteredList(String search) {
if (TextUtils.isEmpty(search)) {
userAdapter.submitList(allUsers);
} else {
final String needle = search.toLowerCase(Locale.getDefault());
ArrayList<MucOptions.User> filtered = new ArrayList<>();
for(MucOptions.User user : allUsers) {
final String name = user.getName();
final Contact contact = user.getContact();
if (name != null && name.toLowerCase(Locale.getDefault()).contains(needle) || contact != null && contact.getDisplayName().toLowerCase(Locale.getDefault()).contains(needle)) {
filtered.add(user);
}
}
userAdapter.submitList(filtered);
} }
} }
@ -86,4 +116,49 @@ public class MucUsersActivity extends XmppActivity implements XmppConnectionServ
displayToast(getString(resId, jid.asBareJid().toString())); displayToast(getString(resId, jid.asBareJid().toString()));
} }
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.muc_users_activity, menu);
final MenuItem menuSearchView = menu.findItem(R.id.action_search);
final View mSearchView = menuSearchView.getActionView();
mSearchEditText = mSearchView.findViewById(R.id.search_field);
mSearchEditText.addTextChangedListener(this);
mSearchEditText.setHint(R.string.search_participants);
menuSearchView.setOnActionExpandListener(this);
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
mSearchEditText.post(() -> {
mSearchEditText.requestFocus();
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
mSearchEditText.setText("");
submitFilteredList("");
return true;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
submitFilteredList(s.toString());
}
} }

View file

@ -82,8 +82,9 @@ public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHo
final String name = user.getName(); final String name = user.getName();
final Contact contact = user.getContact(); final Contact contact = user.getContact();
if (contact != null) { if (contact != null) {
viewHolder.binding.contactDisplayName.setText(contact.getDisplayName()); final String displayName = contact.getDisplayName();
if (name != null) { viewHolder.binding.contactDisplayName.setText(displayName);
if (name != null && !name.equals(displayName)) {
viewHolder.binding.contactJid.setText(String.format("%s \u2022 %s", name, ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode))); viewHolder.binding.contactJid.setText(String.format("%s \u2022 %s", name, ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode)));
} else { } else {
viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode)); viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode));

View file

@ -854,4 +854,5 @@
<string name="no_users_hint_channel">This public channel has no participants. Invite your contacts or use the share button to distribute its XMPP address.</string> <string name="no_users_hint_channel">This public channel has no participants. Invite your contacts or use the share button to distribute its XMPP address.</string>
<string name="no_users_hint_group_chat">This private group chat has no participants.</string> <string name="no_users_hint_group_chat">This private group chat has no participants.</string>
<string name="manage_permission">Manage privileges</string> <string name="manage_permission">Manage privileges</string>
<string name="search_participants">Search participants</string>
</resources> </resources>