package net.osmand.plus.osmedit; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Message; import android.support.annotation.NonNull; import android.support.design.widget.TabLayout; import android.support.design.widget.TextInputLayout; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import net.osmand.CallbackWithObject; import net.osmand.PlatformUtil; import net.osmand.data.Amenity; import net.osmand.data.LatLon; import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiType; import net.osmand.osm.edit.EntityInfo; import net.osmand.osm.edit.Node; import net.osmand.osm.edit.OSMSettings; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.BaseOsmAndDialogFragment; import net.osmand.plus.osmedit.dialogs.PoiSubTypeDialogFragment; import net.osmand.plus.osmedit.dialogs.PoiTypeDialogFragment; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; import java.io.Serializable; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { public static final String TAG = "EditPoiDialogFragment"; private static final Log LOG = PlatformUtil.getLog(EditPoiDialogFragment.class); private static final String KEY_AMENITY_NODE = "key_amenity_node"; private static final String TAGS_LIST = "tags_list"; private static final String IS_ADDING_POI = "is_adding_poi"; public static final HashSet<String> BASIC_TAGS = new HashSet<String>() ; static { BASIC_TAGS.add(OSMSettings.OSMTagKey.NAME.getValue()); BASIC_TAGS.add(OSMSettings.OSMTagKey.ADDR_STREET.getValue()); BASIC_TAGS.add(OSMSettings.OSMTagKey.ADDR_HOUSE_NUMBER.getValue()); BASIC_TAGS.add(OSMSettings.OSMTagKey.PHONE.getValue()); BASIC_TAGS.add(OSMSettings.OSMTagKey.WEBSITE.getValue()); BASIC_TAGS.add(OSMSettings.OSMTagKey.OPENING_HOURS.getValue()); } private EditPoiData editPoiData; private ViewPager viewPager; private AutoCompleteTextView poiTypeEditText; private OpenstreetmapUtil mOpenstreetmapUtil; private TextInputLayout poiTypeTextInputLayout; private View view; @Override public void onAttach(Activity activity) { super.onAttach(activity); OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); if (getSettings().OFFLINE_EDITION.get() || !getSettings().isInternetConnectionAvailable(true)) { mOpenstreetmapUtil = plugin.getPoiModificationLocalUtil(); } else { mOpenstreetmapUtil = plugin.getPoiModificationRemoteUtil(); } Node node = (Node) getArguments().getSerializable(KEY_AMENITY_NODE); editPoiData = new EditPoiData(node, getMyApplication()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_edit_poi, container, false); boolean isLightTheme = getSettings().OSMAND_THEME.get() == OsmandSettings.OSMAND_LIGHT_THEME; if (savedInstanceState != null) { @SuppressWarnings("unchecked") Map<String, String> mp = (Map<String, String>) savedInstanceState.getSerializable(TAGS_LIST); editPoiData.updateTags(mp); } boolean isAddingPoi = getArguments().getBoolean(IS_ADDING_POI); Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); toolbar.setTitle(isAddingPoi ? R.string.poi_create_title : R.string.poi_edit_title); toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); toolbar.setNavigationContentDescription(R.string.access_shared_string_navigate_up); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismissCheckForChanges(); } }); viewPager = (ViewPager) view.findViewById(R.id.viewpager); String basicTitle = getResources().getString(R.string.tab_title_basic); String extendedTitle = getResources().getString(R.string.tab_title_advanced); final MyAdapter pagerAdapter = new MyAdapter(getChildFragmentManager(), basicTitle, extendedTitle); viewPager.setAdapter(pagerAdapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int i) { ((OnFragmentActivatedListener) pagerAdapter.getItem(i)).onFragmentActivated(); } @Override public void onPageScrollStateChanged(int i) { } }); final TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); // tabLayout.setupWithViewPager(viewPager); // Hack due to bug in design support library v22.2.1 // https://code.google.com/p/android/issues/detail?id=180462 // TODO remove in new version if (Build.VERSION.SDK_INT >= 11) { if (ViewCompat.isLaidOut(tabLayout)) { tabLayout.setupWithViewPager(viewPager); } else { tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { tabLayout.setupWithViewPager(viewPager); tabLayout.removeOnLayoutChangeListener(this); } }); } } else { ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ViewTreeObserver obs = view.getViewTreeObserver(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { obs.removeGlobalOnLayoutListener(this); } if (getActivity() != null) { tabLayout.setupWithViewPager(viewPager); } } }); } ImageButton onlineDocumentationButton = (ImageButton) view.findViewById(R.id.onlineDocumentationButton); onlineDocumentationButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://wiki.openstreetmap.org/wiki/Map_Features"))); } }); final int colorId = isLightTheme ? R.color.inactive_item_orange : R.color.dash_search_icon_dark; final int color = getResources().getColor(colorId); onlineDocumentationButton.setImageDrawable(getPaintedContentIcon(R.drawable.ic_action_help, color)); final ImageButton poiTypeButton = (ImageButton) view.findViewById(R.id.poiTypeButton); poiTypeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PoiTypeDialogFragment fragment = PoiTypeDialogFragment.createInstance(); fragment.setOnItemSelectListener(new PoiTypeDialogFragment.OnItemSelectListener() { @Override public void select(PoiCategory poiCategory) { setPoiCategory(poiCategory); } }); fragment.show(getChildFragmentManager(), "PoiTypeDialogFragment"); } }); EditText poiNameEditText = (EditText) view.findViewById(R.id.poiNameEditText); poiNameEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (!getEditPoiData().isInEdit()) { if (!TextUtils.isEmpty(s)) { getEditPoiData().putTag(OSMSettings.OSMTagKey.NAME.getValue(), s.toString()); } else { getEditPoiData().removeTag(OSMSettings.OSMTagKey.NAME.getValue()); } } } }); poiNameEditText.setText(editPoiData.getTag(OSMSettings.OSMTagKey.NAME.getValue())); poiTypeTextInputLayout = (TextInputLayout) view.findViewById(R.id.poiTypeTextInputLayout); poiTypeEditText = (AutoCompleteTextView) view.findViewById(R.id.poiTypeEditText); poiTypeEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (!getEditPoiData().isInEdit()) { getEditPoiData().updateTypeTag(s.toString()); poiTypeTextInputLayout.setHint(editPoiData.getPoiCategory().getTranslation()); } } }); poiNameEditText.setOnEditorActionListener(mOnEditorActionListener); poiTypeEditText.setOnEditorActionListener(mOnEditorActionListener); poiTypeEditText.setText(editPoiData.getPoiTypeString()); poiTypeEditText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View v, MotionEvent event) { final EditText editText = (EditText) v; final int DRAWABLE_RIGHT = 2; if (event.getAction() == MotionEvent.ACTION_UP) { if (event.getX() >= (editText.getRight() - editText.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width() - editText.getPaddingRight())) { if (editPoiData.getPoiCategory() != null) { PoiSubTypeDialogFragment dialogFragment = PoiSubTypeDialogFragment.createInstance(editPoiData.getPoiCategory()); dialogFragment.setOnItemSelectListener(new PoiSubTypeDialogFragment.OnItemSelectListener() { @Override public void select(String category) { setSubCategory(category); } }); dialogFragment.show(getChildFragmentManager(), "PoiSubTypeDialogFragment"); } return true; } } return false; } }); Button saveButton = (Button) view.findViewById(R.id.saveButton); saveButton.setText(mOpenstreetmapUtil instanceof OpenstreetmapRemoteUtil ? R.string.shared_string_upload : R.string.shared_string_save); saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { trySave(); } }); Button cancelButton = (Button) view.findViewById(R.id.cancelButton); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismissCheckForChanges(); } }); setAdapterForPoiTypeEditText(); setCancelable(false); return view; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); return dialog; } @Override public void onResume() { super.onResume(); getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == android.view.KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_DOWN) { return true; } else { dismissCheckForChanges(); return true; } } return false; } }); } @Override public void onSaveInstanceState(Bundle outState) { outState.putSerializable(TAGS_LIST, (Serializable) editPoiData.getTagValues()); super.onSaveInstanceState(outState); } @Override public void show(FragmentManager manager, String tag) { if (manager.findFragmentByTag(TAG) == null) { super.show(manager, TAG); } } @Override public int show(FragmentTransaction transaction, String tag) { throw new UnsupportedOperationException("Please use show(FragmentManager manager, String tag)"); } private void trySave() { if (TextUtils.isEmpty(poiTypeEditText.getText())) { HashSet<String> tagsCopy = new HashSet<>(); tagsCopy.addAll(editPoiData.getTagValues().keySet()); if (Algorithms.isEmpty(editPoiData.getTag(OSMSettings.OSMTagKey.ADDR_HOUSE_NUMBER.getValue()))) { SaveExtraValidationDialogFragment f = new SaveExtraValidationDialogFragment(); Bundle args = new Bundle(); args.putInt("message", R.string.save_poi_without_poi_type_message); f.setArguments(args); f.show(getChildFragmentManager(), "dialog"); // poiTypeEditText.setError(getResources().getString(R.string.please_specify_poi_type)); } else { save(); } } else if (testTooManyCapitalLetters(editPoiData.getTag(OSMSettings.OSMTagKey.NAME.getValue()))) { SaveExtraValidationDialogFragment f = new SaveExtraValidationDialogFragment(); Bundle args = new Bundle(); args.putInt("message", R.string.save_poi_too_many_uppercase); f.setArguments(args); f.show(getChildFragmentManager(), "dialog"); } else if (editPoiData.getPoiCategory() == getMyApplication().getPoiTypes().getOtherPoiCategory()) { poiTypeEditText.setError(getResources().getString(R.string.please_specify_poi_type)); } else if (editPoiData.getPoiTypeDefined() == null) { poiTypeEditText.setError(getResources().getString(R.string.please_specify_poi_type_only_from_list)); } else { save(); } } private boolean testTooManyCapitalLetters(String name) { if(name == null) { return false; } int capital = 0; int lower = 0; int nonalpha = 0; for(int i = 0; i < name.length(); i++) { char c = name.charAt(i); if(Character.isAlphabetic(c)) { if(Character.toUpperCase(c) != c && Character.toLowerCase(c) == c) { lower ++; } else { capital ++; } } else { nonalpha ++; } } return capital > nonalpha && capital > lower; } private void save() { Node original = editPoiData.getEntity(); final boolean offlineEdit = mOpenstreetmapUtil instanceof OpenstreetmapLocalUtil; Node node = new Node(original.getLatitude(), original.getLongitude(), original.getId()); OsmPoint.Action action = node.getId() < 0 ? OsmPoint.Action.CREATE : OsmPoint.Action.MODIFY; for (Map.Entry<String, String> tag : editPoiData.getTagValues().entrySet()) { if (!Algorithms.isEmpty(tag.getKey()) && !Algorithms.isEmpty(tag.getValue()) && !tag.getKey().equals(EditPoiData.POI_TYPE_TAG)) { node.putTagNoLC(tag.getKey(), tag.getValue()); } } String poiTypeTag = editPoiData.getTagValues().get(EditPoiData.POI_TYPE_TAG); if (poiTypeTag != null) { final PoiType poiType = editPoiData.getAllTranslatedSubTypes().get(poiTypeTag.trim().toLowerCase()); if (poiType != null) { node.putTagNoLC(poiType.getOsmTag(), poiType.getOsmValue()); node.removeTag(EditPoiData.REMOVE_TAG_PREFIX + poiType.getOsmTag()); if (poiType.getOsmTag2() != null) { node.putTagNoLC(poiType.getOsmTag2(), poiType.getOsmValue2()); node.removeTag(EditPoiData.REMOVE_TAG_PREFIX + poiType.getOsmTag2()); } } else if (!Algorithms.isEmpty(poiTypeTag)) { node.putTagNoLC(editPoiData.getPoiCategory().getDefaultTag(), poiTypeTag); } if (offlineEdit && !Algorithms.isEmpty(poiTypeTag)) { node.putTagNoLC(EditPoiData.POI_TYPE_TAG, poiTypeTag); } } commitNode(action, node, mOpenstreetmapUtil.getEntityInfo(node.getId()), "", false, new CallbackWithObject<Node>() { @Override public boolean processResult(Node result) { if (result != null) { OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); if (plugin != null && offlineEdit) { List<OpenstreetmapPoint> points = plugin.getDBPOI().getOpenstreetmapPoints(); if (getActivity() instanceof MapActivity && points.size() > 0) { OsmPoint point = points.get(points.size() - 1); MapActivity mapActivity = (MapActivity) getActivity(); mapActivity.getContextMenu().showOrUpdate( new LatLon(point.getLatitude(), point.getLongitude()), plugin.getOsmEditsLayer(mapActivity).getObjectName(point), point); } } if (getActivity() instanceof MapActivity) { ((MapActivity) getActivity()).getMapView().refreshMap(true); } dismiss(); } else { OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); mOpenstreetmapUtil = plugin.getPoiModificationLocalUtil(); Button saveButton = (Button) view.findViewById(R.id.saveButton); saveButton.setText(mOpenstreetmapUtil instanceof OpenstreetmapRemoteUtil ? R.string.shared_string_upload : R.string.shared_string_save); } return false; } }, getActivity(), mOpenstreetmapUtil); } private void dismissCheckForChanges() { if (editPoiData.hasChangesBeenMade()) { new AreYouSureDialogFragment().show(getChildFragmentManager(), "AreYouSureDialogFragment"); } else { dismiss(); } } public EditPoiData getEditPoiData() { return editPoiData; } public void setSubCategory(String subCategory) { poiTypeEditText.setText(subCategory); } public static void commitNode(final OsmPoint.Action action, final Node node, final EntityInfo info, final String comment, final boolean closeChangeSet, final CallbackWithObject<Node> postExecute, final Activity activity, final OpenstreetmapUtil openstreetmapUtil) { if (info == null && OsmPoint.Action.CREATE != action && openstreetmapUtil instanceof OpenstreetmapRemoteUtil) { Toast.makeText(activity, activity.getResources().getString(R.string.poi_error_info_not_loaded), Toast.LENGTH_LONG).show(); return; } new AsyncTask<Void, Void, Node>() { ProgressDialog progress; @Override protected void onPreExecute() { progress = ProgressDialog.show(activity, activity.getString(R.string.uploading), activity.getString(R.string.uploading_data)); super.onPreExecute(); } @Override protected Node doInBackground(Void... params) { return openstreetmapUtil.commitNodeImpl(action, node, info, comment, closeChangeSet); } @Override protected void onPostExecute(Node result) { progress.dismiss(); if (postExecute != null) { postExecute.processResult(result); } } }.execute(); } public void setPoiCategory(PoiCategory type) { editPoiData.updateType(type); poiTypeEditText.setText(editPoiData.getPoiTypeString()); setAdapterForPoiTypeEditText(); } private void setAdapterForPoiTypeEditText() { final Map<String, PoiType> subCategories = new LinkedHashMap<>(); PoiCategory ct = editPoiData.getPoiCategory(); if (ct != null) { for (PoiType s : ct.getPoiTypes()) { if (!s.isReference() && !s.isNotEditableOsm() && s.getBaseLangType() == null) { addMapEntryAdapter(subCategories, s.getTranslation(), s); if(!s.getKeyName().contains("osmand")) { addMapEntryAdapter(subCategories, s.getKeyName().replace('_', ' '), s); } } } } for (Map.Entry<String, PoiType> s : editPoiData.getAllTranslatedSubTypes().entrySet()) { addMapEntryAdapter(subCategories, s.getKey(), s.getValue()); } final ArrayAdapter<Object> adapter; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { adapter = new ArrayAdapter<>(getActivity(), R.layout.list_textview, subCategories.keySet().toArray()); } else { TypedValue typedValue = new TypedValue(); Resources.Theme theme = getActivity().getTheme(); theme.resolveAttribute(android.R.attr.textColorSecondary, typedValue, true); final int textColor = typedValue.data; adapter = new ArrayAdapter<Object>(getActivity(), R.layout.list_textview, subCategories.keySet().toArray()) { @Override public View getView(int position, View convertView, ViewGroup parent) { final View view = super.getView(position, convertView, parent); ((TextView) view.findViewById(R.id.textView)).setTextColor(textColor); return view; } }; } adapter.sort(new Comparator<Object>() { @Override public int compare(Object lhs, Object rhs) { return lhs.toString().compareTo(rhs.toString()); } }); poiTypeEditText.setAdapter(adapter); poiTypeEditText.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item = parent.getAdapter().getItem(position); poiTypeEditText.setText(item.toString()); setAdapterForPoiTypeEditText(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } private void addMapEntryAdapter(final Map<String, PoiType> subCategories, String key, PoiType v) { if (!subCategories.containsKey(key.toLowerCase())) { subCategories.put(Algorithms.capitalizeFirstLetterAndLowercase(key), v); } } public static EditPoiDialogFragment createAddPoiInstance(double latitude, double longitude, OsmandApplication application) { Node node = new Node(latitude, longitude, -1); return createInstance(node, true); } public static EditPoiDialogFragment createInstance(Node node, boolean isAddingPoi) { EditPoiDialogFragment editPoiDialogFragment = new EditPoiDialogFragment(); Bundle args = new Bundle(); args.putSerializable(KEY_AMENITY_NODE, node); args.putBoolean(IS_ADDING_POI, isAddingPoi); editPoiDialogFragment.setArguments(args); return editPoiDialogFragment; } public static EditPoiDialogFragment createInstance(Node node, boolean isAddingPoi, Map<String, String> tagList) { EditPoiDialogFragment editPoiDialogFragment = new EditPoiDialogFragment(); Bundle args = new Bundle(); args.putSerializable(KEY_AMENITY_NODE, node); args.putBoolean(IS_ADDING_POI, isAddingPoi); args.putSerializable(TAGS_LIST, (Serializable) Collections.unmodifiableMap(tagList)); editPoiDialogFragment.setArguments(args); return editPoiDialogFragment; } public static void showEditInstance(final Amenity amenity, final AppCompatActivity activity) { final OsmandSettings settings = ((OsmandApplication) activity.getApplication()) .getSettings(); final OpenstreetmapUtil openstreetmapUtilToLoad; OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); if (//settings.OFFLINE_EDITION.get() || !settings.isInternetConnectionAvailable(true)) { openstreetmapUtilToLoad = plugin.getPoiModificationLocalUtil(); } else { openstreetmapUtilToLoad = plugin.getPoiModificationRemoteUtil(); } new AsyncTask<Void, Void, Node>() { @Override protected Node doInBackground(Void... params) { return openstreetmapUtilToLoad.loadNode(amenity); } protected void onPostExecute(Node n) { if (n != null) { EditPoiDialogFragment fragment = EditPoiDialogFragment.createInstance(n, false); fragment.show(activity.getSupportFragmentManager(), TAG); } else { Toast.makeText(activity, activity.getString(R.string.poi_error_poi_not_found), Toast.LENGTH_LONG).show(); } } }.execute(); } public static class MyAdapter extends FragmentPagerAdapter { private final Fragment[] fragments = new Fragment[]{new BasicEditPoiFragment(), new AdvancedEditPoiFragment()}; private final String[] titles; public MyAdapter(FragmentManager fm, String basicTitle, String extendedTitle) { super(fm); titles = new String[]{basicTitle, extendedTitle}; } @Override public int getCount() { return 2; } @Override public Fragment getItem(int position) { return fragments[position]; } @Override public CharSequence getPageTitle(int position) { return titles[position]; } } public static class ShowDeleteDialogAsyncTask extends AsyncTask<Amenity, Void, Node> { private final OpenstreetmapUtil openstreetmapUtil; private final AppCompatActivity activity; public ShowDeleteDialogAsyncTask(AppCompatActivity activity) { this.activity = activity; OsmandSettings settings = ((OsmandApplication) activity.getApplication()).getSettings(); OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); if (settings.OFFLINE_EDITION.get() || !settings.isInternetConnectionAvailable(true)) { openstreetmapUtil = plugin.getPoiModificationLocalUtil(); } else { openstreetmapUtil = plugin.getPoiModificationRemoteUtil(); } } protected Node doInBackground(Amenity[] params) { return openstreetmapUtil.loadNode(params[0]); } protected void onPostExecute(final Node n) { if (n == null) { Toast.makeText(activity, activity.getResources().getString(R.string.poi_error_poi_not_found), Toast.LENGTH_LONG).show(); return; } AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.poi_remove_title); final EditText comment; final CheckBox closeChangesetCheckBox; final boolean isLocalEdit = openstreetmapUtil instanceof OpenstreetmapLocalUtil; if (isLocalEdit) { closeChangesetCheckBox = null; comment = null; } else { LinearLayout ll = new LinearLayout(activity); ll.setPadding(16, 2, 16, 0); ll.setOrientation(LinearLayout.VERTICAL); closeChangesetCheckBox = new CheckBox(activity); closeChangesetCheckBox.setText(R.string.close_changeset); ll.addView(closeChangesetCheckBox); comment = new EditText(activity); comment.setText(R.string.poi_remove_title); ll.addView(comment); builder.setView(ll); } builder.setNegativeButton(R.string.shared_string_cancel, null); builder.setPositiveButton(isLocalEdit ? R.string.shared_string_save : R.string.shared_string_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String c = comment == null ? null : comment.getText().toString(); boolean closeChangeSet = closeChangesetCheckBox != null && closeChangesetCheckBox.isChecked(); deleteNode(n, c, closeChangeSet); } }); builder.create().show(); } private void deleteNode(final Node n, final String c, final boolean closeChangeSet) { final boolean isLocalEdit = openstreetmapUtil instanceof OpenstreetmapLocalUtil; commitNode(OsmPoint.Action.DELETE, n, openstreetmapUtil.getEntityInfo(n.getId()), c, closeChangeSet, new CallbackWithObject<Node>() { @Override public boolean processResult(Node result) { if (result != null) { if (isLocalEdit) { Toast.makeText(activity, R.string.osm_changes_added_to_local_edits, Toast.LENGTH_LONG).show(); } else { Toast.makeText(activity, R.string.poi_remove_success, Toast.LENGTH_LONG) .show(); } if (activity instanceof MapActivity) { ((MapActivity) activity).getMapView().refreshMap(true); } } return false; } }, activity, openstreetmapUtil); } } public static class SaveExtraValidationDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); String msg = getString(R.string.save_poi_without_poi_type_message); int i = getArguments().getInt("message", 0); if(i != 0) { msg = getString(i); } builder.setTitle(getResources().getString(R.string.are_you_sure)) .setMessage(msg) .setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((EditPoiDialogFragment) getParentFragment()).save(); } }) .setNegativeButton(R.string.shared_string_cancel, null); return builder.create(); } } public static class AreYouSureDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(getResources().getString(R.string.are_you_sure)) .setMessage(getString(R.string.unsaved_changes_will_be_lost)) .setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((DialogFragment) getParentFragment()).dismiss(); } }) .setNegativeButton(R.string.shared_string_cancel, null); return builder.create(); } } private TextView.OnEditorActionListener mOnEditorActionListener = new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; if (actionId == EditorInfo.IME_ACTION_SEND) { trySave(); handled = true; } return handled; } }; public interface OnFragmentActivatedListener { void onFragmentActivated(); } }