package net.osmand.plus.dialogs; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnDismissListener; import android.content.res.Resources; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import net.osmand.AndroidUtils; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper.FavoriteGroup; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.FavoritesListFragment.FavouritesAdapter; import net.osmand.plus.activities.MapActivity; import net.osmand.util.MapUtils; import java.text.Collator; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class FavoriteDialogs { public static final String KEY_FAVORITE = "favorite"; public static Dialog createReplaceFavouriteDialog(final Activity activity, final Bundle args) { final FavouritesDbHelper helper = ((OsmandApplication) activity.getApplication()).getFavorites(); final List<FavouritePoint> points = new ArrayList<FavouritePoint>(helper.getFavouritePoints()); final FavouritesAdapter favouritesAdapter = new FavouritesAdapter(activity, ((OsmandApplication) activity.getApplication()).getFavorites().getFavouritePoints(), false); final Dialog[] dlgHolder = new Dialog[1]; OnItemClickListener click = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { confirmReplace(activity, args, helper, favouritesAdapter, dlgHolder, position); } }; if (activity instanceof MapActivity) { favouritesAdapter.updateLocation(((MapActivity) activity).getMapLocation()); } if(points.size() == 0){ Toast.makeText(activity, activity.getString(R.string.fav_points_not_exist), Toast.LENGTH_SHORT).show(); return null; } return showFavoritesDialog(activity, favouritesAdapter, click, null, dlgHolder, true); } private static void confirmReplace(final Activity activity, final Bundle args, final FavouritesDbHelper helper, final FavouritesAdapter favouritesAdapter, final Dialog[] dlgHolder, int position) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.update_existing); final FavouritePoint fp = favouritesAdapter.getItem(position); builder.setMessage(activity.getString(R.string.replace_favorite_confirmation, fp.getName())); builder.setNegativeButton(R.string.shared_string_no, null); builder.setPositiveButton(R.string.shared_string_yes, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(dlgHolder != null && dlgHolder.length > 0 && dlgHolder[0] != null) { dlgHolder[0].dismiss(); } FavouritePoint point = (FavouritePoint) args.getSerializable(KEY_FAVORITE); if (helper.editFavourite(fp, point.getLatitude(), point.getLongitude())) { if (activity instanceof MapActivity) { ((MapActivity) activity).getContextMenu() .show(new LatLon(point.getLatitude(), point.getLongitude()), fp.getPointDescription(), fp); } } if (activity instanceof MapActivity) { ((MapActivity) activity).getMapView().refreshMap(); } } }); builder.show(); } public static void prepareAddFavouriteDialog(Activity activity, Dialog dialog, Bundle args, double lat, double lon, PointDescription desc) { final Resources resources = activity.getResources(); String name = desc == null ? "" : desc.getName(); if(name.length() == 0) { name = resources.getString(R.string.add_favorite_dialog_default_favourite_name); } OsmandApplication app = (OsmandApplication) activity.getApplication(); final FavouritePoint point = new FavouritePoint(lat, lon, name, app.getSettings().LAST_FAV_CATEGORY_ENTERED.get()); args.putSerializable(KEY_FAVORITE, point); final EditText editText = (EditText) dialog.findViewById(R.id.Name); editText.setText(point.getName()); editText.selectAll(); editText.requestFocus(); final AutoCompleteTextView cat = (AutoCompleteTextView) dialog.findViewById(R.id.Category); cat.setText(point.getCategory()); AndroidUtils.softKeyboardDelayed(editText); } public static Dialog createAddFavouriteDialog(final Activity activity, final Bundle args) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.favourites_context_menu_edit); final View v = activity.getLayoutInflater().inflate(R.layout.favorite_edit_dialog, null, false); final FavouritesDbHelper helper = ((OsmandApplication) activity.getApplication()).getFavorites(); builder.setView(v); final EditText editText = (EditText) v.findViewById(R.id.Name); final EditText description = (EditText) v.findViewById(R.id.description); final AutoCompleteTextView cat = (AutoCompleteTextView) v.findViewById(R.id.Category); List<FavoriteGroup> gs = helper.getFavoriteGroups(); final String[] list = new String[gs.size()]; for (int i = 0; i < list.length; i++) { list[i] = gs.get(i).name; } cat.setAdapter(new ArrayAdapter<String>(activity, R.layout.list_textview, list)); if (((OsmandApplication)activity.getApplication()).accessibilityEnabled()) { final TextView textButton = (TextView)v.findViewById(R.id.TextButton); textButton.setClickable(true); textButton.setFocusable(true); textButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AlertDialog.Builder b = new AlertDialog.Builder(activity); b.setTitle(R.string.access_category_choice); b.setItems(list, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { cat.setText(list[which]); } }); b.setNegativeButton(R.string.shared_string_cancel, null); b.show(); } }); } builder.setNegativeButton(R.string.shared_string_cancel, null); builder.setNeutralButton(R.string.update_existing, new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // Don't use showDialog because it is impossible to refresh favorite items list Dialog dlg = createReplaceFavouriteDialog(activity, args); if(dlg != null) { dlg.show(); } // mapActivity.showDialog(DIALOG_REPLACE_FAVORITE); } }); builder.setPositiveButton(R.string.shared_string_add, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { final FavouritePoint point = (FavouritePoint) args.getSerializable(KEY_FAVORITE); OsmandApplication app = (OsmandApplication) activity.getApplication(); String categoryStr = cat.getText().toString().trim(); final FavouritesDbHelper helper = app.getFavorites(); app.getSettings().LAST_FAV_CATEGORY_ENTERED.set(categoryStr); point.setName(editText.getText().toString().trim()); point.setDescription(description.getText().toString().trim()); point.setCategory(categoryStr); AlertDialog.Builder bld = FavouritesDbHelper.checkDuplicates(point, helper, activity); if(bld != null) { bld.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { addFavorite(activity, point, helper); } }); bld.show(); } else { addFavorite(activity, point, helper); } } protected void addFavorite(final Activity activity, FavouritePoint point, final FavouritesDbHelper helper) { boolean added = helper.addFavourite(point); if (added) { Toast.makeText(activity, MessageFormat.format( activity.getString(R.string.add_favorite_dialog_favourite_added_template), point.getName()), Toast.LENGTH_SHORT) .show(); } if (activity instanceof MapActivity) { ((MapActivity) activity).getMapView().refreshMap(true); } } }); return builder.create(); } public static final AlertDialog showFavoritesDialog( final Context uiContext, final FavouritesAdapter favouritesAdapter, final OnItemClickListener click, final OnDismissListener dismissListener, final Dialog[] dialogHolder, final boolean sortByDist) { ListView listView = new ListView(uiContext); AlertDialog.Builder bld = new AlertDialog.Builder(uiContext); final Collator inst = Collator.getInstance(); favouritesAdapter.sort(new Comparator<FavouritePoint>() { @Override public int compare(FavouritePoint lhs, FavouritePoint rhs) { if (sortByDist) { if (favouritesAdapter.getLocation() == null) { return 0; } double ld = MapUtils.getDistance(favouritesAdapter.getLocation(), lhs.getLatitude(), lhs.getLongitude()); double rd = MapUtils.getDistance(favouritesAdapter.getLocation(), rhs.getLatitude(), rhs.getLongitude()); return Double.compare(ld, rd); } return inst.compare(lhs.getName(), rhs.getName()); } }); listView.setAdapter(favouritesAdapter); listView.setOnItemClickListener(click); bld.setPositiveButton(sortByDist ? R.string.sort_by_name : R.string.sort_by_distance, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { showFavoritesDialog(uiContext, favouritesAdapter, click, dismissListener, dialogHolder, !sortByDist); } }); bld.setNegativeButton(R.string.shared_string_cancel, null); bld.setView(listView); AlertDialog dlg = bld.show(); if(dialogHolder != null) { dialogHolder[0] = dlg; } dlg.setOnDismissListener(dismissListener); return dlg; } }