ChooseCountryActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import android.content.Context;
  4import android.content.Intent;
  5import androidx.databinding.DataBindingUtil;
  6import android.os.Bundle;
  7import androidx.recyclerview.widget.LinearLayoutManager;
  8import androidx.appcompat.widget.Toolbar;
  9import android.text.Editable;
 10import android.text.TextWatcher;
 11import android.view.Menu;
 12import android.view.MenuItem;
 13import android.view.View;
 14import android.view.inputmethod.InputMethodManager;
 15import android.widget.EditText;
 16import android.widget.TextView;
 17
 18import java.util.ArrayList;
 19import java.util.Collections;
 20import java.util.Iterator;
 21import java.util.List;
 22import java.util.Locale;
 23
 24import eu.siacs.conversations.R;
 25import eu.siacs.conversations.databinding.ActivityChooseCountryBinding;
 26import eu.siacs.conversations.ui.adapter.CountryAdapter;
 27import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
 28
 29public class ChooseCountryActivity extends ActionBarActivity implements CountryAdapter.OnCountryClicked {
 30
 31    private ActivityChooseCountryBinding binding;
 32
 33    private List<PhoneNumberUtilWrapper.Country> countries = new ArrayList<>();
 34    private CountryAdapter countryAdapter = new CountryAdapter(countries);
 35    private final TextWatcher mSearchTextWatcher = new TextWatcher() {
 36
 37        @Override
 38        public void afterTextChanged(final Editable editable) {
 39            filterCountries(editable.toString());
 40        }
 41
 42        @Override
 43        public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
 44        }
 45
 46        @Override
 47        public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
 48        }
 49    };
 50    private EditText mSearchEditText;
 51    private final MenuItem.OnActionExpandListener mOnActionExpandListener = new MenuItem.OnActionExpandListener() {
 52
 53        @Override
 54        public boolean onMenuItemActionExpand(final MenuItem item) {
 55            mSearchEditText.post(() -> {
 56                mSearchEditText.requestFocus();
 57                final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 58                imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
 59            });
 60
 61            return true;
 62        }
 63
 64        @Override
 65        public boolean onMenuItemActionCollapse(final MenuItem item) {
 66            final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 67            imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
 68            mSearchEditText.setText("");
 69            filterCountries(null);
 70            return true;
 71        }
 72    };
 73     private TextView.OnEditorActionListener mSearchDone = (v, actionId, event) -> {
 74         if (countries.size() == 1) {
 75             onCountryClicked(countries.get(0));
 76         }
 77         return true;
 78     };
 79
 80    @Override
 81    protected void onCreate(final Bundle savedInstanceState) {
 82        super.onCreate(savedInstanceState);
 83        this.binding = DataBindingUtil.setContentView(this, R.layout.activity_choose_country);
 84        setSupportActionBar((Toolbar) this.binding.toolbar);
 85        configureActionBar(getSupportActionBar());
 86        this.countries.addAll(PhoneNumberUtilWrapper.getCountries(this));
 87        Collections.sort(this.countries);
 88        this.binding.countries.setAdapter(countryAdapter);
 89        this.binding.countries.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
 90        countryAdapter.setOnCountryClicked(this);
 91        countryAdapter.notifyDataSetChanged();
 92    }
 93
 94    @Override
 95    public void onCountryClicked(PhoneNumberUtilWrapper.Country country) {
 96        Intent data = new Intent();
 97        data.putExtra("region", country.getRegion());
 98        setResult(RESULT_OK, data);
 99        finish();
100    }
101
102    @Override
103    public boolean onCreateOptionsMenu(final Menu menu) {
104        getMenuInflater().inflate(R.menu.choose_country, menu);
105        final MenuItem menuSearchView = menu.findItem(R.id.action_search);
106        final View mSearchView = menuSearchView.getActionView();
107        mSearchEditText = mSearchView.findViewById(R.id.search_field);
108        mSearchEditText.addTextChangedListener(mSearchTextWatcher);
109        mSearchEditText.setHint(R.string.search_countries);
110        mSearchEditText.setOnEditorActionListener(mSearchDone);
111        menuSearchView.setOnActionExpandListener(mOnActionExpandListener);
112        return true;
113    }
114
115    private void filterCountries(String needle) {
116        List<PhoneNumberUtilWrapper.Country> countries = PhoneNumberUtilWrapper.getCountries(this);
117        Iterator<PhoneNumberUtilWrapper.Country> iterator = countries.iterator();
118        while(iterator.hasNext()) {
119            final PhoneNumberUtilWrapper.Country country = iterator.next();
120            if(needle != null && !country.getName().toLowerCase(Locale.getDefault()).contains(needle.toLowerCase(Locale.getDefault()))) {
121                iterator.remove();
122            }
123        }
124        this.countries.clear();
125        this.countries.addAll(countries);
126        this.countryAdapter.notifyDataSetChanged();
127    }
128
129}