From ef408d453b84b5bf34a0736f92acd1c58fcf493d Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Thu, 23 Nov 2017 16:04:58 +0200 Subject: [PATCH 01/13] Create landscape ui for notes --- OsmAnd/res/layout/list_item_header.xml | 1 - .../osmand/plus/osmedit/OsmEditsAdapter.java | 235 ++++++++++++++---- .../osmand/plus/osmedit/OsmEditsFragment.java | 82 +++--- 3 files changed, 221 insertions(+), 97 deletions(-) diff --git a/OsmAnd/res/layout/list_item_header.xml b/OsmAnd/res/layout/list_item_header.xml index 7a880dc640..53d6e5cf11 100644 --- a/OsmAnd/res/layout/list_item_header.xml +++ b/OsmAnd/res/layout/list_item_header.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:descendantFocusability="blocksDescendants" android:orientation="vertical"> { +public class OsmEditsAdapter extends ArrayAdapter { + + public static final int TYPE_HEADER = 0; + private static final int TYPE_ITEM = 1; + private static final int TYPE_COUNT = 2; private OsmandApplication app; + private List items; private boolean selectionMode; private List selectedOsmEdits; + private boolean portrait; private OsmEditsAdapterListener listener; - public OsmEditsAdapter(OsmandApplication app, @NonNull List points) { - super(app, 0, points); + public OsmEditsAdapter(OsmandApplication app, @NonNull List items) { + super(app, 0, items); this.app = app; + this.items = items; } public boolean isSelectionMode() { @@ -46,6 +56,10 @@ public class OsmEditsAdapter extends ArrayAdapter { this.selectedOsmEdits = selectedOsmEdits; } + public void setPortrait(boolean portrait) { + this.portrait = portrait; + } + public void setAdapterListener(OsmEditsAdapterListener listener) { this.listener = listener; } @@ -53,69 +67,164 @@ public class OsmEditsAdapter extends ArrayAdapter { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { - View view = convertView; - if (view == null) { - view = LayoutInflater.from(getContext()).inflate(R.layout.note_list_item, parent, false); - OsmEditViewHolder holder = new OsmEditViewHolder(view); - view.setTag(holder); - } - final OsmPoint osmEdit = getItem(position); - - if (osmEdit != null) { - final OsmEditViewHolder holder = (OsmEditViewHolder) view.getTag(); - - holder.titleTextView.setText(OsmEditingPlugin.getName(osmEdit)); - holder.descriptionTextView.setText(getDescription(osmEdit)); - Drawable icon = getIcon(osmEdit); - if (icon != null) { - holder.icon.setImageDrawable(icon); + if (portrait) { + if (convertView == null) { + if (position == 0) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_header, parent, false); + HeaderViewHolder holder = new HeaderViewHolder(convertView); + convertView.setTag(holder); + } else { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.note_list_item, parent, false); + OsmEditViewHolder holder = new OsmEditViewHolder(convertView); + convertView.setTag(holder); + } } - if (selectionMode) { - holder.optionsImageButton.setVisibility(View.GONE); - holder.selectCheckBox.setVisibility(View.VISIBLE); - holder.selectCheckBox.setChecked(selectedOsmEdits.contains(osmEdit)); - holder.icon.setVisibility(View.GONE); - holder.selectCheckBox.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) { - listener.onItemSelect(osmEdit, holder.selectCheckBox.isChecked()); - } - } - }); + if (position == 0) { + bindHeaderViewHolder((HeaderViewHolder) convertView.getTag()); } else { - holder.icon.setVisibility(View.VISIBLE); - holder.optionsImageButton.setVisibility(View.VISIBLE); - holder.selectCheckBox.setVisibility(View.GONE); + final Object item = getItem(position); + if (item instanceof OsmPoint) { + final OsmEditViewHolder holder = (OsmEditViewHolder) convertView.getTag(); + bindOsmEditViewHolder(holder, (OsmPoint) item, position); + } } - holder.optionsImageButton.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_overflow_menu_white)); - holder.optionsImageButton.setOnClickListener(new View.OnClickListener() { + return convertView; + } else { + int margin = app.getResources().getDimensionPixelSize(R.dimen.content_padding); + int sideMargin = app.getResources().getDisplayMetrics().widthPixels / 10; + + FrameLayout fl = new FrameLayout(getContext()); + LinearLayout ll = new LinearLayout(getContext()); + ll.setOrientation(LinearLayout.VERTICAL); + ll.setBackgroundResource(app.getSettings().isLightContent() ? R.drawable.bg_card_light : R.drawable.bg_card_dark); + fl.addView(ll); + ((FrameLayout.LayoutParams) ll.getLayoutParams()).setMargins(sideMargin, margin, sideMargin, margin); + + HeaderViewHolder headerViewHolder = new HeaderViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.list_item_header, parent, false)); + bindHeaderViewHolder(headerViewHolder); + ll.addView(headerViewHolder.mainView); + + for (int i = 0; i < items.size(); i++) { + Object item = getItem(i); + if (item instanceof OsmPoint) { + OsmEditViewHolder viewHolder = new OsmEditViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.note_list_item, parent, false)); + bindOsmEditViewHolder(viewHolder, (OsmPoint) item, i); + ll.addView(viewHolder.mainView); + } + } + + return fl; + } + } + + @Override + public int getCount() { + if (portrait) { + return super.getCount(); + } else { + return getHeadersCount(); + } + } + + @Override + public int getItemViewType(int position) { + Object item = getItem(position); + if (item instanceof OsmPoint) { + return TYPE_ITEM; + } + return (int) item; + } + + @Override + public int getViewTypeCount() { + return TYPE_COUNT; + } + + private int getHeadersCount() { + int count = 0; + for (int i = 0; i < items.size(); i++) { + Object item = items.get(i); + if (!(item instanceof OsmPoint)) { + count++; + } + } + return count; + } + + private void bindHeaderViewHolder(final HeaderViewHolder holder) { + holder.topDivider.setVisibility(portrait ? View.VISIBLE : View.GONE); + holder.title.setText(R.string.your_edits); + holder.checkBox.setChecked(isAllSelected()); + if (selectionMode) { + holder.checkBox.setVisibility(View.VISIBLE); + holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { - listener.onOptionsClick(osmEdit); + listener.onHeaderCheckboxClick(holder.checkBox.isChecked()); } } }); - holder.mainView.setOnClickListener(new View.OnClickListener() { + } else { + holder.checkBox.setVisibility(View.GONE); + } + } + + private void bindOsmEditViewHolder(final OsmEditViewHolder holder, final OsmPoint osmEdit, int position) { + holder.titleTextView.setText(OsmEditingPlugin.getName(osmEdit)); + holder.descriptionTextView.setText(getDescription(osmEdit)); + Drawable icon = getIcon(osmEdit); + if (icon != null) { + holder.icon.setImageDrawable(icon); + } + if (selectionMode) { + holder.optionsImageButton.setVisibility(View.GONE); + holder.selectCheckBox.setVisibility(View.VISIBLE); + holder.selectCheckBox.setChecked(selectedOsmEdits.contains(osmEdit)); + holder.icon.setVisibility(View.GONE); + holder.selectCheckBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (selectionMode) { - holder.selectCheckBox.performClick(); - } else { - if (listener != null) { - listener.onItemShowMap(osmEdit); - } + if (listener != null) { + listener.onItemSelect(osmEdit, holder.selectCheckBox.isChecked()); } - } }); - boolean showDivider = getCount() > 1 && position != getCount() - 1; - holder.bottomDivider.setVisibility(showDivider ? View.VISIBLE : View.GONE); + } else { + holder.icon.setVisibility(View.VISIBLE); + holder.optionsImageButton.setVisibility(View.VISIBLE); + holder.selectCheckBox.setVisibility(View.GONE); } - return view; + holder.optionsImageButton.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_overflow_menu_white)); + holder.optionsImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) { + listener.onOptionsClick(osmEdit); + } + } + }); + holder.mainView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (selectionMode) { + holder.selectCheckBox.performClick(); + } else { + if (listener != null) { + listener.onItemShowMap(osmEdit); + } + } + + } + }); + boolean showDivider = getItemsCount() > 1 && position != getItemsCount() - 1; + holder.bottomDivider.setVisibility(showDivider ? View.VISIBLE : View.GONE); + } + + private int getItemsCount() { + return items.size(); } private Drawable getIcon(OsmPoint point) { @@ -158,6 +267,18 @@ public class OsmEditsAdapter extends ArrayAdapter { return null; } + private boolean isAllSelected() { + for (int i = 0; i < items.size(); i++) { + Object item = items.get(i); + if (item instanceof OsmPoint) { + if (!selectedOsmEdits.contains(item)) { + return false; + } + } + } + return true; + } + private String getDescription(OsmPoint point) { String action = ""; if (point.getAction() == OsmPoint.Action.CREATE) { @@ -197,6 +318,20 @@ public class OsmEditsAdapter extends ArrayAdapter { return description; } + private class HeaderViewHolder { + View mainView; + View topDivider; + CheckBox checkBox; + TextView title; + + HeaderViewHolder(View view) { + mainView = view; + topDivider = view.findViewById(R.id.top_divider); + checkBox = (CheckBox) view.findViewById(R.id.check_box); + title = (TextView) view.findViewById(R.id.title_text_view); + } + } + private class OsmEditViewHolder { View mainView; ImageView icon; @@ -219,6 +354,8 @@ public class OsmEditsAdapter extends ArrayAdapter { public interface OsmEditsAdapterListener { + void onHeaderCheckboxClick(boolean checked); + void onItemSelect(OsmPoint point, boolean checked); void onItemShowMap(OsmPoint point); diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java index 789275e3a1..9a20d11c25 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java @@ -21,7 +21,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; import android.widget.ArrayAdapter; -import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; @@ -64,7 +63,6 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo private OsmEditingPlugin plugin; private View footerView; - private View headerView; private View emptyView; private List osmEdits = new ArrayList<>(); @@ -133,6 +131,12 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo return listAdapter; } + private void recreateAdapterData() { + listAdapter.clear(); + listAdapter.addAll(createItemsList()); + listAdapter.notifyDataSetChanged(); + } + private void selectAll() { for (int i = 0; i < osmEdits.size(); i++) { OsmPoint point = osmEdits.get(i); @@ -285,7 +289,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo private void updateSelectionMode(ActionMode m) { updateSelectionTitle(m); - refreshSelectAll(); + listAdapter.notifyDataSetChanged(); } private void updateSelectionTitle(ActionMode m) { @@ -296,28 +300,9 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo } } - private void refreshSelectAll() { - View view = getView(); - if (view == null) { - return; - } - CheckBox selectAll = (CheckBox) view.findViewById(R.id.check_box); - for (int i = 0; i < osmEdits.size(); i++) { - OsmPoint point = osmEdits.get(i); - if (!osmEditsSelected.contains(point)) { - selectAll.setChecked(false); - return; - } - } - selectAll.setChecked(true); - } - private void enableSelectionMode(boolean selectionMode) { listAdapter.setSelectionMode(selectionMode); //noinspection ConstantConditions - if (headerView != null) { - headerView.findViewById(R.id.check_box).setVisibility(selectionMode ? View.VISIBLE : View.GONE); - } ((FavoritesActivity) getActivity()).setToolbarVisibility(!selectionMode && AndroidUiHelper.isOrientationPortrait(getActivity())); ((FavoritesActivity) getActivity()).updateListViewFooter(footerView); } @@ -348,6 +333,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo } private void fetchData() { + boolean portrait = AndroidUiHelper.isOrientationPortrait(getActivity()); osmEdits = new ArrayList<>(); List l1 = plugin.getDBPOI().getOpenstreetmapPoints(); List l2 = plugin.getDBBug().getOsmbugsPoints(); @@ -357,32 +343,24 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo listView.setDivider(null); listView.setEmptyView(emptyView); - if (osmEdits.size() > 0) { - if (footerView == null) { - footerView = getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, listView, false); - listView.addFooterView(footerView); - } - if (headerView == null) { - headerView = getActivity().getLayoutInflater().inflate(R.layout.list_item_header, listView, false); - listView.addHeaderView(headerView); - ((TextView) headerView.findViewById(R.id.title_text_view)).setText(R.string.your_edits); - final CheckBox selectAll = (CheckBox) headerView.findViewById(R.id.check_box); - selectAll.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (selectAll.isChecked()) { - selectAll(); - } else { - deselectAll(); - } - updateSelectionTitle(actionMode); - } - }); - } + if (osmEdits.size() > 0 && footerView == null && portrait) { + footerView = getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, listView, false); + listView.addFooterView(footerView); } - listAdapter = new OsmEditsAdapter(getMyApplication(), osmEdits); + List items = createItemsList(); + listAdapter = new OsmEditsAdapter(getMyApplication(), items); listAdapter.setSelectedOsmEdits(osmEditsSelected); listAdapter.setAdapterListener(new OsmEditsAdapter.OsmEditsAdapterListener() { + @Override + public void onHeaderCheckboxClick(boolean checked) { + if (checked) { + selectAll(); + } else { + deselectAll(); + } + updateSelectionTitle(actionMode); + } + @Override public void onItemSelect(OsmPoint point, boolean checked) { if (checked) { @@ -403,9 +381,19 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo openPopUpMenu(note); } }); + listAdapter.setPortrait(portrait); listView.setAdapter(listAdapter); } + private List createItemsList() { + List items = new ArrayList<>(); + if (!osmEdits.isEmpty()) { + items.add(OsmEditsAdapter.TYPE_HEADER); + items.addAll(osmEdits); + } + return items; + } + private void showBugDialog(final OsmNotesPoint point) { final View view = LayoutInflater.from(getActivity()).inflate(R.layout.open_bug, null); view.findViewById(R.id.user_name_field).setVisibility(View.GONE); @@ -527,7 +515,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo osmEdits.remove(osmPoint); } } - listAdapter.notifyDataSetChanged(); + recreateAdapterData(); } }; dialog.show(getActivity().getSupportFragmentManager(), ProgressDialogFragment.TAG); @@ -546,7 +534,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo private void deletePoint(OsmPoint osmPoint) { osmEdits.remove(osmPoint); - listAdapter.notifyDataSetChanged(); + recreateAdapterData(); } private void notifyDataSetChanged() { From 409de505f65d8484eed1fa23422a2522217d821a Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Thu, 23 Nov 2017 16:21:16 +0200 Subject: [PATCH 02/13] Show category if name is absent --- .../osmand/plus/osmedit/OsmEditsAdapter.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java index 1e1984ed7a..c55fb4e2ac 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java @@ -1,8 +1,12 @@ package net.osmand.plus.osmedit; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.system.Os; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -172,7 +176,7 @@ public class OsmEditsAdapter extends ArrayAdapter { } private void bindOsmEditViewHolder(final OsmEditViewHolder holder, final OsmPoint osmEdit, int position) { - holder.titleTextView.setText(OsmEditingPlugin.getName(osmEdit)); + holder.titleTextView.setText(getTitle(osmEdit)); holder.descriptionTextView.setText(getDescription(osmEdit)); Drawable icon = getIcon(osmEdit); if (icon != null) { @@ -227,6 +231,15 @@ public class OsmEditsAdapter extends ArrayAdapter { return items.size(); } + private SpannableString getTitle(OsmPoint osmPoint) { + SpannableString title = new SpannableString(OsmEditingPlugin.getName(osmPoint)); + if (TextUtils.isEmpty(title)) { + title = SpannableString.valueOf(getCategory(osmPoint)); + title.setSpan(new StyleSpan(Typeface.ITALIC), 0, title.length(), 0); + } + return title; + } + private Drawable getIcon(OsmPoint point) { if (point.getGroup() == OsmPoint.Group.POI) { OpenstreetmapPoint osmPoint = (OpenstreetmapPoint) point; @@ -279,6 +292,14 @@ public class OsmEditsAdapter extends ArrayAdapter { return true; } + private String getCategory(OsmPoint point) { + String category = ""; + if (point.getGroup() == OsmPoint.Group.POI) { + category = ((OpenstreetmapPoint) point).getEntity().getTag(EditPoiData.POI_TYPE_TAG); + } + return category; + } + private String getDescription(OsmPoint point) { String action = ""; if (point.getAction() == OsmPoint.Action.CREATE) { @@ -291,10 +312,7 @@ public class OsmEditsAdapter extends ArrayAdapter { action = getContext().getString(R.string.shared_string_edited); } - String category = ""; - if (point.getGroup() == OsmPoint.Group.POI) { - category = ((OpenstreetmapPoint) point).getEntity().getTag(EditPoiData.POI_TYPE_TAG); - } + String category = getCategory(point); String comment = ""; if (point.getGroup() == OsmPoint.Group.BUG) { From 466c4b67450dc0366815950541e5449ece7840b5 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Thu, 23 Nov 2017 16:25:51 +0200 Subject: [PATCH 03/13] Refactor finding headers --- OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java index c55fb4e2ac..e6ddc88858 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsAdapter.java @@ -149,7 +149,7 @@ public class OsmEditsAdapter extends ArrayAdapter { int count = 0; for (int i = 0; i < items.size(); i++) { Object item = items.get(i); - if (!(item instanceof OsmPoint)) { + if (item instanceof Integer) { count++; } } From 9dcbcc49ede40269e793853cbce6fb5c1ae574ae Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Thu, 23 Nov 2017 17:23:17 +0200 Subject: [PATCH 04/13] Fix issue with fullscreen; fix NPE --- .../dialogs/ContextMenuCardDialogFragment.java | 7 ++----- .../plus/mapmarkers/MapMarkersDialogFragment.java | 15 +++++++-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/dialogs/ContextMenuCardDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/dialogs/ContextMenuCardDialogFragment.java index 899a7f1e0e..04a5766d07 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/dialogs/ContextMenuCardDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/dialogs/ContextMenuCardDialogFragment.java @@ -13,6 +13,7 @@ import android.webkit.WebView; import android.widget.LinearLayout; import android.widget.TextView; +import net.osmand.AndroidUtils; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; @@ -40,6 +41,7 @@ public class ContextMenuCardDialogFragment extends BaseOsmAndFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.context_menu_card_dialog, container, false); + AndroidUtils.addStatusBarPadding21v(getActivity(), view); if (dialog.getType() == ContextMenuCardDialog.CardDialogType.MAPILLARY) { view.findViewById(R.id.dialog_layout) .setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.mapillary_action_bar)); @@ -119,11 +121,6 @@ public class ContextMenuCardDialogFragment extends BaseOsmAndFragment { return -1; } - @Override - protected boolean isFullScreenAllowed() { - return false; - } - public static void showInstance(ContextMenuCardDialog menu) { ContextMenuCardDialogFragment fragment = new ContextMenuCardDialogFragment(); fragment.dialog = menu; diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java index 7c4334b7f6..e4db5be489 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java @@ -18,7 +18,6 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.Window; import android.widget.TextView; import android.widget.Toast; @@ -265,10 +264,10 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm public void blurStatusBar() { if (Build.VERSION.SDK_INT >= 21) { - Window window = getDialog().getWindow(); - if (window != null) { - statusBarColor = window.getStatusBarColor(); - window.setStatusBarColor(ContextCompat.getColor(getActivity(), + Dialog dialog = getDialog(); + if (dialog != null && dialog.getWindow() != null) { + statusBarColor = dialog.getWindow().getStatusBarColor(); + dialog.getWindow().setStatusBarColor(ContextCompat.getColor(getActivity(), lightTheme ? R.color.status_bar_dim_light : R.color.status_bar_dim_dark)); } } @@ -276,9 +275,9 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm public void clearStatusBar() { if (Build.VERSION.SDK_INT >= 21 && statusBarColor != -1) { - Window window = getDialog().getWindow(); - if (window != null) { - window.setStatusBarColor(statusBarColor); + Dialog dialog = getDialog(); + if (dialog != null && dialog.getWindow() != null) { + dialog.getWindow().setStatusBarColor(statusBarColor); } } } From 7e17616efeab57c94b54ad2ae0b107d4d75d27eb Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Thu, 23 Nov 2017 03:28:49 +0000 Subject: [PATCH 05/13] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2515 of 2515 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 9c86ab604e..a370d5802d 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -2948,11 +2948,11 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式 \@string/shared_string_history - 選擇如何顯示現行標記的距離。 + 選擇如何顯示活動標記的距離。 選擇想顯示多少的方向指標。 標記為已通過的標點將顯現在此螢幕上。 - 從您的位置顯示指引路線到現行的標記位置。 - 顯示一個或兩個箭頭指示方向到現行的標記。 + 從您的位置顯示指引路線到活動標記位置。 + 顯示一個或兩個箭頭指示方向到活動標記。 更多 尋找軌跡跟航點 建立或修改 OSM 物件 From 511f939aa5d29f774d78af092c03fd8ed9b4e05d Mon Sep 17 00:00:00 2001 From: josep constanti Date: Thu, 23 Nov 2017 20:25:19 +0000 Subject: [PATCH 06/13] Translated using Weblate (Catalan) Currently translated at 99.8% (2510 of 2515 strings) --- OsmAnd/res/values-ca/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 3ff78b63da..012c4a6ba3 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -2726,4 +2726,10 @@ Abasta l\'àrea: %1$s x %2$s Recerca de traces amb fites Crea o modifica objectes OSM Crea o modifica PDIs OSM, inicia o comenta Notes OSM i aporta traces GPX enregistrades. + S\'ha esborrat + S\'ha editat + S\'ha afegit + Marcador %s activat. + Premeu sobre el marcador en el mapa, arrossegueu-lo al capdavant dels marcadors actius, sense obrir el menú de context. + Preneu notes! From 473ac1f7f5e1f79d07b057aa7c0dfc4ee3e30f7d Mon Sep 17 00:00:00 2001 From: elPresidento Date: Thu, 23 Nov 2017 16:46:32 +0000 Subject: [PATCH 07/13] Translated using Weblate (Czech) Currently translated at 99.2% (2497 of 2515 strings) --- OsmAnd/res/values-cs/strings.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 7f6de3b1e5..08ac4a883f 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -2845,4 +2845,16 @@ Pokud potřebujete pomoci s aplikací OsmAnd, prosím kontaktujte naši podporu Režim celé obrazovky Zobrazit na horní liště Značka prošlá + Vytvořit nebo upravit OSM POI, otevřít nebo okomentovat OSM poznámky a přispět zaznamenanými GPX soubory. + Odstraněné + Upravené + Přidané + Značka %s aktivována. + Klepněte na značku na mapě, přesuňte ji na první místo v aktivních značkách bez otevření kontextové nabídky. + Dělejte si poznámky! + Přidejte audio, video nebo fotografickou poznámku pro každý bod na mapě, pomocí nástroje nebo kontextového menu. + Poznámky podle datumu + Podle datumu + Podle typu + Klepnutím nebo přidržením označte místa, pak klepněte na tlačítko značky s vlajkou. From b2fbb56193196992c9b38ddf5dde3ac6d8f7322b Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Thu, 23 Nov 2017 13:00:31 +0000 Subject: [PATCH 08/13] Translated using Weblate (Hebrew) Currently translated at 72.5% (1824 of 2515 strings) --- OsmAnd/res/values-he/strings.xml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 489dee1fae..c6938ac92f 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -2180,4 +2180,36 @@ יצירה או שינוי של עצמים ב־OSM נמחקה נערכה + נוספה + הסמן %s הופעל. + אפשר לשמור הערות! + ניתן להוסיף הערה מסוג שמע, וידאו או תמונה לכל נקודה במפה באמצעות וידג׳ט או תפריט הקשר. + הערות לפי תאריך + לפי תאריך + לפי סוג + ניתן להירשם לרשימת הדיוור שלנו כדי לקבל הנחות על היישומון ולקבל עוד 3 הורדות של מפות בחינם! + ערכות של מפות שמכילות קווי מתאר של עומק הים ונקודות ימיות. + תודה לך על רכישת קווי המתאר של עומק הים! + קווי מתאר של עומק הים + קווי מתאר של עומק הים + מפות ימיות + לא להציג הודעות פתיחה + אפשרויות חנייה + תודה לך על רכישת הגרסה המלאה של OsmAnd! + הררי + פחות הררי + מישור + נתיבים קצרים יותר + מאוזן + סוג שטח מועדף: מישורי או הררי. + מדרון + הוספת תיקייה חדשה + הנקודות נמחקו בהצלחה. + פעולה זו תוביל למחיקתן של %1$d נקודות. להמשיך? + פניות שיש לקחת בנתיב הזה + מסלול + מהירות מרבית + מהירות ממוצעת + זמן תנועה + מרבי From cca950e757ae5789504a5a1243ebfac63c5f6831 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Thu, 23 Nov 2017 23:15:20 +0000 Subject: [PATCH 09/13] Translated using Weblate (Sardinian) Currently translated at 100.0% (2515 of 2515 strings) --- OsmAnd/res/values-sc/strings.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index b57e318c70..6aa3ce2b00 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -2871,4 +2871,17 @@ Pro praghere iscrie su còdighe intreu Issèbera cantos indicadores de diretzione cheres ammustrare. Àteru Chirchende rastas cun puntos de coladòrgiu + Crea o modìfica ogetos OSM + Crea o modìfica PDI OSM, aberende o cummentende notas OSM, e contribuende cun documentos GPX registrados. + Iscantzelladu + Modificadu + Annantu + Marcadore %s ativadu. + Incarca in unu marcadore in sa mapa, moe·lu in sa prima positzione in sos marcadores ativos, chene abèrrere su menù contestuale. + Ativatzione cun un\'incarcu + Piga notas! + Annanghe notas sonoras, vìdeos o fotografias a cada puntu in sa mapa, impreende su widget o su menù contestuale. + Notas pro data + Pro data + Pro casta From a7a0e75015b5144898721321c80f8e1dc54e7b5d Mon Sep 17 00:00:00 2001 From: Matej U Date: Thu, 23 Nov 2017 20:12:21 +0000 Subject: [PATCH 10/13] Translated using Weblate (Slovenian) Currently translated at 89.5% (2252 of 2515 strings) --- OsmAnd/res/values-sl/strings.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sl/strings.xml b/OsmAnd/res/values-sl/strings.xml index a4a099f762..ebdbcc3651 100644 --- a/OsmAnd/res/values-sl/strings.xml +++ b/OsmAnd/res/values-sl/strings.xml @@ -2898,8 +2898,18 @@ Koda predstavlja območje: %1$s x %2$s Označi kot dejavno Videz na zemljevidu Vmesne točke sledi - Skupina priljubljenih + Kategorija priljubljenih Dodaj skupino Uvozi skupine Prilepi + Ustvari ali spremeni predmete OSM + Izbrisano + Urejeno + Dodano + Po datumu + Po vrsti + Več ... + Desno + Levo + Pokaži številčnico From acaa7e6b59688e8818a33fb58e5f8c90ca280791 Mon Sep 17 00:00:00 2001 From: Leif Larsson Date: Thu, 23 Nov 2017 17:25:11 +0000 Subject: [PATCH 11/13] Translated using Weblate (Swedish) Currently translated at 86.6% (2180 of 2515 strings) --- OsmAnd/res/values-sv/strings.xml | 132 +++++++++++++++---------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index b608113f3c..863f027f78 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -1294,10 +1294,10 @@ Nyttjat utrymme är {1} MB. Starta OsMo-session Beräkna rutt mellan punkter - Starta trippen automatiskt och skicka positioner när appen startats + Starta trippen automatiskt och skicka positioner när appen startats. Starta trippen automatiskt Tracker-ID - Tryck för att visa tracker-ID + Tryck för att visa tracker-ID. Sessionsmärke: %1$s Väntar på godkännande… Positioner skickade %1$d (i buffert %2$d) @@ -2067,7 +2067,7 @@ Long %2$s Öppna igen Skicka in - Ange rätt POI-typ eller hoppa över det + Ange rätt POI-typ eller hoppa över det. Vägtyp Öppnat OSM-anteckning igen Undvik trappor @@ -2082,11 +2082,11 @@ Long %2$s Lägsta kvalitet Högsta kvalitet Videokvalitet - Välj videokvalitet + Välj videokvalitet. Ljudformat - Välj ljudformat + Välj ljudformat. Ljudsamplingshastighet - Välj ljudupplösning + Välj ljudupplösning. Ingen adress angiven Slår upp adressen Hästleder @@ -2101,8 +2101,8 @@ Long %2$s Appen har inte tillräckliga behörigheter för att komma åt kameran. Appen har inte tillräckliga behörigheter för att komma åt mikrofonen. Välj röstvägledning - Välj eller hämta röstvägledning för ditt språk - Välj de vägar du vill undvika under navigering + Välj eller hämta röstvägledning för ditt språk. + Välj de vägar du vill undvika under navigering. Ljud Direkt-uppdateringar Tillgängliga kartor @@ -2148,7 +2148,7 @@ Long %2$s Välj kartmarkörer Omvänd ordning - Aktivera kartmarkörer + Aktivera kartmarkörerna. Vill du ta bort alla aktiva markörer? Vill du radera kartmarkörshistoriken? Aktiva markörer @@ -2179,17 +2179,17 @@ Detta kräver {3} MB temporärt och {1} MB permanent. Ranglista OSM-redigerare OsmAnd Live-prenumeration Prenumerera - Vi behöver det för att ge er information och bidrag + Krävs för att ge er information om bidrag. Publikt namn Visa inte mitt namn i rapporter Månadskostnad - Månadsbetalning + Månadsbetalning. Aktiv Inaktiv Ange en giltig e-postadress Ange publikt namn Tack för att du prenumererar på live-uppdateringar! - Delar av din donation kommer att skickas till OSM-användare som skickar in kartändringar i det området + Delar av din donation kommer att skickas till OSM-användare som skickar in kartändringar i det området. Prenumerationsinställningar Köp en OsmAnd Live-prenumeration först @@ -2219,18 +2219,18 @@ Detta kräver {3} MB temporärt och {1} MB permanent. \n och ännu mer … Relativ bäring Räkna inte om rutten när du lämnat den - Förhindrar automatiskt omberäkning av rutten när du lämnat den + Förhindrar automatiskt omberäkning av rutten när du lämnat den. Ingen ny beräkning av rutten vid motsatt riktning - Förhindrar automatisk omberäkning av rutten när du rör dig i motsatt riktning + Förhindrar automatisk omberäkning av rutten när du rör dig i motsatt riktning. Smart auto-meddelande - Meddela endast när riktningen till målpunkten ändras + Meddela endast när riktningen till målpunkten ändras. Period för auto-meddelande - Minsta tidsintervall mellan meddelanden + Minsta tidsintervall mellan meddelanden. Standardfärg Välj kategori Skriv in namn Skriv in kategori - Skriv in beskrivning + Skriv in beskrivning. Kartan är länkad till platsen Minimerad lista Expanderad lista @@ -2264,7 +2264,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Ändra markörens position Buss Tåg - Aktivera navigering för OsmAnd Live-förändringar + Aktivera navigering för OsmAnd Live-förändringar. OsmAnd Live-navigering Kannada Engelska (UK) @@ -2272,8 +2272,8 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Ungerska (formell) Spanska (amerikansk) Asturiska - Ange riktningen till målet med ljud - Ange riktningen till målet med vibration + Ange riktningen till målet med ljud. + Ange riktningen till målet med vibration. Riktning (ljudåterkoppling) Riktning (vibrationsåterkoppling) från @@ -2283,7 +2283,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Öppet 24/7 Minneskort Koordinatformat - Format för geografiska koordinater + Format för geografiska koordinater. delad via OsmAnd Kategorier Postnummer @@ -2324,7 +2324,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Visa inte uppdateringar Vill du uppdatera alla kartor nu? Bränslesnål väg - Använd bränslesnål väg (oftast kortare) + Använd bränslesnål väg (oftast kortare). Ändra Kom igång Är du säker på att du vill ersätta favoriten %1$s? @@ -2340,11 +2340,11 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Sök efter min plats Färgschema för konturer Minsta loggningshastighet - Filter: Välj minsta hastighet som startar loggning av en punkt + Filter: Välj minsta hastighet som startar loggning av en punkt. Loggning av minimal rörelse - Filter: Ange minsta avstånd från den senaste positionen för att en punkt ska loggas + Filter: Ange minsta avstånd från den senaste positionen för att en punkt ska loggas. Minsta loggningsprecision - Filter: Välj minsta precision som startar loggning av en punkt + Filter: Välj minsta precision som startar loggning av en punkt. Jul-POI Visa Jul-POI? Ljusbrun @@ -2357,9 +2357,9 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Inspelat Spela in Inga data - Visa en systemavisering som gör att du kan starta trippinspelning + Visa en systemavisering som gör att du kan starta trippinspelning. Tillåt motorvägar - Tillåt motorvägar + Tillåt motorvägar. Närliggande Wikipedia-artiklar Sök stad eller region Tag den %1$d avfarten och kör @@ -2373,19 +2373,19 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Pausa OsMo-tjänsten är igång Aktivera snabbstart av inspelning - " • Klickbara ikoner på kartan -\n -\n • Kraftfull sökning med POI-filter: Sök t.ex. restauranger efter kvalitet, eller campingplatser med speciellta faciliteter -\n -\n • Ny Topo Map-stil för cyklister och vandrare -\n -\n • Förbättrad trippinspelning -\n -\n • Förbättrade navigationsaviseringar (Android Wear) -\n -\n • Många andra förbättringar och felkorrigeringar -\n -\n och mer … " + • Klickbara ikoner på kartan +\n +\n • Kraftfull sökning med POI-filter: Sök t.ex. restauranger efter kvalitet, eller campingplatser med speciellta faciliteter +\n +\n • Ny Topo Map-stil för cyklister och vandrare +\n +\n • Förbättrad trippinspelning +\n +\n • Förbättrade navigationsaviseringar (Android Wear) +\n +\n • Många andra förbättringar och felkorrigeringar +\n +\n och mer … Med tanke på den kommande julen och nyåret så kan du välja att visa POI som har med julen att göra: julgranar, julmarknader med mera. Bredd på konturlinjer Vatten @@ -2393,19 +2393,19 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s En del av din donation kommer att skickas till OSM-användare som skickar in ändringar till OpenStreetMap. Prenumerationens kostnad fortsätter att vara densamma. En prenumeration aktiverar uppdateringar varje timme, dag eller vecka och obegränsade nedladdningar av alla kartor globalt. Erhåll obegränsade nedladdningar av kartor samt kartuppdateringar oftare än en gång i månaden: varje vecka, varje dag eller varje timme. - " • Ny mycket kraftfull fritextsökning -\n -\n• Ljudsystem för bil/högtalarintegrering via Blåtand -\n -\n• Förbättrad vägvisning, meddelanderöst och körfält för omdirigering -\n -\n• Förbättrat transportlager med vägrendering. -\n -\n• Fler språkversioner och nu stöd för regionala språk -\n -\n• Många fler förbättringar och felkorrigeringar -\n -\nmed mera… " + \\022 Ny mycket kraftfull fritextsökning +\n +\n• Ljudsystem för bil/högtalarintegrering via Blåtand +\n +\n• Förbättrad vägvisning, meddelanderöst och körfält för omdirigering +\n +\n• Förbättrat transportlager med vägrendering. +\n +\n• Fler språkversioner och nu stöd för regionala språk +\n +\n• Många fler förbättringar och felkorrigeringar +\n +\nmed mera… Låg Bredd på konturlinjer Hög @@ -2477,7 +2477,7 @@ Vänligen tillhandahåll fullständig kod Medelhastighet Tid i rörelse Maxhastighet - Kontrollera inte efter uppdateringar om nya versioner eller rabatter relaterade till OsmAnd + Kontrollera inte efter uppdateringar om nya versioner eller rabatter relaterade till OsmAnd. Serbiska (latin) Snabbåtgärd @@ -2505,9 +2505,9 @@ Vänligen tillhandahåll fullständig kod "Kartöverlägget har ändrats till \"%s\"." Tryck länge och dra knappen för att ändra dess position på skärmen Använd höjddata - Använd terränghöjddata från SRTM, ASTER och EU-DEM + Använd terränghöjddata från SRTM, ASTER och EU-DEM. - Visa djupkonturer och punkter + Visa djupkonturer och punkter. Sluttning Höjdområde @@ -2516,7 +2516,7 @@ Vänligen tillhandahåll fullständig kod Hastighet Säkerhet - Favoritterräng: slätt eller kuperat + Favoritterräng: slätt eller kuperat. Tack för att du köpt den fullständiga versionen av OsmAnd! Kuperat Mindre kuperat @@ -2547,7 +2547,7 @@ Vänligen tillhandahåll fullständig kod Starta om sökningen Utöka sökradien Hittade ingenting :( - Ändra sökord eller utöka sökradien + Ändra sökord eller utöka sökradien. Sorterat efter avstånd Sök favoriter Insticksmodul @@ -2564,7 +2564,7 @@ Vänligen tillhandahåll fullständig kod Synlig Online-foton Lägg till foton - Vi har inga foton för denna plats + Vi har inga foton från denna plats. Mapillary-widget Mapillary Installera @@ -2583,7 +2583,7 @@ Vänligen tillhandahåll fullständig kod Navigera Markörer Undvik isvägar och vadställen - Undvik isvägar och vadställen + Undvik isvägar och vadställen. Min plats Sortera har sparats @@ -2595,7 +2595,7 @@ Vänligen tillhandahåll fullständig kod Tag bort från Kartmarkörer Lista Grupper - Passerade: %1$s + Senast använt: %1$s Gör aktiv I dag I går @@ -2633,13 +2633,13 @@ Vänligen tillhandahåll fullständig kod Avsluta Planera rutt Exportera dina markörer till en fil: - Gruppen tas bort efter omstart + Gruppen tas bort efter nästa omstart av appen. Datum tillagd Ordna efter: Alla kartmarkörer har flyttats till historiken Kartmarkören har flyttats till historiken Använd inte animeringar - Inaktiverar animeringar i appen + Inaktiverar animeringar i appen. Linje Spara som ruttpunkter Spara som linje @@ -2655,7 +2655,7 @@ Vänligen tillhandahåll fullständig kod Mapillary-bild Öppna Mapillary Förbättra fototäckning med Mapillary - Gör så att du snabbt kan bidraga till Mapillary + Gör så att du snabbt kan bidraga till Mapillary. nedåt uppåt Kartmarkören flyttad till aktiva @@ -2665,8 +2665,8 @@ Vänligen tillhandahåll fullständig kod Visa dialogen Navigation avslutad Spara inspelade spår i mappar efter månad Spara inspelade spår i undermappar efter inspelad månad (typ 2017-01). - Visa bilder tillagda under en speciell period. - Visa bilder tillagda av en speciell användare. + Visa endast tillagda bilder + Visa endast bilder tillagda av kan importeras som favoritpunkter eller som spårfil. Importera som GPX-fil Importera som favorit From b75feae62849de6b82a8479a6f77b7aaece61a3b Mon Sep 17 00:00:00 2001 From: xmd5a Date: Fri, 24 Nov 2017 10:45:32 +0300 Subject: [PATCH 12/13] Add phrase --- OsmAnd/res/values-ru/phrases.xml | 3 +++ OsmAnd/res/values/phrases.xml | 2 ++ 2 files changed, 5 insertions(+) diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index 589423e6d7..6f58cc3883 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3662,4 +3662,7 @@ Требование: контроль Карточки не принимаются Предоплаченные билеты + + Депо + diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index c9a47078d2..8c6a71c4a8 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -3634,4 +3634,6 @@ Charging station + Depot + From 3917964342f79156b265ac2b70bbb690390008dd Mon Sep 17 00:00:00 2001 From: xmd5a Date: Fri, 24 Nov 2017 10:46:50 +0300 Subject: [PATCH 13/13] String improvement --- OsmAnd/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 61d4383a8a..02f77d643f 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -938,7 +938,7 @@ Автор Редактирование POI Добавление POI - Узел не найден или удобство (amenity) состоит из нескольких узлов, что не поддерживается. + Узел не найден или объект состоит из нескольких узлов, что не поддерживается. Вы действительно хотите удалить {0}? Удаление POI POI успешно удалена