package com.xabber.android.ui.activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import com.xabber.android.R; import com.xabber.android.data.log.LogManager; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.intent.AccountIntentBuilder; import com.xabber.android.data.intent.EntityIntentBuilder; import com.xabber.android.ui.adapter.HostedConferencesAdapter; import org.jivesoftware.smackx.disco.packet.DiscoverItems; import org.jivesoftware.smackx.muc.HostedRoom; import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; import java.util.ArrayList; import java.util.List; public class ConferenceFilterActivity extends ManagedActivity implements TextWatcher, View.OnClickListener, AdapterView.OnItemClickListener, TextView.OnEditorActionListener { private static final String LOG_TAG = ConferenceFilterActivity.class.getSimpleName(); public static final String ARG_CONFERENCE_NAME = "com.xabber.android.ui.activity.ConferenceFilterActivity.ARG_CONFERENCE_NAME"; public static final String ARG_CONFERENCE_LIST_NAMES = "com.xabber.android.ui.activity.ConferenceFilterActivity.ARG_CONFERENCE_LIST_NAMES"; public static final String ARG_CONFERENCE_LIST_JIDS = "com.xabber.android.ui.activity.ConferenceFilterActivity.ARG_CONFERENCE_LIST_JIDS"; public static final String ARG_CONFERENCE_LIST = "com.xabber.android.ui.activity.ConferenceFilterActivity.ARG_CONFERENCE_LIST"; public static final int REQUEST_CODE_FILTER_ROOMS = 1; private EditText conferenceNameEditText; private ImageButton roomClearButton; private AccountJid account; private HostedConferencesAdapter hostedConferencesAdapter; public static Intent createIntent(Context context, AccountJid account) { return new EntityIntentBuilder(context, ConferenceFilterActivity.class).setAccount(account).build(); } private static AccountJid getAccount(Intent intent) { return AccountIntentBuilder.getAccount(intent); } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { returnResult(); return true; } return super.dispatchKeyEvent(event); } private void returnResult() { Intent data = new Intent(); data.putExtra(ARG_CONFERENCE_NAME, conferenceNameEditText.getText().toString()); setResult(RESULT_OK, data); finish(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.conferences_filter); roomClearButton = (ImageButton)findViewById(R.id.room_clear_button); roomClearButton.setOnClickListener(this); conferenceNameEditText = (EditText)findViewById(R.id.room_name_edit_text); setRoomClearButtonVisibility(); Intent intent = getIntent(); account = getAccount(intent); hostedConferencesAdapter = new HostedConferencesAdapter(this); ListView listView = (ListView) findViewById(R.id.hosted_rooms_list_view); listView.setAdapter(hostedConferencesAdapter); listView.setOnItemClickListener(this); Bundle bundleExtra = intent.getBundleExtra(ARG_CONFERENCE_LIST); hostedConferencesAdapter.addAll(restoreConferenceList(bundleExtra)); String room = intent.getStringExtra(ARG_CONFERENCE_NAME); if (room != null) { conferenceNameEditText.setText(room); conferenceNameEditText.setSelection(room.length()); } conferenceNameEditText.addTextChangedListener(this); conferenceNameEditText.setOnEditorActionListener(this); } public static List<HostedRoom> restoreConferenceList(Bundle bundleExtra) { List<String> conferencesNames = bundleExtra.getStringArrayList(ARG_CONFERENCE_LIST_NAMES); List<String> conferencesJids = bundleExtra.getStringArrayList(ARG_CONFERENCE_LIST_JIDS); List<HostedRoom> conferences = new ArrayList<>(); if (conferencesNames != null && conferencesJids != null && conferencesNames.size() == conferencesJids.size()) { for (int i = 0; i < conferencesNames.size(); i++) { try { DiscoverItems.Item item = new DiscoverItems.Item(JidCreate.from(conferencesJids.get(i))); item.setName(conferencesNames.get(i)); conferences.add(new HostedRoom(item)); } catch (XmppStringprepException e) { LogManager.exception(LOG_TAG, e); } } } return conferences; } private void setRoomClearButtonVisibility() { if (conferenceNameEditText.getText().toString().trim().isEmpty()) { roomClearButton.setVisibility(View.GONE); } else { roomClearButton.setVisibility(View.VISIBLE); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { setRoomClearButtonVisibility(); hostedConferencesAdapter.getFilter().filter(s); } @Override public void afterTextChanged(Editable s) { } @Override public void onClick(View v) { if (v.getId() == R.id.room_clear_button) { conferenceNameEditText.getText().clear(); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { try { startActivity(ConferenceAddActivity.createIntent(this, account, UserJid.from(hostedConferencesAdapter.getItem(position).getJid()))); } catch (UserJid.UserJidCreateException e) { LogManager.exception(this, e); } } @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_NEXT || actionId == EditorInfo.IME_ACTION_DONE) { returnResult(); return true; } else { return false; } } }