package com.dozuki.ifixit.ui.search;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.dozuki.ifixit.App;
import com.dozuki.ifixit.R;
import com.dozuki.ifixit.model.search.SearchResults;
import com.dozuki.ifixit.ui.BaseSearchMenuDrawerActivity;
import com.dozuki.ifixit.util.api.ApiCall;
import com.dozuki.ifixit.util.api.ApiEvent;
import com.dozuki.ifixit.util.api.Api;
import com.squareup.otto.Subscribe;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
public class SearchActivity extends BaseSearchMenuDrawerActivity {
private static final int GUIDES_POSITION = 0;
private static final int TOPIC_POSITION = 1;
private static final String TOPIC_SEARCH_FRAGMENT = "TOPIC_SEARCH_FRAGMENT";
private static final String GUIDE_SEARCH_FRAGMENT = "GUIDE_SEARCH_FRAGMENT";
private static final String SEARCH_QUERY = "SEARCH_QUERY";
private String mQuery = "";
private Spinner mSpinner;
private int mSpinnerPosition = 0;
private String mCurrentTag;
private TextView mResultCount;
private boolean mFocusSearch = false;
public static Intent viewSearch(Context context, String query) {
Intent intent = new Intent(context, SearchActivity.class);
intent.putExtra(SEARCH_QUERY, query);
return intent;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setMenuDrawerSlideDrawable(R.drawable.abs__ic_ab_back_holo_dark);
setContentView(R.layout.search);
showLoading(R.id.search_results_container);
handleIntent(getIntent(), false);
mResultCount = (TextView) findViewById(R.id.search_result_count);
mSpinner = (Spinner) findViewById(R.id.search_type_spinner);
ArrayList<String> searchTypes = new ArrayList<String>();
searchTypes.add(GUIDES_POSITION, getString(R.string.guides));
searchTypes.add(TOPIC_POSITION, App.get().getSite().getObjectNamePlural());
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, searchTypes);
mSpinner.setAdapter(spinnerAdapter);
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mSpinnerPosition = position;
handleSearch(buildQuery(mQuery));
}
@Override
public void onNothingSelected(AdapterView<?> parent) { }
});
}
@Override
public void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent, true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@SuppressWarnings("unused")
@Subscribe
public void onSearchResults(ApiEvent.Search event) {
hideLoading();
if (!event.hasError()) {
SearchResults search = event.getResult();
mResultCount.setText(getString(R.string.result_count, search.mTotalResults));
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment frag = fm.findFragmentByTag(mCurrentTag);
if (frag == null) {
frag = SearchFragment.newInstance(search);
ft.replace(R.id.search_results_container, frag, mCurrentTag).commit();
} else {
((SearchFragment) frag).setSearchResults(search);
}
} else {
Api.getErrorDialog(this, event).show();
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (mFocusSearch) {
MenuItem searchItem = menu.findItem(R.id.action_search);
searchItem.expandActionView();
mFocusSearch = false;
}
return super.onPrepareOptionsMenu(menu);
}
public String buildQuery(String query) {
if (query.length() > 0) {
try {
query = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
switch (mSpinnerPosition) {
case GUIDES_POSITION:
mCurrentTag = GUIDE_SEARCH_FRAGMENT;
query += "?filter=guide,teardown";
break;
case TOPIC_POSITION:
mCurrentTag = TOPIC_SEARCH_FRAGMENT;
query += "?filter=device";
break;
}
}
return query;
}
private void handleSearch(String query) {
if (query.length() == 0) {
hideLoading();
focusSearch();
return;
}
showLoading(R.id.search_results_container);
Api.call(this, ApiCall.search(query));
}
private void focusSearch() {
mFocusSearch = true;
supportInvalidateOptionsMenu();
}
private void handleIntent(Intent intent, boolean sendQuery) {
Bundle extras = intent.getExtras();
if (extras != null && extras.getString(SEARCH_QUERY) != null) {
search(extras.getString(SEARCH_QUERY), sendQuery);
} else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
search(intent.getStringExtra(SearchManager.QUERY), sendQuery);
}
}
private void search(String query, boolean sendQuery) {
getSupportActionBar().setTitle(query);
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);
suggestions.saveRecentQuery(query, null);
mQuery = query;
if (sendQuery) {
handleSearch(buildQuery(mQuery));
}
}
}