package com.xabber.android.ui.fragment;
import android.app.Activity;
import android.app.ListFragment;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
import com.xabber.android.R;
import com.xabber.android.data.log.LogManager;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.entity.AccountJid;
import com.xabber.android.data.entity.UserJid;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.ui.activity.ChatActivity;
import com.xabber.android.ui.activity.ConferenceAddActivity;
import com.xabber.android.ui.activity.ConferenceFilterActivity;
import com.xabber.android.ui.adapter.AccountChooseAdapter;
import com.xabber.android.ui.adapter.HostedConferencesAdapter;
import com.xabber.android.ui.color.ColorManager;
import org.jivesoftware.smackx.muc.HostedRoom;
import org.jxmpp.jid.DomainBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.jid.parts.Localpart;
import org.jxmpp.stringprep.XmppStringprepException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ConferenceSelectFragment extends ListFragment implements AdapterView.OnItemSelectedListener,
View.OnClickListener, MUCManager.HostedRoomsListener, AdapterView.OnItemClickListener {
private static final String LOG_TAG = ConferenceSelectFragment.class.getSimpleName();
private Spinner accountView;
private EditText serverView;
private EditText roomView;
private HostedConferencesAdapter hostedConferencesAdapter;
private View roomsProgressBar;
private AccountJid account;
Listener listener;
private Button nextButton;
public ConferenceSelectFragment() {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (Listener) activity;
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_conference_select, container, false);
accountView = (Spinner) view.findViewById(R.id.contact_account);
serverView = (EditText) view.findViewById(R.id.muc_server);
roomView = (EditText) view.findViewById(R.id.muc_conference_name);
roomView.setOnClickListener(this);
roomView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
onRoomNameEditTextClick();
}
}
});
roomsProgressBar = view.findViewById(R.id.muc_rooms_progress_bar);
view.findViewById(R.id.muc_get_hosted_rooms).setOnClickListener(this);
accountView.setAdapter(new AccountChooseAdapter(getActivity()));
accountView.setOnItemSelectedListener(this);
if (AccountManager.getInstance().getEnabledAccounts().size() == 1) {
accountView.setSelection(0);
}
nextButton = (Button) view.findViewById(R.id.muc_next);
nextButton.setTextColor(ColorManager.getInstance().getAccountPainter().getDefaultTextColor());
nextButton.setOnClickListener(this);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
hostedConferencesAdapter = new HostedConferencesAdapter(getActivity());
ListView listView = getListView();
listView.setAdapter(hostedConferencesAdapter);
listView.setOnItemClickListener(this);
if (savedInstanceState != null) {
hostedConferencesAdapter.clear();
hostedConferencesAdapter.addAll(ConferenceFilterActivity.restoreConferenceList(savedInstanceState));
}
roomView.addTextChangedListener(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) {
hostedConferencesAdapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
storeConferenceList(outState);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (account == null) {
LogManager.w(LOG_TAG, "onItemClick: Account is null!");
return;
}
try {
startActivity(ConferenceAddActivity.createIntent(getActivity(), account,
UserJid.from(hostedConferencesAdapter.getItem(position).getJid())));
} catch (UserJid.UserJidCreateException e) {
LogManager.exception(this, e);
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
AccountJid newAccount = (AccountJid) accountView.getSelectedItem();
if (account != null && account.equals(newAccount)) {
return;
}
if (account != null) {
hostedConferencesAdapter.clear();
}
account = newAccount;
listener.onAccountSelected(account);
nextButton.setTextColor(ColorManager.getInstance().getAccountPainter().getAccountTextColor(account));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
account = null;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.muc_get_hosted_rooms:
onRequestHostedRoomsClick();
break;
case R.id.muc_next:
onNextClick();
break;
case R.id.muc_conference_name:
onRoomNameEditTextClick();
break;
}
}
private void onRoomNameEditTextClick() {
if (hostedConferencesAdapter.isEmpty()) {
return;
}
Intent intent = ConferenceFilterActivity.createIntent(getActivity(), account);
intent.putExtra(ConferenceFilterActivity.ARG_CONFERENCE_NAME, roomView.getText().toString());
Bundle bundle = new Bundle();
storeConferenceList(bundle);
intent.putExtra(ConferenceFilterActivity.ARG_CONFERENCE_LIST, bundle);
startActivityForResult(intent, ConferenceFilterActivity.REQUEST_CODE_FILTER_ROOMS);
}
private void storeConferenceList(Bundle intent) {
List<HostedRoom> conferencesList = hostedConferencesAdapter.getConferencesList();
ArrayList<String> names = new ArrayList<>();
ArrayList<String> jids = new ArrayList<>();
for (HostedRoom hostedRoom : conferencesList) {
names.add(hostedRoom.getName());
jids.add(hostedRoom.getJid().toString());
}
intent.putStringArrayList(ConferenceFilterActivity.ARG_CONFERENCE_LIST_NAMES, names);
intent.putStringArrayList(ConferenceFilterActivity.ARG_CONFERENCE_LIST_JIDS, jids);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ConferenceFilterActivity.REQUEST_CODE_FILTER_ROOMS) {
String stringExtra = data.getStringExtra(ConferenceFilterActivity.ARG_CONFERENCE_NAME);
if (stringExtra != null) {
onConferenceNameChanged(stringExtra);
}
}
}
private void onNextClick() {
if (account == null) {
Toast.makeText(getActivity(), getString(R.string.EMPTY_ACCOUNT), Toast.LENGTH_SHORT).show();
return;
}
DomainBareJid server;
try {
server = JidCreate.domainBareFrom(serverView.getText().toString());
} catch (XmppStringprepException e) {
Toast.makeText(getActivity(), getString(R.string.EMPTY_SERVER_NAME), Toast.LENGTH_SHORT).show();
return;
}
Localpart room;
try {
room = Localpart.from(roomView.getText().toString());
} catch (XmppStringprepException e) {
Toast.makeText(getActivity(), getString(R.string.EMPTY_ROOM_NAME), Toast.LENGTH_LONG).show();
return;
}
UserJid roomJid = null;
try {
roomJid = UserJid.from(JidCreate.entityBareFrom(room, server));
startActivity(ConferenceAddActivity.createIntent(getActivity(), account, roomJid));
} catch (UserJid.UserJidCreateException e) {
LogManager.exception(this, e);
}
}
private void onRequestHostedRoomsClick() {
if (account == null) {
Toast.makeText(getActivity(), getString(R.string.EMPTY_ACCOUNT), Toast.LENGTH_SHORT).show();
return;
}
DomainBareJid server;
try {
server = JidCreate.domainBareFrom(serverView.getText().toString());
} catch (XmppStringprepException e) {
Toast.makeText(getActivity(), getString(R.string.EMPTY_SERVER_NAME), Toast.LENGTH_SHORT).show();
return;
}
ChatActivity.hideKeyboard(getActivity());
hostedConferencesAdapter.clear();
roomsProgressBar.setVisibility(View.VISIBLE);
MUCManager.requestHostedRooms(account, server, this);
}
@Override
public void onHostedRoomsReceived(Collection<HostedRoom> hostedRooms) {
if (!isAdded()) {
return;
}
roomsProgressBar.setVisibility(View.GONE);
if (hostedRooms == null) {
Toast.makeText(getActivity(), R.string.muc_error_getting_conferences, Toast.LENGTH_SHORT).show();
return;
}
hostedConferencesAdapter.clear();
hostedConferencesAdapter.addAll(hostedRooms);
}
public void onConferenceNameChanged(String stringExtra) {
roomView.setText(stringExtra);
roomView.setSelection(stringExtra.length());
}
public interface Listener {
void onAccountSelected(AccountJid account);
}
}