package fi.bitrite.android.ws.activity;
import android.app.Dialog;
import android.app.SearchManager;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
import com.google.android.gms.analytics.GoogleAnalytics;
import fi.bitrite.android.ws.R;
import fi.bitrite.android.ws.WSAndroidApplication;
import fi.bitrite.android.ws.api.RestClient;
import fi.bitrite.android.ws.host.Search;
import fi.bitrite.android.ws.host.impl.RestTextSearch;
import fi.bitrite.android.ws.model.Host;
import fi.bitrite.android.ws.model.HostBriefInfo;
import fi.bitrite.android.ws.util.Tools;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ListSearchTabActivity
extends WSBaseActivity
implements android.widget.AdapterView.OnItemClickListener {
ArrayList<HostBriefInfo> mListSearchHosts;
String mQuery = "";
TextView mNoNetworkWarning;
ListView mListSearchResult;
DialogHandler mDialogHandler;
TextSearchTask mTextSearchTask;
LinearLayout mSearchEditLayout;
LinearLayout mSearchResultsLayout;
TextView mMultipleHostsAddress;
TextView mHostsAtAddress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_tab);
// Tell the BaseActivity to use a back action in the toolbar instead of the hamburger
mHasBackIntent = true;
initView();
mDialogHandler = new DialogHandler(this);
mNoNetworkWarning = (TextView) findViewById(R.id.noNetworkWarningList);
mListSearchResult = (ListView) findViewById(R.id.lstSearchResult);
mSearchResultsLayout = (LinearLayout) findViewById(R.id.listSummaryLayout);
mMultipleHostsAddress = (TextView) findViewById(R.id.multipleHostAddress);
mHostsAtAddress = (TextView) findViewById(R.id.hostsAtAddress);
mListSearchResult.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(ListSearchTabActivity.this, HostInformationActivity.class);
HostBriefInfo briefInfo = (HostBriefInfo) mListSearchResult.getItemAtPosition(position);
Host host = Host.createFromBriefInfo(briefInfo);
i.putExtra("host", host);
i.putExtra("id", briefInfo.getId());
startActivityForResult(i, 0);
}
});
if (savedInstanceState != null) {
mListSearchHosts = savedInstanceState.getParcelableArrayList("list_search_hosts");
}
handleIntent(getIntent());
if (mQuery != null) {
getSupportActionBar().setTitle(getSupportActionBar().getTitle() + ": \"" + mQuery + "\"");
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
mQuery = intent.getStringExtra(SearchManager.QUERY);
doTextSearch(mQuery);
} else if (intent.hasExtra("search_results")) {
// TODO: What is search_results used for, why is it passed this way?
// It may be an obsolete attempt to show cluster members from maps2activity
mListSearchHosts = intent.getParcelableArrayListExtra("search_results");
if (!mListSearchHosts.isEmpty()) {
// Hide the SearchEdit
mSearchEditLayout.setVisibility(View.INVISIBLE);
mSearchEditLayout.getLayoutParams().height = 0;
// Show the search results header
mSearchResultsLayout.setVisibility(View.VISIBLE);
mSearchResultsLayout.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
mMultipleHostsAddress.setText(mListSearchHosts.get(0).getLocation());
mHostsAtAddress.setText(getString(R.string.host_count, mListSearchHosts.size()));
}
}
}
@Override
protected Dialog onCreateDialog(int id, Bundle args) {
return mDialogHandler.createDialog(id, getResources().getString(R.string.performing_search));
}
public void doTextSearch(String text) {
mDialogHandler.showDialog(DialogHandler.TEXT_SEARCH);
Search search = new RestTextSearch(text);
mTextSearchTask = new TextSearchTask();
mTextSearchTask.execute(search);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
super.onItemClick(parent, view, position, id);
}
private class TextSearchTask extends AsyncTask<Search, Void, Object> {
@Override
protected Object doInBackground(Search... params) {
Search search = params[0];
Object retObj;
try {
retObj = search.doSearch();
} catch (Exception e) {
Log.e(WSAndroidApplication.TAG, e.getMessage(), e);
retObj = e;
}
return retObj;
}
@SuppressWarnings("unchecked")
@Override
protected void onPostExecute(Object result) {
mDialogHandler.dismiss();
if (result instanceof Exception) {
RestClient.reportError(ListSearchTabActivity.this, result);
return;
}
mListSearchHosts = (ArrayList<HostBriefInfo>) result;
// Sort so that available hosts come up first
Collections.sort(mListSearchHosts, new Comparator<HostBriefInfo>() {
public int compare(HostBriefInfo h1, HostBriefInfo h2) {
return h1.getNotCurrentlyAvailableAsInt() - h2.getNotCurrentlyAvailableAsInt();
}
});
mListSearchResult.setAdapter(new HostListAdapter(WSAndroidApplication.getAppContext(),
R.layout.host_list_item, mQuery, mListSearchHosts));
if (mListSearchHosts.isEmpty()) {
mDialogHandler.alert(getResources().getString(R.string.no_results));
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("list_search_hosts", mListSearchHosts);
if (DialogHandler.inProgress() && mTextSearchTask != null) {
mTextSearchTask.cancel(true);
}
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
if (!Tools.isNetworkConnected(this)) {
mNoNetworkWarning.setText(getString(R.string.not_connected_to_network));
return;
}
mNoNetworkWarning.setText("");
mNoNetworkWarning.setVisibility(View.GONE);
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
GoogleAnalytics.getInstance(this).reportActivityStop(this);
super.onStop();
}
@Override
protected void onStart() {
super.onStart();
GoogleAnalytics.getInstance(this).reportActivityStart(this);
}
}