add edit filter activity

git-svn-id: https://osmand.googlecode.com/svn/trunk@196 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
frolovmo 2010-06-22 12:10:16 +00:00
parent c7b8711743
commit 77f68ca6ee
9 changed files with 193 additions and 29 deletions

View file

@ -10,6 +10,6 @@
<TextView android:id="@+id/filter_poi_label" <TextView android:id="@+id/filter_poi_label"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_height="wrap_content"
android:textSize="25px"></TextView> android:textSize="25px"></TextView>
</LinearLayout> </LinearLayout>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<group android:menuCategory="container" android:id="@+id/edit_filter_context_menu">
<item android:title="@string/edit_filter_save_as_menu_item" android:id="@+id/edit_filter_save_as" android:icon="@android:drawable/ic_menu_save"></item>
<item android:title="@string/edit_filter_delete_menu_item" android:id="@+id/edit_filter_delete" android:icon="@android:drawable/ic_menu_delete"></item>
</group>
</menu>

View file

@ -10,4 +10,5 @@
<item android:id="@+id/map_show_settings" android:title="@string/settings_Button" android:icon="@android:drawable/ic_menu_preferences"></item> <item android:id="@+id/map_show_settings" android:title="@string/settings_Button" android:icon="@android:drawable/ic_menu_preferences"></item>
</group> </group>
</menu> </menu>

View file

@ -216,4 +216,10 @@
<string name="default_buttons_commit">Сохранить</string> <string name="default_buttons_commit">Сохранить</string>
<string name="default_buttons_reset">Сброс</string> <string name="default_buttons_reset">Сброс</string>
<string name="filter_current_poiButton">Фильтровать</string> <string name="filter_current_poiButton">Фильтровать</string>
<string name="edit_filter_delete_menu_item">Удалить</string>
<string name="edit_filter_save_as_menu_item">Сохранить как</string>
<string name="edit_filter_delete_dialog_title">Вы действительно хотите удалить текущий фильтр?</string>
<string name="edit_filter_delete_message">Фильтр {0} удален</string>
<string name="edit_filter_create_message">Фильтр {0} создан</string>
<string name="default_buttons_selectall">Выделить все</string>
</resources> </resources>

View file

@ -218,4 +218,10 @@
<string name="default_buttons_commit">Commit</string> <string name="default_buttons_commit">Commit</string>
<string name="default_buttons_reset">Reset</string> <string name="default_buttons_reset">Reset</string>
<string name="filter_current_poiButton">Filter</string> <string name="filter_current_poiButton">Filter</string>
<string name="edit_filter_delete_menu_item">Delete</string>
<string name="edit_filter_save_as_menu_item">Save As</string>
<string name="edit_filter_delete_dialog_title">Are you sure about deleting selected filter?</string>
<string name="edit_filter_delete_message">Filter {0} has been deleted</string>
<string name="edit_filter_create_message">Filter {0} has been created</string>
<string name="default_buttons_selectall">Select All</string>
</resources> </resources>

View file

@ -1,5 +1,6 @@
package com.osmand; package com.osmand;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -107,7 +108,7 @@ public class PoiFilter {
* @return null if all subtypes are accepted/ empty list if type is not accepted at all * @return null if all subtypes are accepted/ empty list if type is not accepted at all
*/ */
public List<String> getAcceptedSubtypes(AmenityType type){ public List<String> getAcceptedSubtypes(AmenityType type){
if(acceptedTypes.containsKey(type)){ if(!acceptedTypes.containsKey(type)){
return Collections.emptyList(); return Collections.emptyList();
} }
return acceptedTypes.get(type); return acceptedTypes.get(type);
@ -136,7 +137,7 @@ public class PoiFilter {
public void setTypeToAccept(AmenityType type, boolean accept){ public void setTypeToAccept(AmenityType type, boolean accept){
if(accept){ if(accept){
acceptedTypes.put(type, null); acceptedTypes.put(type, new ArrayList<String>());
} else { } else {
acceptedTypes.remove(type); acceptedTypes.remove(type);
} }
@ -177,7 +178,6 @@ public class PoiFilter {
} }
b.append(")"); //$NON-NLS-1$ b.append(")"); //$NON-NLS-1$
} }
b.append(")"); //$NON-NLS-1$ b.append(")"); //$NON-NLS-1$
return b.toString(); return b.toString();
} }

View file

@ -128,10 +128,13 @@ public class PoiFiltersHelper {
} }
public static boolean removePoiFilter(Context ctx, PoiFilter filter){ public static boolean removePoiFilter(Context ctx, PoiFilter filter){
if(filter.getFilterId().equals(PoiFilter.CUSTOM_FILTER_ID)){
return false;
}
PoiFilterDbHelper helper = new PoiFilterDbHelper(ctx); PoiFilterDbHelper helper = new PoiFilterDbHelper(ctx);
boolean res = helper.deleteFilter(filter); boolean res = helper.deleteFilter(filter);
if(res){ if(res){
getUserDefinedPoiFilters(ctx).remove(filter); cacheUserDefinedFilters.remove(filter);
} }
helper.close(); helper.close();
return res; return res;
@ -141,13 +144,16 @@ public class PoiFiltersHelper {
PoiFilterDbHelper helper = new PoiFilterDbHelper(ctx); PoiFilterDbHelper helper = new PoiFilterDbHelper(ctx);
boolean res = helper.addFilter(filter, helper.getWritableDatabase(), false); boolean res = helper.addFilter(filter, helper.getWritableDatabase(), false);
if(res){ if(res){
getUserDefinedPoiFilters(ctx).add(filter); cacheUserDefinedFilters.add(filter);
} }
helper.close(); helper.close();
return res; return res;
} }
public static boolean editPoiFilter(Context ctx, PoiFilter filter){ public static boolean editPoiFilter(Context ctx, PoiFilter filter){
if(filter.getFilterId().equals(PoiFilter.CUSTOM_FILTER_ID)){
return false;
}
PoiFilterDbHelper helper = new PoiFilterDbHelper(ctx); PoiFilterDbHelper helper = new PoiFilterDbHelper(ctx);
boolean res = helper.editFilter(filter); boolean res = helper.editFilter(filter);
helper.close(); helper.close();

View file

@ -3,23 +3,34 @@
*/ */
package com.osmand.activities; package com.osmand.activities;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.ListActivity; import android.app.ListActivity;
import android.app.AlertDialog.Builder; import android.app.AlertDialog.Builder;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.ImageView; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.osmand.OsmandSettings;
import com.osmand.PoiFilter; import com.osmand.PoiFilter;
import com.osmand.PoiFiltersHelper; import com.osmand.PoiFiltersHelper;
import com.osmand.R; import com.osmand.R;
@ -44,8 +55,10 @@ public class EditPOIFilterActivity extends ListActivity {
filterLevel.setOnClickListener(new OnClickListener() { filterLevel.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
// TODO OsmandSettings.setPoiFilterForMap(EditPOIFilterActivity.this, filter.getFilterId());
OsmandSettings.setShowPoiOverMap(EditPOIFilterActivity.this, true);
Intent newIntent = new Intent(EditPOIFilterActivity.this, MapActivity.class);
startActivity(newIntent);
} }
}); });
@ -56,20 +69,130 @@ public class EditPOIFilterActivity extends ListActivity {
setListAdapter(new AmenityAdapter(AmenityType.getCategories())); setListAdapter(new AmenityAdapter(AmenityType.getCategories()));
} }
private void showDialog(AmenityType amenity) { public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.edit_filter_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.edit_filter_delete) {
EditPOIFilterActivity.this.finish();
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.edit_filter_delete_dialog_title);
builder.setNegativeButton(R.string.default_buttons_no, null);
builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (PoiFiltersHelper.removePoiFilter(EditPOIFilterActivity.this, filter)) {
Toast.makeText(
EditPOIFilterActivity.this,
MessageFormat.format(EditPOIFilterActivity.this.getText(R.string.edit_filter_delete_message).toString(),
filter.getName()), Toast.LENGTH_SHORT).show();
}
}
});
builder.create().show();
return true;
} else if (item.getItemId() == R.id.edit_filter_save_as) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.edit_filter_save_as_menu_item);
final EditText editText = new EditText(this);
builder.setView(editText);
builder.setNegativeButton(R.string.default_buttons_cancel, null);
builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PoiFilter nFilter = new PoiFilter(editText.getText().toString(), null, filter.getAcceptedTypes());
if (PoiFiltersHelper.createPoiFilter(EditPOIFilterActivity.this, nFilter)) {
Toast.makeText(
EditPOIFilterActivity.this,
MessageFormat.format(EditPOIFilterActivity.this.getText(R.string.edit_filter_create_message).toString(),
editText.getText().toString()), Toast.LENGTH_SHORT).show();
}
EditPOIFilterActivity.this.finish();
}
});
builder.create().show();
return true;
}
return super.onOptionsItemSelected(item);
}
private void showDialog(final AmenityType amenity) {
Builder builder = new AlertDialog.Builder(this); Builder builder = new AlertDialog.Builder(this);
ScrollView scroll = new ScrollView(this); ScrollView scroll = new ScrollView(this);
ListView listView = new ListView(this); ListView listView = new ListView(this);
final List<String> accepted = new ArrayList<String>();
final LinkedHashSet<String> subCategories = new LinkedHashSet<String>(AmenityType.getSubCategories(amenity));
List<String> subtypes = filter.getAcceptedSubtypes(amenity);
boolean allSubTypesAccepted = subtypes == null;
LinkedHashSet<String> acceptedCategories = subtypes == null ? null : new LinkedHashSet<String>(subtypes);
if (subtypes != null) {
for (String s : acceptedCategories) {
if (!subCategories.contains(s)) {
subCategories.add(s);
}
}
}
final String[] array = subCategories.toArray(new String[0]);
boolean[] selected = new boolean[array.length];
for (int i = 0; i < selected.length; i++) {
if (allSubTypesAccepted) {
selected[i] = true;
accepted.add(array[i]);
} else {
selected[i] = acceptedCategories.contains(array[i]);
if (selected[i]) {
accepted.add(array[i]);
}
}
}
scroll.addView(listView); scroll.addView(listView);
builder.setView(scroll); builder.setView(scroll);
builder.setNegativeButton("Close", null); builder.setNegativeButton(EditPOIFilterActivity.this.getText(R.string.default_buttons_cancel), new DialogInterface.OnClickListener() {
builder.setNeutralButton("Select all", null);
builder.setMultiChoiceItems(AmenityType.getSubCategories(amenity).toArray(new String[0]), null, null); @Override
public void onClick(DialogInterface dialog, int which) {
if (subCategories.size() == accepted.size()) {
filter.selectSubTypesToAccept(amenity, null);
} else {
filter.selectSubTypesToAccept(amenity, accepted);
}
PoiFiltersHelper.editPoiFilter(EditPOIFilterActivity.this, filter);
((AmenityAdapter) EditPOIFilterActivity.this.getListAdapter()).notifyDataSetInvalidated();
}
});
builder.setNeutralButton(EditPOIFilterActivity.this.getText(R.string.default_buttons_selectall), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
filter.selectSubTypesToAccept(amenity, null);
PoiFiltersHelper.editPoiFilter(EditPOIFilterActivity.this, filter);
((AmenityAdapter) EditPOIFilterActivity.this.getListAdapter()).notifyDataSetInvalidated();
}
});
builder.setMultiChoiceItems(array, selected, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int item, boolean isChecked) {
if (isChecked && !accepted.contains(array[item])) {
accepted.add(array[item]);
} else if (!isChecked && accepted.contains(array[item])) {
accepted.remove(array[item]);
}
}
});
builder.show(); builder.show();
} }
class AmenityAdapter extends ArrayAdapter<AmenityType> { class AmenityAdapter extends ArrayAdapter<AmenityType> {
AmenityAdapter(AmenityType[] amenityTypes) { AmenityAdapter(AmenityType[] amenityTypes) {
super(EditPOIFilterActivity.this, R.layout.editing_poi_filter_list, amenityTypes); super(EditPOIFilterActivity.this, R.layout.editing_poi_filter_list, amenityTypes);
@ -92,7 +215,7 @@ public class EditPOIFilterActivity extends ListActivity {
return (row); return (row);
} }
private void addRowListener(final AmenityType model,final TextView text, final CheckBox check) { private void addRowListener(final AmenityType model, final TextView text, final CheckBox check) {
text.setOnClickListener(new OnClickListener() { text.setOnClickListener(new OnClickListener() {
@Override @Override
@ -105,10 +228,12 @@ public class EditPOIFilterActivity extends ListActivity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if(check.isChecked()) { if (check.isChecked()) {
filter.setTypeToAccept(model, true);
showDialog(model); showDialog(model);
} else { } else {
filter.setTypeToAccept(model,false); filter.setTypeToAccept(model, false);
PoiFiltersHelper.editPoiFilter(EditPOIFilterActivity.this, filter);
} }
} }
}); });

View file

@ -39,9 +39,7 @@ public class SearchPoiFilterActivity extends ListActivity {
super.onCreate(icicle); super.onCreate(icicle);
setContentView(R.layout.searchpoilist); setContentView(R.layout.searchpoilist);
List<PoiFilter> filters = new ArrayList<PoiFilter>(PoiFiltersHelper.getUserDefinedPoiFilters(this)) ;
filters.addAll(PoiFiltersHelper.getOsmDefinedPoiFilters(this));
setListAdapter(new AmenityAdapter(filters));
typeFace = Typeface.create((String)null, Typeface.ITALIC); typeFace = Typeface.create((String)null, Typeface.ITALIC);
// ListActivity has a ListView, which you can get with: // ListActivity has a ListView, which you can get with:
@ -52,6 +50,20 @@ public class SearchPoiFilterActivity extends ListActivity {
@Override @Override
public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) { public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
PoiFilter poi = ((AmenityAdapter) getListAdapter()).getItem(pos); PoiFilter poi = ((AmenityAdapter) getListAdapter()).getItem(pos);
showEditActivity(poi);
return true;
}
});
}
@Override
protected void onResume() {
super.onResume();
List<PoiFilter> filters = new ArrayList<PoiFilter>(PoiFiltersHelper.getUserDefinedPoiFilters(this)) ;
filters.addAll(PoiFiltersHelper.getOsmDefinedPoiFilters(this));
setListAdapter(new AmenityAdapter(filters));
}
private void showEditActivity(PoiFilter poi) {
if(!poi.isStandardFilter()) { if(!poi.isStandardFilter()) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
Intent newIntent = new Intent(SearchPoiFilterActivity.this, EditPOIFilterActivity.class); Intent newIntent = new Intent(SearchPoiFilterActivity.this, EditPOIFilterActivity.class);
@ -60,14 +72,13 @@ public class SearchPoiFilterActivity extends ListActivity {
newIntent.putExtras(bundle); newIntent.putExtras(bundle);
startActivityForResult(newIntent, 0); startActivityForResult(newIntent, 0);
} }
return true;
} }
});
}
public void onListItemClick(ListView parent, View v, int position, long id) { public void onListItemClick(ListView parent, View v, int position, long id) {
PoiFilter filter = ((AmenityAdapter) getListAdapter()).getItem(position); PoiFilter filter = ((AmenityAdapter) getListAdapter()).getItem(position);
if(filter.getFilterId().equals(PoiFilter.CUSTOM_FILTER_ID)){
showEditActivity(filter);
return;
}
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
Intent newIntent = new Intent(SearchPoiFilterActivity.this, SearchPOIActivity.class); Intent newIntent = new Intent(SearchPoiFilterActivity.this, SearchPOIActivity.class);
bundle.putString(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId()); bundle.putString(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId());
@ -76,6 +87,7 @@ public class SearchPoiFilterActivity extends ListActivity {
} }
class AmenityAdapter extends ArrayAdapter<PoiFilter> { class AmenityAdapter extends ArrayAdapter<PoiFilter> {
AmenityAdapter(List<PoiFilter> list) { AmenityAdapter(List<PoiFilter> list) {
super(SearchPoiFilterActivity.this, R.layout.searchpoi_list, list); super(SearchPoiFilterActivity.this, R.layout.searchpoi_list, list);