From 3fbe17cf3f76203a26b4bac7535d211a2b6a738d Mon Sep 17 00:00:00 2001 From: rikky Date: Fri, 23 Sep 2011 19:38:40 +0000 Subject: [PATCH] Add:android:Add last destinations to android search dialog, introduce class for persistent settings and some more cleanup git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4789 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/android/AndroidManifest.xml.cmake | 3 +- navit/navit/android/AndroidManifest.xml.in | 3 +- .../android/src/org/navitproject/navit/Navit.java | 142 ++++++++------------- .../navit/NavitAddressResultListActivity.java | 32 ++--- .../navit/NavitAddressSearchActivity.java | 53 ++++++-- .../src/org/navitproject/navit/NavitAppConfig.java | 68 ++++++++++ .../src/org/navitproject/navit/NavitGraphics.java | 8 +- navit/navit/search.c | 10 +- 8 files changed, 188 insertions(+), 131 deletions(-) create mode 100755 navit/navit/android/src/org/navitproject/navit/NavitAppConfig.java diff --git a/navit/navit/android/AndroidManifest.xml.cmake b/navit/navit/android/AndroidManifest.xml.cmake index e7784f0..b32c7ad 100644 --- a/navit/navit/android/AndroidManifest.xml.cmake +++ b/navit/navit/android/AndroidManifest.xml.cmake @@ -6,7 +6,8 @@ android:versionName="@ANDROID_VERSION_NAME@" android:installLocation="auto"> + android:icon="@drawable/icon" + android:name=".NavitAppConfig"> + android:icon="@drawable/icon" + android:name=".NavitAppConfig"> L -> item.id_hi item.id_lo @@ -91,8 +91,9 @@ public class Navit extends Activity public static final int MAP_NUM_PRIMARY = 11; public static final int NavitAddressSearch_id = 70; public static final int NavitAddressResultList_id = 71; - public static List NavitAddressResultList_foundItems - = new ArrayList(); + + public static List NavitAddressResultList_foundItems + = new ArrayList(); public static final int MAP_NUM_SECONDARY = 12; static final String MAP_FILENAME_PATH = "/sdcard/navit/"; @@ -678,12 +679,7 @@ public class Navit extends Activity Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); search_intent.putExtra("title", Navit.get_text("Enter: City and Street")); //TRANS search_intent.putExtra("address_string", NavitDialogs.Navit_last_address_search_string); - String pm_temp = "0"; - if ( NavitDialogs.Navit_last_address_partial_match) - { - pm_temp = "1"; - } - search_intent.putExtra("partial_match", pm_temp); + search_intent.putExtra("partial_match", NavitDialogs.Navit_last_address_partial_match); this.startActivityForResult(search_intent, NavitAddressSearch_id); break; case 88 : @@ -693,17 +689,23 @@ public class Navit extends Activity // exit this.onStop(); this.exit(); - //msg = new Message(); - //b = new Bundle(); - //b.putInt("Callback", 5); - //b.putString("cmd", "quit();"); - //msg.setData(b); - //N_NavitGraphics.callback_handler.sendMessage(msg); break; } return true; } + void setDestination(float latitude, float longitude, String address) { + Toast.makeText( getApplicationContext(), + Navit.get_text("setting destination to") + "\n" + address, Toast.LENGTH_LONG).show(); //TRANS + + Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); + Bundle b = new Bundle(); + b.putFloat("lat", latitude); + b.putFloat("lon", longitude); + b.putString("q", address); + msg.setData(b); + msg.sendToTarget(); + } protected void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -720,53 +722,40 @@ public class Navit extends Activity } break; case NavitAddressSearch_id : - try - { - if (resultCode == Activity.RESULT_OK) - { - try - { - String addr = data.getStringExtra("address_string"); - Boolean partial_match = data.getStringExtra("partial_match").equals("1"); - String country = data.getStringExtra("country"); - - NavitDialogs.Navit_last_address_partial_match = partial_match; - NavitDialogs.Navit_last_address_search_string = addr; - NavitDialogs.Navit_last_country = country; - - // clear results - Navit.NavitAddressResultList_foundItems.clear(); - Navit.search_results_towns = 0; - Navit.search_results_streets = 0; - Navit.search_results_streets_hn = 0; - - if (addr.equals("")) - { - // empty search string entered - Toast.makeText(getApplicationContext(), - Navit.get_text("No search string entered"), Toast.LENGTH_LONG).show(); //TRANS - } - else - { - // show dialog, and start search for the results - // make it indirect, to give our activity a chance to startup - // (remember we come straight from another activity and ours is still paused!) - dialogs.obtainMessage(NavitDialogs.MSG_SEARCH).sendToTarget(); - } - } - catch (NumberFormatException e) - { - Log.d("Navit", "NumberFormatException selected_id"); + if (resultCode == Activity.RESULT_OK) { + Boolean addr_selected = data.getBooleanExtra("addr_selected", false); + + // address already choosen, or do we have to search? + if (addr_selected) { + setDestination( NavitAddressResultList_foundItems .get(0).lat + , NavitAddressResultList_foundItems.get(0).lon + , NavitAddressResultList_foundItems.get(0).addr); + } else { + String addr = data.getStringExtra("address_string"); + Boolean partial_match = data.getBooleanExtra("partial_match", false); + String country = data.getStringExtra("country"); + + NavitDialogs.Navit_last_address_partial_match = partial_match; + NavitDialogs.Navit_last_address_search_string = addr; + NavitDialogs.Navit_last_country = country; + + // clear results + Navit.NavitAddressResultList_foundItems.clear(); + Navit.search_results_towns = 0; + Navit.search_results_streets = 0; + Navit.search_results_streets_hn = 0; + + if (addr.equals("")) { + // empty search string entered + Toast.makeText(getApplicationContext(), + Navit.get_text("No search string entered"), Toast.LENGTH_LONG).show(); //TRANS + } else { + // show dialog, and start search for the results + // make it indirect, to give our activity a chance to startup + // (remember we come straight from another activity and ours is still paused!) + dialogs.obtainMessage(NavitDialogs.MSG_SEARCH).sendToTarget(); } } - else - { - // user pressed back key - } - } - catch (Exception e) - { - Log.d("Navit", "error on onActivityResult"); } break; case Navit.NavitAddressResultList_id : @@ -774,27 +763,11 @@ public class Navit extends Activity { if (resultCode == Activity.RESULT_OK) { - Log.d("Navit", "adress result list id=" - + Integer.parseInt(data.getStringExtra("selected_id"))); - // get the coords for the destination - int destination_id = Integer.parseInt(data.getStringExtra("selected_id")); - - // ok now set target - Toast.makeText( getApplicationContext(), - Navit.get_text("setting destination to") + "\n" - + Navit.NavitAddressResultList_foundItems.get(destination_id).addr, - Toast.LENGTH_LONG).show(); //TRANS - - Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); - Bundle b = new Bundle(); - b.putString("lat", String.valueOf(Navit.NavitAddressResultList_foundItems - .get(destination_id).lat)); - b.putString("lon", String.valueOf(Navit.NavitAddressResultList_foundItems - .get(destination_id).lon)); - b.putString("q", - Navit.NavitAddressResultList_foundItems.get(destination_id).addr); - msg.setData(b); - msg.sendToTarget(); + int destination_id = data.getIntExtra("selected_id", 0); + + setDestination( NavitAddressResultList_foundItems .get(destination_id).lat + , NavitAddressResultList_foundItems.get(destination_id).lon + , NavitAddressResultList_foundItems.get(destination_id).addr); } } catch (Exception e) @@ -860,12 +833,7 @@ public class Navit extends Activity Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); search_intent.putExtra("title", Navit.get_text("Enter: City and Street")); //TRANS search_intent.putExtra("address_string", search); - String pm_temp = "0"; - if (NavitDialogs.Navit_last_address_partial_match) - { - pm_temp = "1"; - } - search_intent.putExtra("partial_match", pm_temp); + search_intent.putExtra("partial_match", NavitDialogs.Navit_last_address_partial_match); this.startActivityForResult(search_intent, NavitAddressSearch_id); } } diff --git a/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java b/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java index da24b35..85671ed 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java @@ -32,10 +32,9 @@ import android.widget.ListView; public class NavitAddressResultListActivity extends ListActivity { - - private int selected_id = -1; - private Boolean is_empty = true; - public String[] result_list = new String[]{"loading results ..."}; + private int selected_id = -1; + private Boolean is_empty = true; + public String[] result_list = new String[]{"loading results ..."}; @Override public void onCreate(Bundle savedInstanceState) @@ -43,16 +42,15 @@ public class NavitAddressResultListActivity extends ListActivity super.onCreate(savedInstanceState); //Log.e("Navit", "all ok"); - Navit.Navit_Address_Result_Struct tmp = new Navit.Navit_Address_Result_Struct(); + Navit.NavitAddress tmp = new Navit.NavitAddress(); - Log.e("Navit", "########### full result count: " - + Navit.NavitAddressResultList_foundItems.size()); + Log.e("Navit", "full result count: " + Navit.NavitAddressResultList_foundItems.size()); // show "town names" as results only when we dont have any street names in resultlist if ((Navit.search_results_streets > 0) || (Navit.search_results_streets_hn > 0)) { // clear out towns from result list - for (Iterator k = Navit.NavitAddressResultList_foundItems + for (Iterator k = Navit.NavitAddressResultList_foundItems .iterator(); k.hasNext();) { tmp = k.next(); @@ -63,12 +61,11 @@ public class NavitAddressResultListActivity extends ListActivity } } - Log.e("Navit", "########### final result count: " - + Navit.NavitAddressResultList_foundItems.size()); + Log.e("Navit", "final result count: " + Navit.NavitAddressResultList_foundItems.size()); this.result_list = new String[Navit.NavitAddressResultList_foundItems.size()]; int j = 0; - for (Iterator i = Navit.NavitAddressResultList_foundItems + for (Iterator i = Navit.NavitAddressResultList_foundItems .iterator(); i.hasNext();) { tmp = i.next(); @@ -125,18 +122,15 @@ public class NavitAddressResultListActivity extends ListActivity executeDone(); } - // @Override - // public void onBackPressed() - // { - // executeDone(); - // super.onBackPressed(); - // } - private void executeDone() { Intent resultIntent = new Intent(); - resultIntent.putExtra("selected_id", String.valueOf(this.selected_id)); + resultIntent.putExtra("selected_id", selected_id); setResult(Activity.RESULT_OK, resultIntent); + + NavitAppConfig navitConfig = (NavitAppConfig)getApplicationContext(); + navitConfig.addLastAddress(Navit.NavitAddressResultList_foundItems.get(selected_id)); + finish(); } diff --git a/navit/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java b/navit/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java index 3029812..3dfbb8a 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java @@ -23,6 +23,7 @@ package org.navitproject.navit; import java.lang.reflect.Field; import java.util.Arrays; import java.util.Comparator; +import java.util.List; import java.util.Locale; import android.app.Activity; @@ -37,11 +38,15 @@ import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; +import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; @@ -53,9 +58,10 @@ public class NavitAddressSearchActivity extends Activity private CheckBox pm_checkbox; private String mCountry; private ImageButton mCountryButton; - + public RelativeLayout NavitAddressSearchActivity_layout; + private int getDrawableID(String resourceName) { int drawableId = 0; @@ -120,7 +126,6 @@ public class NavitAddressSearchActivity extends Activity pm_checkbox.setChecked(false); pm_checkbox.setGravity(Gravity.CENTER); - // search button final Button btnSearch = new Button(this); btnSearch.setText(Navit.get_text("Search")); //TRANS @@ -135,19 +140,45 @@ public class NavitAddressSearchActivity extends Activity } }); - Bundle extras = getIntent().getExtras(); + ListView lastAddresses = new ListView(this); + NavitAppConfig navitConfig = (NavitAppConfig)getApplicationContext(); + final List addresses = navitConfig.getLastAddresses(); + int addressCount = addresses.size(); + if (addressCount > 0) { + String[] strAddresses = new String[addressCount]; + for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { + strAddresses[addrIndex] = addresses.get(addrIndex).addr; + } + ArrayAdapter addressList = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, strAddresses); + lastAddresses.setAdapter(addressList); + lastAddresses.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { + Intent resultIntent = new Intent(); + resultIntent.putExtra("addr_selected", true); + + Navit.NavitAddressResultList_foundItems.clear(); + Navit.NavitAddressResultList_foundItems.add(addresses.get(arg2)); + + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } + }); + } + + Bundle extras = getIntent().getExtras(); if ( extras != null ) { String title = extras.getString("title"); - String partial = extras.getString("partial_match"); + Boolean partial = extras.getBoolean("partial_match"); String address = extras.getString("address_string"); if ( title != null && title.length() > 0) this.setTitle(title); - if (partial != null && partial.length() > 0) - pm_checkbox.setChecked(partial.equals("1")); + pm_checkbox.setChecked(partial); address_string = new EditText(this); if (address != null) @@ -163,6 +194,7 @@ public class NavitAddressSearchActivity extends Activity panel.addView(address_string); panel.addView(searchSettingsLayout); panel.addView(btnSearch); + panel.addView(lastAddresses); setContentView(panel); } @@ -208,14 +240,7 @@ public class NavitAddressSearchActivity extends Activity Intent resultIntent = new Intent(); resultIntent.putExtra("address_string", address_string.getText().toString()); resultIntent.putExtra("country", mCountry); - if (pm_checkbox.isChecked()) - { - resultIntent.putExtra("partial_match", "1"); - } - else - { - resultIntent.putExtra("partial_match", "0"); - } + resultIntent.putExtra("partial_match", pm_checkbox.isChecked()); setResult(Activity.RESULT_OK, resultIntent); finish(); } diff --git a/navit/navit/android/src/org/navitproject/navit/NavitAppConfig.java b/navit/navit/android/src/org/navitproject/navit/NavitAppConfig.java new file mode 100755 index 0000000..2b5090d --- /dev/null +++ b/navit/navit/android/src/org/navitproject/navit/NavitAppConfig.java @@ -0,0 +1,68 @@ +package org.navitproject.navit; + +import java.util.ArrayList; +import java.util.List; + +import org.navitproject.navit.Navit.NavitAddress; + +import android.app.Application; +import android.content.SharedPreferences; + +public class NavitAppConfig extends Application { + + private static final int MAX_LAST_ADDRESSES = 10; + + private List mLastAddresses = null; + private int mLastAddressField; + private SharedPreferences mSettings; + + @Override + public void onCreate() { + mSettings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + super.onCreate(); + } + + public List getLastAddresses() { + if (mLastAddresses == null) { + mLastAddresses = new ArrayList(); + int mLastAddressField = mSettings.getInt("LastAddress", -1); + if (mLastAddressField >= 0) { + int index = mLastAddressField; + do { + String addr_str = mSettings.getString("LastAddress_" + String.valueOf(index), ""); + + if (addr_str.length() > 0) { + Navit.NavitAddress address = new Navit.NavitAddress(); + address.addr = addr_str; + address.lat = mSettings.getFloat("LastAddress_Lat_" + String.valueOf(index), 0); + address.lon = mSettings.getFloat("LastAddress_Lon_" + String.valueOf(index), 0); + mLastAddresses.add(address); + } + + if (--index < 0) index = MAX_LAST_ADDRESSES - 1; + + } while (index != mLastAddressField); + } + } + return mLastAddresses; + } + + public void addLastAddress(Navit.NavitAddress newAddress) { + getLastAddresses(); + + mLastAddresses.add(newAddress); + if (mLastAddresses.size() > MAX_LAST_ADDRESSES) mLastAddresses.remove(0); + + mLastAddressField++; + if (mLastAddressField >= MAX_LAST_ADDRESSES) mLastAddressField = 0; + + SharedPreferences.Editor editSettings = mSettings.edit(); + + editSettings.putInt("LastAddress", mLastAddressField); + editSettings.putString("LastAddress_" + String.valueOf(mLastAddressField), newAddress.addr); + editSettings.putFloat("LastAddress_Lat_" + String.valueOf(mLastAddressField), newAddress.lat); + editSettings.putFloat("LastAddress_Lon_" + String.valueOf(mLastAddressField), newAddress.lon); + + editSettings.commit(); + } +} diff --git a/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java index 2520978..d100100 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java @@ -22,7 +22,7 @@ package org.navitproject.navit; import java.lang.reflect.Method; import java.util.ArrayList; -import org.navitproject.navit.Navit.Navit_Address_Result_Struct; +import org.navitproject.navit.Navit.NavitAddress; import android.app.Activity; import android.content.Context; @@ -741,8 +741,8 @@ public class NavitGraphics MotionCallback(MotionCallbackID, msg.getData().getInt("x"), msg.getData().getInt("y")); break; case CLB_SET_DESTINATION: - String lat = msg.getData().getString("lat"); - String lon = msg.getData().getString("lon"); + String lat = Float.toString(msg.getData().getFloat("lat")); + String lon = Float.toString(msg.getData().getFloat("lon")); String q = msg.getData().getString("q"); CallbackMessageChannel(3, lat + "#" + lon + "#" + q); break; @@ -926,7 +926,7 @@ public class NavitGraphics // deactivate the spinner NavitDialogs.NavitAddressSearchSpinnerActive = false; - Navit.Navit_Address_Result_Struct tmp_addr = new Navit_Address_Result_Struct(); + Navit.NavitAddress tmp_addr = new NavitAddress(); String[] tmp_s = s.split(":"); tmp_addr.result_type = tmp_s[0]; tmp_addr.item_id = tmp_s[1]; diff --git a/navit/navit/search.c b/navit/navit/search.c index fd32d08..2687d36 100644 --- a/navit/navit/search.c +++ b/navit/navit/search.c @@ -956,11 +956,11 @@ search_address_housenumber_real(GList *result_list, struct search_list *sl, char // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 max. 15 chars -> this sould be max. about 335 chars long if (slr->town->common.postal == NULL) { - buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s,%.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); + buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s, %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); } else { - buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s,%.7s %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); + buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s, %.7s %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); } // deactivated now * result_list=g_list_prepend(result_list,g_strdup(buffer)); #ifdef HAVE_API_ANDROID @@ -1081,11 +1081,11 @@ search_address_street(GList *result_list, struct search_list *sl, GList *phrases // TWN -> town if (slr->town->common.postal == NULL) { - buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s,%.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name); + buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s, %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name); } else { - buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s,%.7s %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name); + buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s, %.7s %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name); } // deactivated now * result_list=g_list_prepend(result_list,g_strdup(buffer)); #ifdef HAVE_API_ANDROID @@ -1158,7 +1158,7 @@ GList * search_by_address(struct search_list *sl, const char *addr, int partial, struct jni_object *jni) { char *str=search_fix_spaces(addr); - GList *tmp,*phrases=search_split_phrases(str); + GList *phrases=search_split_phrases(str); GList *ret = NULL; dbg(0,"enter %s\n",addr); ret=search_address_town(ret, sl, phrases, NULL, partial, jni); -- 2.7.4