// Created by plusminus on 23:44:27 - 18.12.2008 package org.androad.ui.common; import java.util.List; import org.osmdroid.util.GeoPoint; import org.androad.R; import org.androad.adt.TrafficFeed; import org.androad.db.DBManager; import org.androad.preferences.Preferences; import org.androad.sys.ors.adt.ds.POIType; import org.androad.sys.ors.adt.lus.Country; import org.androad.sys.ors.adt.rs.DirectionsLanguage; import org.androad.sys.osb.adt.OpenStreetBug; import org.androad.ui.camera.CameraFavorite; import org.androad.ui.map.WhereAmIMap; import org.androad.ui.sd.SDPOICategories; import org.androad.ui.sd.SDPOIEntry; import org.openstreetmap.api.exceptions.OSMAPIException; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.graphics.Bitmap; import android.net.Uri; import android.text.ClipboardManager; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; public class CommonDialogFactory { // =========================================================== // Constants // =========================================================== private static final int ALTITUDEPROFILEDIALOG_CONTAINERVIEW_ID = 0; public static FrameLayout inputOSMPOI; // =========================================================== // Dialog Creations // =========================================================== public static Dialog createSelectDialectFromNationality(final Context ctx, final Country pFrom, final CommonCallback<DirectionsLanguage> pCallback){ final DirectionsLanguage[] drivingDiectionsLanguages = pFrom.getDrivingDiectionsLanguages(); final String[] choices = new String[drivingDiectionsLanguages.length]; for (int i = 0; i < drivingDiectionsLanguages.length; i++) { choices[i] = ctx.getString(drivingDiectionsLanguages[i].NAMERESID); } return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); if(which < 0) { pCallback.onFailure(new IllegalAccessException("Nothing was selected.")); } else { pCallback.onSuccess(drivingDiectionsLanguages[which]); } } }).create(); } public static Dialog createOSMAccountInfoDialog(final Context ctx, final CommonCallback<Boolean> pCallback){ final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_input_osm_account, null); final EditText etUsername = (EditText)fl.findViewById(R.id.et_input_osm_account_username); final EditText etPassword = (EditText)fl.findViewById(R.id.et_input_osm_account_password); etUsername.setText(Preferences.getOSMAccountUsername(ctx)); etPassword.setText(Preferences.getOSMAccountPassword(ctx)); return new AlertDialog.Builder(ctx) .setView(fl) .setTitle(R.string.dlg_input_osm_account_title) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { final String username = etUsername.getText().toString(); final String password = etPassword.getText().toString(); if(username.length() == 0){ Toast.makeText(ctx, R.string.dlg_input_osm_account_username_tooshort, Toast.LENGTH_SHORT).show(); pCallback.onSuccess(false); return; }else if(password.length() == 0){ Toast.makeText(ctx, R.string.dlg_input_osm_account_password_tooshort, Toast.LENGTH_SHORT).show(); pCallback.onSuccess(false); return; } Preferences.saveOSMAccountUsername(ctx, username); Preferences.saveOSMAccountPassword(ctx, password); pCallback.onSuccess(true); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(false); } }).create(); } public static Dialog createTrailmappingAccountInfoDialog(final Context ctx, final CommonCallback<Boolean> pCallback){ final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_input_trailmapping_account, null); final EditText etUsername = (EditText)fl.findViewById(R.id.et_input_trailmapping_account_username); final EditText etPassword = (EditText)fl.findViewById(R.id.et_input_trailmapping_account_password); etUsername.setText(Preferences.getTrailmappingUsername(ctx)); etPassword.setText(Preferences.getTrailmappingPassword(ctx)); return new AlertDialog.Builder(ctx) .setView(fl) .setTitle(R.string.dlg_input_trailmapping_account_title) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { final String username = etUsername.getText().toString(); final String password = etPassword.getText().toString(); if(username.length() == 0){ Toast.makeText(ctx, R.string.dlg_input_trailmapping_account_username_tooshort, Toast.LENGTH_SHORT).show(); pCallback.onSuccess(false); return; }else if(password.length() == 0){ Toast.makeText(ctx, R.string.dlg_input_trailmapping_account_password_tooshort, Toast.LENGTH_SHORT).show(); pCallback.onSuccess(false); return; } Preferences.saveTrailmappingAccountUsername(ctx, username); Preferences.saveTrailmappingAccountPassword(ctx, password); pCallback.onSuccess(true); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(false); } }).create(); } public static Dialog createInputLatLonDialog(final Context ctx, final CommonCallback<GeoPoint> pCallback) { final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_input_direct_lat_lon, null); final EditText etLat = (EditText)fl.findViewById(R.id.et_input_direct_lat_lon_latitude); final EditText etLon = (EditText)fl.findViewById(R.id.et_input_direct_lat_lon_longitude); return new AlertDialog.Builder(ctx) .setView(fl) .setTitle(R.string.dlg_input_direct_lat_lon_title) .setIcon(R.drawable.world_small) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { try{ final double lat; final double lon; final String latString = etLat.getText().toString(); if(latString.contains(",")) { lat = Double.parseDouble(latString.replace(",", ".")); } else { lat = Double.parseDouble(latString); } final String lonString = etLon.getText().toString(); if(lonString.contains(",")) { lon = Double.parseDouble(lonString.replace(",", ".")); } else { lon = Double.parseDouble(lonString); } /* If no exception received until here, values are valid! */ d.dismiss(); pCallback.onSuccess(new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6))); }catch(final Exception e){ pCallback.onFailure(e); } } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }).create(); } /** * @param ctx * @param pCallback 0 for freeform, 1 for structured */ public static Dialog createFreeformOrStructuredAddressSelectorDialog(final Context ctx, final CommonCallback<Integer> pCallback) { final String[] choices = {ctx.getString(R.string.sd_search_address_freeform), ctx.getString(R.string.sd_search_address_structured)}; return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); if(which < 0) { pCallback.onFailure(new IllegalAccessException("Nothing was selected.")); } else { pCallback.onSuccess(which); } } }).create(); } /** * @param ctx * @param pCallback 0 for osb, 1 for ftpc, */ public static Dialog createAddOSBorFTPCDialog(final Context ctx, final CommonCallback<OSBMapLongAddSelectorResult> pCallback) { final String[] choices = {ctx.getString(R.string.dlg_osb_choose_what_to_add_osmpoi), ctx.getString(R.string.dlg_osb_choose_what_to_add_osb), ctx.getString(R.string.dlg_osb_choose_what_to_add_ftpc)}; return new AlertDialog.Builder(ctx) .setTitle(R.string.dlg_osb_choose_what_to_add) .setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); if(which < 0){ pCallback.onFailure(new IllegalAccessException("Nothing was selected.")); }else{ switch(which){ case 0: pCallback.onSuccess(OSBMapLongAddSelectorResult.OSMPOI); break; case 1: pCallback.onSuccess(OSBMapLongAddSelectorResult.OSB); break; case 2: pCallback.onSuccess(OSBMapLongAddSelectorResult.FTPC); break; } } } }).create(); } public static Dialog createInputFavoriteNameDialog(final Activity act, final CommonCallback<String> pCallback) { final LayoutInflater inflater = LayoutInflater.from(act); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_input_favorite_name, null); final EditText etName = (EditText)fl.findViewById(R.id.et_dlg_input_favorite_name_name); return new AlertDialog.Builder(act) .setView(fl) .setTitle(R.string.dlg_input_favorite_name_title) .setIcon(R.drawable.settingsmenu_favorites) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { try{ final String name = etName.getText().toString(); if(name.length() < 3) { pCallback.onFailure(new IllegalArgumentException("Name not long enough.")); // TODO i18n } /* If no exception received until here, values are valid! */ d.dismiss(); pCallback.onSuccess(name); }catch(final Exception e){ pCallback.onFailure(e); } } }) .setNeutralButton(R.string.dlg_photo, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { try{ final String name = etName.getText().toString(); if(name.length() < 3) { pCallback.onFailure(new IllegalArgumentException("Name not long enough.")); // TODO i18n d.dismiss(); return; } /* If no exception received until here, values are valid! */ d.dismiss(); final Intent cameraFavoriteIntent = new Intent(act, CameraFavorite.class); cameraFavoriteIntent.putExtra(CommonDialogFactory.class.getName(), name); act.startActivityForResult(cameraFavoriteIntent, WhereAmIMap.REQUESTCODE_PICTURE); }catch(final Exception e){ pCallback.onFailure(e); d.dismiss(); return; } } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }).create(); } public static Dialog createFreeformOrCategorizedPOISelectorDialog(final Context ctx, final CommonCallback<Intent> pCallback) { final String[] choices = {ctx.getString(R.string.poi_search_categorized), ctx.getString(R.string.poi_search_freeform)}; return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); final Intent poiSearchIntent; switch(which){ case 0: poiSearchIntent = new Intent(ctx, SDPOICategories.class); break; case 1: default: poiSearchIntent = new Intent(ctx, SDPOIEntry.class); break; } pCallback.onSuccess(poiSearchIntent); } }).create(); } /** * Will return null, when no Feed is available, so instantly the Add-Feed activity can be launched. * @param ctx * @param pCallback */ public static Dialog createAddCustomTrafficFeedDialog(final Activity ctx, final CommonCallback<TrafficFeed> pCallback) { final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_input_new_trafficfeed, null); final EditText etName = (EditText)fl.findViewById(R.id.et_dlg_customtrafficfeed_name); final EditText etURL = (EditText)fl.findViewById(R.id.et_dlg_customtrafficfeed_url); final Spinner spinCountry = (Spinner)fl.findViewById(R.id.spin_dlg_customtrafficfeed_country); final Button btnFeedList = (Button)fl.findViewById(R.id.btn_dlg_customtrafficfeed_showfeedlist); btnFeedList.setOnClickListener(new View.OnClickListener(){ private boolean mListShown = false; @Override public void onClick(final View v) { if(!this.mListShown){ btnFeedList.setText(R.string.dlg_customtrafficfeed_clipboardpaste); final Intent webIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://trafficfeeds.andnav.org/#feedlist")); ctx.startActivity(webIntent); }else{ final ClipboardManager cb = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE); if(cb.hasText()) { final String text = cb.getText().toString(); if(text.startsWith("http://")) { etURL.setText(text); } } btnFeedList.setText(R.string.dlg_customtrafficfeed_showfeedlist); } this.mListShown = !this.mListShown; } }); final ArrayAdapter<Country> countryAdapter = new ArrayAdapter<Country>(ctx, android.R.layout.simple_spinner_item, Country.values()); countryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinCountry.setAdapter(countryAdapter); return new AlertDialog.Builder(ctx) .setView(fl) .setTitle(R.string.dlg_customtrafficfeed_title) .setIcon(R.drawable.traffic_feed) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { try{ final String name = etName.getText().toString().trim(); if(name.length() < 3) { pCallback.onFailure(new IllegalArgumentException("Name not long enough.")); // TODO i18n } final String url = etURL.getText().toString().trim(); if(url.length() < 3 || !url.startsWith("http://")) { pCallback.onFailure(new IllegalArgumentException("Invalid URL. Should start with 'http://'.")); // TODO i18n } final Country nat = (Country)spinCountry.getSelectedItem(); final TrafficFeed trafficFeed = new TrafficFeed(name, url, nat); DBManager.addTrafficFeed(ctx, trafficFeed); /* If no exception received until here, values are valid! */ d.dismiss(); pCallback.onSuccess(trafficFeed); }catch(final Exception e){ pCallback.onFailure(e); } } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }).create(); } /** * Will return null, when no Feed is available, so instantly the Add-Feed activity can be launched. * @param ctx * @param pCallback */ public static Dialog createSelectCustomTrafficFeedDialog(final Context ctx, final List<TrafficFeed> customFeeds, final CommonCallback<TrafficFeed> pCallback) { final int feedCount = customFeeds.size(); final String[] choices = new String[feedCount + 1]; for(int i = 0; i < feedCount; i++) { choices[i+1] = customFeeds.get(i).getName(); } choices[0] = "Add new..."; //TODO i18n return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { if(which == 0) { pCallback.onSuccess(null); } else { pCallback.onSuccess(customFeeds.get(which - 1)); } d.dismiss(); } }).create(); } /** * * @param ctx * @param pCallback * @return 0 for user, 1 for delete */ public static Dialog createFavoriteUseOrDeleteDialog(final Context ctx, final CommonCallback<Integer> pCallback){ return new AlertDialog.Builder(ctx) .setSingleChoiceItems(new String[]{ctx.getString(R.string.settings_favortites_contextmenu_use), ctx.getString(R.string.settings_favortites_contextmenu_delete)}, 0, new OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(which); } }) .create(); } /** * Present the End User License Agreement dialog so the user can accept it. * @param ctx * @param pCallback * @return */ public static Dialog createAcceptEulaDialog(final Context ctx, final CommonCallback<Boolean> pCallback){ CharSequence msg = ctx.getString(R.string.eula_disclaim) + Html.fromHtml(ctx.getString(R.string.eula_gpl3)); return new AlertDialog.Builder(ctx) .setTitle(R.string.eula_title) .setMessage(msg) .setPositiveButton(R.string.eula_accept, new DialogInterface.OnClickListener(){ public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(true); } }) .setNegativeButton(R.string.eula_decline, new DialogInterface.OnClickListener(){ public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(false); } }) .create(); } public static Dialog createEnableGPSDialog(final Context ctx, final CommonCallback<Boolean> pCallback){ return new AlertDialog.Builder(ctx) .setTitle(R.string.startup_gpsrequried_title) .setMessage(R.string.startup_gpsrequried_message) .setPositiveButton(R.string.activate, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { pCallback.onSuccess(true); } }) .setNeutralButton(R.string.enter, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { pCallback.onSuccess(false); } }) .setNegativeButton(R.string.exit, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { pCallback.onFailure(null); } }) .create(); } public static Dialog createOpenStreetBugInstructionsDialog(final Context ctx, final CommonCallback<Boolean> pCallback){ return new AlertDialog.Builder(ctx) .setIcon(R.drawable.information) .setTitle(R.string.instructions) .setMessage(R.string.osb_instructions) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which){ pCallback.onSuccess(true); } }) .setNegativeButton(R.string.nevershowagain, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which){ pCallback.onSuccess(false); } }) .create(); } public static Dialog createInputDialog(final Context ctx, final int pTextualHintResID, final CommonCallback<String> pCallback){ return createInputDialog(ctx, pTextualHintResID, R.string.cdf_inputbox_title, pCallback); } public static Dialog createInputDialog(final Context ctx, final int pTextualHintResID, final int pTextualTitleResID, final CommonCallback<String> pCallback){ final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.cdf_inputbox, null); ((TextView)fl.findViewById(R.id.tv_cdf_inputbox_hint)).setText(pTextualHintResID); final EditText etInput = (EditText)fl.findViewById(R.id.et_cdf_inputbox_input); return new AlertDialog.Builder(ctx) .setIcon(R.drawable.comment_write) .setTitle(pTextualTitleResID) .setView(fl) .setPositiveButton(R.string.ok, new OnClickListener(){ @Override public void onClick(final DialogInterface d, final int arg1) { pCallback.onSuccess(etInput.getText().toString()); d.dismiss(); } }) .setNegativeButton(R.string.cancel, new OnClickListener(){ @Override public void onClick(final DialogInterface d, final int arg1) { d.dismiss(); } }) .create(); } public static Dialog createSavedRouteSelectionOptions(final Context ctx, final CommonCallback<CreateSavedRouteSelectionOptions> pCallback){ final String[] choices = new String[]{ctx.getString(R.string.dlg_sd_savedroutechooser_contextmenu_use), ctx.getString(R.string.dlg_sd_savedroutechooser_contextmenu_rename), ctx.getString(R.string.dlg_sd_savedroutechooser_contextmenu_information)}; return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); // TODO SHARE switch(which){ case 0: pCallback.onSuccess(CreateSavedRouteSelectionOptions.USE); break; case 1: pCallback.onSuccess(CreateSavedRouteSelectionOptions.RENAME); break; case 2: pCallback.onSuccess(CreateSavedRouteSelectionOptions.INFORMATION); break; } } }).create(); } public static Dialog createSavedTraceSelectionOptions(final Context ctx, final CommonCallback<CreateSavedTraceSelectionOptions> pCallback){ final String[] choices = new String[]{ctx.getString(R.string.dlg_sd_savedtracechooser_contextmenu_use), ctx.getString(R.string.dlg_sd_savedtracechooser_contextmenu_rename), ctx.getString(R.string.dlg_sd_savedtracechooser_contextmenu_information), ctx.getString(R.string.dlg_sd_savedtracechooser_contextmenu_share_trailmapping)}; return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); switch(which){ case 0: pCallback.onSuccess(CreateSavedTraceSelectionOptions.USE); break; case 1: pCallback.onSuccess(CreateSavedTraceSelectionOptions.RENAME); break; case 2: pCallback.onSuccess(CreateSavedTraceSelectionOptions.INFORMATION); break; case 3: pCallback.onSuccess(CreateSavedTraceSelectionOptions.SHARE_TRAILMAPPING); break; } } }).create(); } public static Dialog createORSServerSelectionOptionsDialog(final Context ctx, final CommonCallback<CreateORSServerSelectionOptions> pCallback){ final String[] choices = new String[]{ctx.getString(R.string.settings_orsserver_contextmenu_use), ctx.getString(R.string.settings_orsserver_contextmenu_ping), ctx.getString(R.string.settings_orsserver_contextmenu_information)}; return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); switch(which){ case 0: pCallback.onSuccess(CreateORSServerSelectionOptions.USE); break; case 1: pCallback.onSuccess(CreateORSServerSelectionOptions.PING); break; case 2: pCallback.onSuccess(CreateORSServerSelectionOptions.INFORMATION); break; } } }).create(); } public static Dialog createVersionInfoDialog(final Context ctx, final CommonCallback<Void> pCallback) { final StringBuilder sb = new StringBuilder(); sb.append(ctx.getString(R.string.app_name)) .append('\n') .append("VersionName: ").append(org.androad.util.Util.getVersionName(ctx)) .append('\n') .append("VersionNumber: ").append(org.androad.util.Util.getVersionNumber(ctx)) .append('\n'); return new AlertDialog.Builder(ctx) .setTitle(R.string.versioninfo) .setMessage(sb.toString()) .setIcon(R.drawable.hardhat) .setNegativeButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }) .create(); } public static Dialog createAltitudeProfileDialog(final Context ctx, final CommonCallback<Void> pCallback) { final LinearLayout container = new LinearLayout(ctx); container.setId(ALTITUDEPROFILEDIALOG_CONTAINERVIEW_ID); final AlertDialog.Builder ab = new AlertDialog.Builder(ctx) .setIcon(R.drawable.altitude_profile) .setTitle(R.string.maps_menu_altitude_profile_title) .setView(container) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(null); } }); return ab.create(); } public static Dialog createOSBRefreshBugsDialog(final Context ctx, final int pMessageResID, final CommonCallback<Boolean> pCallback){ return new AlertDialog.Builder(ctx) .setIcon(R.drawable.refresh) .setTitle(R.string.success) .setMessage(pMessageResID) .setPositiveButton(R.string.refresh, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); pCallback.onSuccess(true); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }) .create(); } public static Dialog createAddOSBBugDialog(final Context ctx, final CommonCallback<String> pCallback){ final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_osb_add_bug, null); final EditText etComment = (EditText)fl.findViewById(R.id.et_dlg_osb_add_bug_new_comment); final EditText etCommenterName = (EditText)fl.findViewById(R.id.et_dlg_osb_add_bug_name); etCommenterName.setText(Preferences.getOSBCommenterName(ctx)); etComment.selectAll(); return new AlertDialog.Builder(ctx) .setView(fl) .setTitle(R.string.dlg_osb_edit_bug_title) .setPositiveButton(R.string.save, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { final String newComment = etComment.getText().toString(); if(newComment.length() == 0){ Toast.makeText(ctx, R.string.dlg_osb_bug_invalid_comment, Toast.LENGTH_SHORT).show(); pCallback.onFailure(new IllegalArgumentException("Invalid comment")); return; } final String commenterName = etCommenterName.getText().toString(); Toast.makeText(ctx, R.string.please_wait_a_moment, Toast.LENGTH_LONG).show(); new Thread(new Runnable(){ @Override public void run() { final String commentWithName; /* Append the name in brackets and append the comment. */ if(commenterName.length() == 0){ commentWithName = newComment + " [" + ctx.getString(R.string.dlg_osb_commentername) + "]"; }else{ Preferences.saveOSBCommenterName(ctx, commenterName); commentWithName = newComment + " [" + commenterName + "]"; } pCallback.onSuccess(commentWithName); } }).start(); d.dismiss(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }).create(); } public static Dialog createEditOSBBugDialog(final Context ctx, final OpenStreetBug pOSB, final CommonCallback<CreateEditOSBBugDialogResult> pCallback){ final LayoutInflater inflater = LayoutInflater.from(ctx); final FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.dlg_osb_edit_bug, null); final TextView tvPreviousComments = (TextView)fl.findViewById(R.id.tv_dlg_osb_edit_bug_previous_comments); tvPreviousComments.setText(pOSB.getDesription()); final EditText etNewComment = (EditText)fl.findViewById(R.id.et_dlg_osb_edit_bug_new_comment); final EditText etCommenterName = (EditText)fl.findViewById(R.id.et_dlg_osb_edit_bug_name); final CheckBox cbCloseBug = (CheckBox)fl.findViewById(R.id.chk_dlg_osb_edit_bug_close_bug); etCommenterName.setText(Preferences.getOSBCommenterName(ctx)); etNewComment.selectAll(); final Dialog d = new AlertDialog.Builder(ctx) .setView(fl) .setTitle(R.string.dlg_osb_edit_bug_title) .setPositiveButton(R.string.save, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { final String newComment = etNewComment.getText().toString(); final boolean closeBug = cbCloseBug.isChecked(); if(newComment.length() == 0){ Toast.makeText(ctx, R.string.dlg_osb_bug_invalid_comment, Toast.LENGTH_SHORT).show(); pCallback.onFailure(new IllegalArgumentException("Invalid comment")); return; } final String commenterName = etCommenterName.getText().toString(); Toast.makeText(ctx, R.string.please_wait_a_moment, Toast.LENGTH_LONG).show(); new Thread(new Runnable(){ @Override public void run() { final String commentWithName; if(commenterName.length() == 0){ commentWithName = newComment + " [" + ctx.getString(R.string.dlg_osb_commentername) + "]"; }else{ Preferences.saveOSBCommenterName(ctx, commenterName); commentWithName = newComment + " [" + commenterName + "]"; } pCallback.onSuccess(new CreateEditOSBBugDialogResult(closeBug, commentWithName)); } }).start(); d.dismiss(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); } }).create(); return d; } public static Dialog createInputOSMPOIDialog(final Context ctx, final POIType pCategoryType, final CommonCallback<String> pCallback) { final LayoutInflater inflater = LayoutInflater.from(ctx); inputOSMPOI = (FrameLayout)inflater.inflate(R.layout.dlg_input_poiname, null); final TextView tvCategoryName = (TextView)inputOSMPOI.findViewById(R.id.tv_dlg_input_osmpoiname_name); if (pCategoryType != null) tvCategoryName.setText(pCategoryType.READABLENAMERESID); final EditText etPOIName = (EditText)inputOSMPOI.findViewById(R.id.et_dlg_input_osmpoiname_name); return new AlertDialog.Builder(ctx) .setView(inputOSMPOI) .setTitle(R.string.dlg_osb_edit_bug_title) .setPositiveButton(R.string.save, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { pCallback.onSuccess(etPOIName.getText().toString()); d.dismiss(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { pCallback.onFailure(new OSMAPIException("Aborted")); d.dismiss(); } }) .create(); } public static Dialog createAddOSMPOIFailedDialog(final Context ctx, final CommonCallback<Void> pCallback) { // TODO Add icon return new AlertDialog.Builder(ctx) .setTitle(R.string.dlg_osb_add_osmpoi_failed_title) .setMessage(R.string.dlg_osb_add_osmpoi_failed_message) .create(); } public static Dialog createAddOSMPOISuccessDialog(final Context ctx, final CommonCallback<Void> pCallback) { // TODO Add icon return new AlertDialog.Builder(ctx) .setTitle(R.string.dlg_osb_add_osmpoi_success_title) .setMessage(R.string.dlg_osb_add_osmpoi_success_message) .create(); } public static Dialog createORSServerSelectionInstructionsDialog(final Context ctx, final CommonCallback<Void> pCallback) { return new AlertDialog.Builder(ctx) .setIcon(R.drawable.information) .setTitle(R.string.instructions) .setMessage(R.string.orsserver_selection_instructions) .setPositiveButton(R.string.ok, null) .create(); } public static Dialog createORSServerChangeableInfoDialog(final Context ctx, final CommonCallback<Void> pCallback) { return new AlertDialog.Builder(ctx) .setIcon(R.drawable.information) .setTitle(R.string.instructions) .setMessage(R.string.orsserver_selection_changeable) .setPositiveButton(R.string.ok, new OnClickListener(){ @Override public void onClick(final DialogInterface arg0, final int arg1) { pCallback.onSuccess(null); } }) .create(); } public static Dialog createNationalitySelectionDialog(final Context ctx, final List<Country> pCountries, final CommonCallback<Country> pCallback){ final String[] choices = new String[pCountries.size()]; for (int i = 0; i < choices.length; i++) { choices[i] = ctx.getString(pCountries.get(i).NAMERESID); } return new AlertDialog.Builder(ctx).setSingleChoiceItems(choices , 0, new DialogInterface.OnClickListener(){ @Override public void onClick(final DialogInterface d, final int which) { d.dismiss(); switch(which){ case 0: pCallback.onSuccess(pCountries.get(which)); break; default: break; } } }).create(); } // =========================================================== // Dialog-Preparations // =========================================================== public static void prepareInputOSMPOIDialog(final Context ctx, final Dialog d, final POIType pCategoryType){ final TextView tvCategoryName = (TextView)d.findViewById(R.id.tv_dlg_input_osmpoiname_name); tvCategoryName.setText(pCategoryType.READABLENAMERESID); } public static void prepareEditOSBBugDialog(final Context ctx, final Dialog d, final OpenStreetBug pOSB) { final TextView tvPreviousComments = (TextView)d.findViewById(R.id.tv_dlg_osb_edit_bug_previous_comments); tvPreviousComments.setText(pOSB.getDesription()); } public static void prepareAltitudeProfileDialog(final Context ctx, final Dialog d, final Bitmap result){ if(result == null){ final TextView tv = new TextView(ctx); tv.setText(R.string.maps_menu_altitude_profile_error); final LinearLayout ll = (LinearLayout)d.findViewById(ALTITUDEPROFILEDIALOG_CONTAINERVIEW_ID); ll.removeAllViews(); ll.addView(tv); }else{ final ImageView iv = new ImageView(ctx); iv.setImageBitmap(result); final LinearLayout ll = (LinearLayout)d.findViewById(ALTITUDEPROFILEDIALOG_CONTAINERVIEW_ID); ll.removeAllViews(); ll.addView(iv); } } // =========================================================== // Inner and Anonymous Classes // =========================================================== public static enum OSBMapLongAddSelectorResult { OSB, FTPC, OSMPOI; } public static class CreateEditOSBBugDialogResult { public final boolean mCloseBug; public final String mCommentWithName; public CreateEditOSBBugDialogResult(final boolean closeBug, final String commentWithName) { this.mCloseBug = closeBug; this.mCommentWithName = commentWithName; } } public static enum CreateORSServerSelectionOptions { USE, PING, INFORMATION; } public static enum CreateSavedRouteSelectionOptions { USE, RENAME, INFORMATION, SHARE; } public static enum CreateSavedTraceSelectionOptions { USE, RENAME, INFORMATION, SHARE_TRAILMAPPING; } }