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