package im.actor.sdk.controllers.compose;
import android.os.Bundle;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import im.actor.core.entity.Contact;
import im.actor.core.viewmodel.CommandCallback;
import im.actor.runtime.function.Consumer;
import im.actor.runtime.promise.Promise;
import im.actor.sdk.ActorSDK;
import im.actor.sdk.R;
import im.actor.sdk.controllers.Intents;
import im.actor.sdk.controllers.compose.view.UserSpan;
import im.actor.sdk.controllers.contacts.BaseContactFragment;
import im.actor.sdk.util.BoxUtil;
import im.actor.sdk.util.KeyboardHelper;
import im.actor.sdk.util.Screen;
import static im.actor.sdk.util.ActorSDKMessenger.messenger;
import static im.actor.sdk.util.ActorSDKMessenger.users;
public class GroupUsersFragment extends BaseContactFragment {
private String title;
private String avatarPath;
private EditText searchField;
private TextWatcher textWatcher;
private boolean isChannel;
private int gid;
public GroupUsersFragment() {
super(true, false, true);
setRootFragment(true);
setHomeAsUp(true);
}
public static GroupUsersFragment createGroup(String title, String avatarPath) {
GroupUsersFragment res = new GroupUsersFragment();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("avatarPath", avatarPath);
res.setArguments(args);
return res;
}
public static GroupUsersFragment createChannel(int gid) {
GroupUsersFragment res = new GroupUsersFragment();
Bundle args = new Bundle();
args.putBoolean("isChannel", true);
args.putInt("gid", gid);
res.setArguments(args);
return res;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
isChannel = getArguments().getBoolean("isChannel", false);
setTitle(isChannel ? R.string.channel_add_members : R.string.create_group_title);
gid = getArguments().getInt("gid");
title = getArguments().getString("title");
avatarPath = getArguments().getString("avatarPath");
View res = onCreateContactsView(R.layout.fragment_create_group_participants, inflater,
container, savedInstanceState);
res.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor());
searchField = (EditText) res.findViewById(R.id.searchField);
searchField.setTextColor(ActorSDK.sharedActor().style.getTextPrimaryColor());
searchField.setHintTextColor(ActorSDK.sharedActor().style.getTextHintColor());
textWatcher = new TextWatcher() {
@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) {
checkForDeletions(s);
String filter = s.toString().trim();
while (filter.length() > 0 && filter.charAt(0) == '!') {
filter = filter.substring(1);
}
filter(filter);
}
};
KeyboardHelper helper = new KeyboardHelper(getActivity());
helper.setImeVisibility(searchField, false);
return res;
}
@Override
public void onResume() {
super.onResume();
searchField.addTextChangedListener(textWatcher);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.create_group, menu);
menu.findItem(R.id.done).setEnabled(getSelectedCount() > 0 || isChannel);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.done) {
if (isChannel) {
if (getSelectedCount() > 0) {
Promise invites = null;
for (int uid : getSelected()) {
if (invites == null) {
invites = messenger().inviteMemberPromise(gid, uid);
} else {
invites.chain(o -> messenger().inviteMemberPromise(gid, uid));
}
}
execute(invites.then(o -> openChannel()), R.string.progress_common);
} else {
openChannel();
}
} else {
if (getSelectedCount() > 0) {
execute(messenger().createGroup(title, avatarPath, BoxUtil.unbox(getSelected())).then(gid -> {
getActivity().startActivity(Intents.openGroupDialog(gid, true, getActivity()));
getActivity().finish();
}).failure(e -> {
Toast.makeText(getActivity(), getString(R.string.toast_unable_create_group),
Toast.LENGTH_LONG).show();
}));
}
}
return true;
}
return super.onOptionsItemSelected(item);
}
protected void openChannel() {
getActivity().startActivity(Intents.openGroupDialog(gid, true, getActivity()));
getActivity().finish();
}
@Override
public void onItemClicked(Contact contact) {
if (isSelected(contact.getUid())) {
unselect(contact.getUid());
} else {
select(contact.getUid());
}
getActivity().invalidateOptionsMenu();
updateEditText();
}
private void updateEditText() {
Integer[] selected = getSelected();
String src = "";
for (int i = 0; i < selected.length; i++) {
src += "!";
}
Spannable spannable = new SpannableString(src);
for (int i = 0; i < selected.length; i++) {
spannable.setSpan(new UserSpan(users().get(selected[i]), Screen.dp(200)), i, i + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
searchField.removeTextChangedListener(textWatcher);
searchField.setText(spannable);
searchField.setSelection(spannable.length());
searchField.addTextChangedListener(textWatcher);
filter("");
getAdapter().notifyDataSetChanged();
}
private void checkForDeletions(Editable editable) {
Integer[] selected = getSelected();
boolean hasDeletions = false;
UserSpan[] spans = editable.getSpans(0, editable.length(), UserSpan.class);
for (Integer u : selected) {
boolean founded = false;
for (UserSpan span : spans) {
if (span.getUser().getId() == u) {
if (editable.getSpanStart(span) == editable.getSpanEnd(span)) {
break;
} else {
founded = true;
break;
}
}
}
if (!founded) {
hasDeletions = true;
unselect(u);
}
}
if (hasDeletions) {
getActivity().invalidateOptionsMenu();
getAdapter().notifyDataSetChanged();
}
}
@Override
public void onPause() {
super.onPause();
searchField.removeTextChangedListener(textWatcher);
}
@Override
public void onDestroyView() {
super.onDestroyView();
textWatcher = null;
searchField = null;
}
}