package com.battlelancer.seriesguide.ui; import android.annotation.TargetApi; import android.content.res.TypedArray; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBar; import android.util.TypedValue; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import com.battlelancer.seriesguide.R; import com.battlelancer.seriesguide.adapters.MoviesDiscoverAdapter; import com.battlelancer.seriesguide.enums.MoviesDiscoverLink; import com.battlelancer.seriesguide.settings.SearchSettings; import com.battlelancer.seriesguide.ui.dialogs.MovieLocalizationDialogFragment; import com.battlelancer.seriesguide.util.SearchHistory; import com.battlelancer.seriesguide.util.Utils; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; public class MoviesSearchActivity extends BaseNavDrawerActivity implements MoviesSearchFragment.OnSearchClickListener { public static final String EXTRA_ID_LINK = "idLink"; private static final String STATE_SEARCH_VISIBLE = "searchVisible"; @BindView(R.id.containerSearchBar) View containerSearchBar; @BindView(R.id.editTextSearchBar) AutoCompleteTextView searchView; @BindView(R.id.imageButtonSearchClear) View clearButton; @BindView(R.id.containerMoviesSearchFragment) View containerMoviesSearchFragment; private SearchHistory searchHistory; private ArrayAdapter<String> searchHistoryAdapter; private boolean showSearchView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_movies_search); setupNavDrawer(); int linkId = getIntent().getIntExtra(EXTRA_ID_LINK, MoviesDiscoverAdapter.DISCOVER_LINK_DEFAULT.id); MoviesDiscoverLink link = MoviesDiscoverLink.fromId(linkId); showSearchView = link == MoviesDiscoverAdapter.DISCOVER_LINK_DEFAULT; if (savedInstanceState != null) { showSearchView = savedInstanceState.getBoolean(STATE_SEARCH_VISIBLE, showSearchView); } ButterKnife.bind(this); setupActionBar(link); if (savedInstanceState == null) { if (showSearchView) { Utils.showSoftKeyboardOnSearchView(this, searchView); } getSupportFragmentManager().beginTransaction() .add(R.id.containerMoviesSearchFragment, MoviesSearchFragment.newInstance(link)) .commit(); } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { postponeEnterTransition(); containerMoviesSearchFragment.post(new Runnable() { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void run() { // allow the adapter to repopulate during the next layout pass // before starting the transition animation startPostponedEnterTransition(); } }); } } } private void setupActionBar(MoviesDiscoverLink link) { super.setupActionBar(); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } // set title for screen readers if (showSearchView) { setTitle(R.string.search); } else { setTitle(link.titleRes); } setSearchViewVisible(showSearchView); // setup search box searchView.setThreshold(1); searchView.setOnClickListener(searchViewClickListener); searchView.setOnItemClickListener(searchViewItemClickListener); searchView.setOnEditorActionListener(searchViewActionListener); searchView.setHint(R.string.movies_search_hint); // set in code as XML is overridden searchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH); searchView.setInputType(EditorInfo.TYPE_CLASS_TEXT); // manually retrieve the auto complete view popup background to override the theme TypedValue outValue = new TypedValue(); getTheme().resolveAttribute(android.R.attr.autoCompleteTextViewStyle, outValue, true); int[] attributes = new int[] { android.R.attr.popupBackground }; TypedArray a = getTheme().obtainStyledAttributes(outValue.data, attributes); if (a.hasValue(0)) { searchView.setDropDownBackgroundDrawable(a.getDrawable(0)); } a.recycle(); // setup search history searchHistory = new SearchHistory(this, SearchSettings.KEY_SUFFIX_TMDB); searchHistoryAdapter = new ArrayAdapter<>(this, R.layout.item_dropdown, searchHistory.getSearchHistory()); searchView.setAdapter(searchHistoryAdapter); // drop-down is auto-shown on config change, ensure it is hidden when recreating views searchView.dismissDropDown(); // setup clear button clearButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { searchView.setText(null); searchView.requestFocus(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.movies_search_menu, menu); MenuItem itemSearch = menu.findItem(R.id.menu_action_movies_search_display_search); itemSearch.setVisible(!showSearchView); itemSearch.setEnabled(!showSearchView); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.menu_action_movies_search_change_language) { MovieLocalizationDialogFragment.show(getSupportFragmentManager()); return true; } if (itemId == R.id.menu_action_movies_search_display_search) { setSearchViewVisible(true); Utils.showSoftKeyboardOnSearchView(this, searchView); showSearchView = true; supportInvalidateOptionsMenu(); return true; } if (itemId == R.id.menu_action_movies_search_clear_history) { searchHistory.clearHistory(); searchHistoryAdapter.clear(); // setting text to null seems to fix the dropdown from not clearing searchView.setText(null); return true; } return super.onOptionsItemSelected(item); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(STATE_SEARCH_VISIBLE, showSearchView); } @Subscribe(threadMode = ThreadMode.MAIN) public void onEventLanguageChanged( MovieLocalizationDialogFragment.LocalizationChangedEvent event) { // just run the current search again search(); } @Override public void onSearchClick() { search(); } private void search() { Fragment fragment = getSupportFragmentManager().findFragmentById( R.id.containerMoviesSearchFragment); if (fragment == null) { return; } String query = searchView.getText().toString().trim(); // perform search MoviesSearchFragment searchFragment = (MoviesSearchFragment) fragment; searchFragment.search(query); // update history if (searchHistory.saveRecentSearch(query)) { searchHistoryAdapter.clear(); searchHistoryAdapter.addAll(searchHistory.getSearchHistory()); } } private void setSearchViewVisible(boolean visible) { containerSearchBar.setVisibility(visible ? View.VISIBLE : View.GONE); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(!visible); } } private View.OnClickListener searchViewClickListener = new View.OnClickListener() { @Override public void onClick(View v) { searchView.showDropDown(); } }; private AdapterView.OnItemClickListener searchViewItemClickListener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { search(); } }; private TextView.OnEditorActionListener searchViewActionListener = new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH || (event != null && event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { search(); return true; } return false; } }; }