diff options
author | Bananeweizen <bananeweizen@gmx.de> | 2012-05-06 09:29:22 +0200 |
---|---|---|
committer | Bananeweizen <bananeweizen@gmx.de> | 2012-05-06 09:29:22 +0200 |
commit | c5e42735b99baaebbc41e697ff716189821cd02c (patch) | |
tree | de2ccf5f2fd941846060a43194d7b2425ea334eb /main/src/cgeo/geocaching/SearchActivity.java | |
parent | f08a9d96915d1f8477b32f9c0b25372a518c5294 (diff) | |
download | cgeo-c5e42735b99baaebbc41e697ff716189821cd02c.zip cgeo-c5e42735b99baaebbc41e697ff716189821cd02c.tar.gz cgeo-c5e42735b99baaebbc41e697ff716189821cd02c.tar.bz2 |
refactoring: remove waypoints activity
* replaced by popup meanwhile
* rename remaining waypoint activity
* rename some of the mostly untouched activities
Diffstat (limited to 'main/src/cgeo/geocaching/SearchActivity.java')
-rw-r--r-- | main/src/cgeo/geocaching/SearchActivity.java | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java new file mode 100644 index 0000000..51bccac --- /dev/null +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -0,0 +1,405 @@ +package cgeo.geocaching; + +import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.connector.gc.GCConstants; +import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.EditUtils; +import cgeo.geocaching.utils.IObserver; +import cgeo.geocaching.utils.Log; + +import org.apache.commons.lang3.StringUtils; + +import android.app.SearchManager; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.EditText; + +public class SearchActivity extends AbstractActivity implements IObserver<IGeoData> { + + public static final String EXTRAS_KEYWORDSEARCH = "keywordsearch"; + + private static final int MENU_SEARCH_OWN_CACHES = 1; + private EditText latEdit = null; + private EditText lonEdit = null; + + public SearchActivity() { + super("c:geo-search"); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // init + app.setAction(null); + + // search query + Intent intent = getIntent(); + if (Intent.ACTION_SEARCH.equals(intent.getAction())) { + final String query = intent.getStringExtra(SearchManager.QUERY); + final boolean keywordSearch = intent.getBooleanExtra(EXTRAS_KEYWORDSEARCH, true); + + if (instantSearch(query, keywordSearch)) { + setResult(RESULT_OK); + } else { + // send intent back so query string is known + setResult(RESULT_CANCELED, intent); + } + finish(); + + return; + } + + setTheme(); + setContentView(R.layout.search); + setTitle(res.getString(R.string.search)); + + init(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + init(); + } + + @Override + public void onResume() { + super.onResume(); + app.addGeoObserver(this); + init(); + } + + @Override + public void onPause() { + app.deleteGeoObserver(this); + super.onPause(); + } + + /** + * Performs a search for query either as geocode, trackable code or keyword + * + * @param query + * String to search for + * @param keywordSearch + * Set to true if keyword search should be performed if query isn't GC or TB + * @return true if a search was performed, else false + */ + private boolean instantSearch(final String query, final boolean keywordSearch) { + final String geocode = BaseUtils.getMatch(query, GCConstants.PATTERN_GC_CODE, true, 0, "", false); + if (StringUtils.isNotBlank(geocode)) { + final Intent cachesIntent = new Intent(this, CacheDetailActivity.class); + cachesIntent.putExtra("geocode", geocode.toUpperCase()); + startActivity(cachesIntent); + return true; + } + + final String trackable = BaseUtils.getMatch(query, GCConstants.PATTERN_TB_CODE, true, 0, "", false); + if (StringUtils.isNotBlank(trackable)) { + final Intent trackablesIntent = new Intent(this, cgeotrackable.class); + trackablesIntent.putExtra("geocode", trackable.toUpperCase()); + startActivity(trackablesIntent); + return true; + } + + if (keywordSearch) { // keyword fallback, if desired by caller + cgeocaches.startActivityKeyword(this, query.trim()); + return true; + } + + return false; + } + + private void init() { + Settings.getLogin(); + + ((Button) findViewById(R.id.buttonLatitude)).setOnClickListener(new findByCoordsAction()); + ((Button) findViewById(R.id.buttonLongitude)).setOnClickListener(new findByCoordsAction()); + + final Button findByCoords = (Button) findViewById(R.id.search_coordinates); + findByCoords.setOnClickListener(new findByCoordsListener()); + + EditUtils.setActionListener((EditText) findViewById(R.id.address), new Runnable() { + + @Override + public void run() { + findByAddressFn(); + } + }); + + final Button findByAddress = (Button) findViewById(R.id.search_address); + findByAddress.setOnClickListener(new findByAddressListener()); + + final AutoCompleteTextView geocodeEdit = (AutoCompleteTextView) findViewById(R.id.geocode); + EditUtils.setActionListener(geocodeEdit, new Runnable() { + + @Override + public void run() { + findByGeocodeFn(); + } + }); + final String[] geocodesInCache = app.geocodesInCache(); + if (geocodesInCache != null) { + final ArrayAdapter<String> geocodesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, geocodesInCache); + geocodeEdit.setAdapter(geocodesAdapter); + } + + final Button displayByGeocode = (Button) findViewById(R.id.display_geocode); + displayByGeocode.setOnClickListener(new findByGeocodeListener()); + + EditUtils.setActionListener((EditText) findViewById(R.id.keyword), new Runnable() { + + @Override + public void run() { + findByKeywordFn(); + } + }); + + final Button findByKeyword = (Button) findViewById(R.id.search_keyword); + findByKeyword.setOnClickListener(new findByKeywordListener()); + + EditUtils.setActionListener((EditText) findViewById(R.id.username), new Runnable() { + + @Override + public void run() { + findByUsernameFn(); + } + }); + + final Button findByUserName = (Button) findViewById(R.id.search_username); + findByUserName.setOnClickListener(new findByUsernameListener()); + + EditUtils.setActionListener((EditText) findViewById(R.id.owner), new Runnable() { + + @Override + public void run() { + findByOwnerFn(); + } + }); + + final Button findByOwner = (Button) findViewById(R.id.search_owner); + findByOwner.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View arg0) { + findByOwnerFn(); + } + }); + + EditText trackable = (EditText) findViewById(R.id.trackable); + EditUtils.setActionListener(trackable, new Runnable() { + + @Override + public void run() { + findTrackableFn(); + } + }); + disableSuggestions(trackable); + + final Button displayTrackable = (Button) findViewById(R.id.display_trackable); + displayTrackable.setOnClickListener(new findTrackableListener()); + } + + @Override + public void update(final IGeoData geo) { + try { + if (latEdit == null) { + latEdit = (EditText) findViewById(R.id.latitude); + } + if (lonEdit == null) { + lonEdit = (EditText) findViewById(R.id.longitude); + } + + if (geo.getCoords() != null) { + if (latEdit != null) { + latEdit.setHint(geo.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE_RAW)); + } + if (lonEdit != null) { + lonEdit.setHint(geo.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE_RAW)); + } + } + } catch (Exception e) { + Log.w("Failed to update location."); + } + } + + private class findByCoordsAction implements OnClickListener { + + @Override + public void onClick(View arg0) { + cgeocoords coordsDialog = new cgeocoords(SearchActivity.this, null, null, app.currentGeo()); + coordsDialog.setCancelable(true); + coordsDialog.setOnCoordinateUpdate(new cgeocoords.CoordinateUpdate() { + @Override + public void update(Geopoint gp) { + ((Button) findViewById(R.id.buttonLatitude)).setText(gp.format(GeopointFormatter.Format.LAT_DECMINUTE)); + ((Button) findViewById(R.id.buttonLongitude)).setText(gp.format(GeopointFormatter.Format.LON_DECMINUTE)); + } + }); + coordsDialog.show(); + } + } + + private class findByCoordsListener implements View.OnClickListener { + + public void onClick(View arg0) { + findByCoordsFn(); + } + } + + private void findByCoordsFn() { + final Button latView = (Button) findViewById(R.id.buttonLatitude); + final Button lonView = (Button) findViewById(R.id.buttonLongitude); + final String latText = latView.getText().toString(); + final String lonText = lonView.getText().toString(); + + if (StringUtils.isEmpty(latText) || StringUtils.isEmpty(lonText)) { + final IGeoData geo = app.currentGeo(); + if (geo.getCoords() != null) { + latView.setText(geo.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE)); + lonView.setText(geo.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE)); + } + } else { + try { + cgeocaches.startActivityCoordinates(this, new Geopoint(latText, lonText)); + } catch (Geopoint.ParseException e) { + showToast(res.getString(e.resource)); + } + } + } + + private class findByKeywordListener implements View.OnClickListener { + + public void onClick(View arg0) { + findByKeywordFn(); + } + } + + private void findByKeywordFn() { + // find caches by coordinates + String keyText = ((EditText) findViewById(R.id.keyword)).getText().toString(); + + if (StringUtils.isBlank(keyText)) { + helpDialog(res.getString(R.string.warn_search_help_title), res.getString(R.string.warn_search_help_keyword)); + return; + } + + cgeocaches.startActivityKeyword(this, keyText); + } + + private class findByAddressListener implements View.OnClickListener { + public void onClick(View arg0) { + findByAddressFn(); + } + } + + private void findByAddressFn() { + final String addText = ((EditText) findViewById(R.id.address)).getText().toString(); + + if (StringUtils.isBlank(addText)) { + helpDialog(res.getString(R.string.warn_search_help_title), res.getString(R.string.warn_search_help_address)); + return; + } + + final Intent addressesIntent = new Intent(this, AdressListActivity.class); + addressesIntent.putExtra("keyword", addText); + startActivity(addressesIntent); + } + + private class findByUsernameListener implements View.OnClickListener { + + public void onClick(View arg0) { + findByUsernameFn(); + } + } + + public void findByUsernameFn() { + final String usernameText = ((EditText) findViewById(R.id.username)).getText().toString(); + + if (StringUtils.isBlank(usernameText)) { + helpDialog(res.getString(R.string.warn_search_help_title), res.getString(R.string.warn_search_help_user)); + return; + } + + cgeocaches.startActivityUserName(this, usernameText); + } + + private void findByOwnerFn() { + findByOwnerFn(((EditText) findViewById(R.id.owner)).getText().toString()); + } + + private void findByOwnerFn(String userName) { + final String usernameText = StringUtils.trimToEmpty(userName); + + if (StringUtils.isBlank(usernameText)) { + helpDialog(res.getString(R.string.warn_search_help_title), res.getString(R.string.warn_search_help_user)); + return; + } + + cgeocaches.startActivityOwner(this, usernameText); + } + + private class findByGeocodeListener implements View.OnClickListener { + + public void onClick(View arg0) { + findByGeocodeFn(); + } + } + + private void findByGeocodeFn() { + final String geocodeText = ((EditText) findViewById(R.id.geocode)).getText().toString(); + + if (StringUtils.isBlank(geocodeText) || geocodeText.equalsIgnoreCase("GC")) { + helpDialog(res.getString(R.string.warn_search_help_title), res.getString(R.string.warn_search_help_gccode)); + return; + } + + CacheDetailActivity.startActivity(this, geocodeText); + } + + private class findTrackableListener implements View.OnClickListener { + + public void onClick(View arg0) { + findTrackableFn(); + } + } + + private void findTrackableFn() { + final String trackableText = ((EditText) findViewById(R.id.trackable)).getText().toString(); + + if (StringUtils.isBlank(trackableText) || trackableText.equalsIgnoreCase("TB")) { + helpDialog(res.getString(R.string.warn_search_help_title), res.getString(R.string.warn_search_help_tb)); + return; + } + + final Intent trackablesIntent = new Intent(this, cgeotrackable.class); + trackablesIntent.putExtra("geocode", trackableText.toUpperCase()); + startActivity(trackablesIntent); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + menu.add(0, MENU_SEARCH_OWN_CACHES, 0, res.getString(R.string.search_own_caches)).setIcon(R.drawable.ic_menu_myplaces); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == MENU_SEARCH_OWN_CACHES) { + findByOwnerFn(Settings.getUsername()); + return true; + } + return super.onOptionsItemSelected(item); + } +} |