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