From f55c64159e9b8a86e28a445cba5253b6164261e1 Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Thu, 4 Feb 2021 11:43:53 +0200 Subject: [PATCH 01/44] Show all available obf travel files in the card to download --- .../layout/travel_download_update_card.xml | 198 -------------- OsmAnd/res/layout/travel_needed_maps_card.xml | 34 ++- .../wikivoyage/explore/ExploreRvAdapter.java | 7 +- .../explore/ExploreTabFragment.java | 167 ++++++------ .../travelcards/TravelDownloadUpdateCard.java | 250 ++---------------- .../travelcards/TravelNeededMapsCard.java | 32 ++- 6 files changed, 166 insertions(+), 522 deletions(-) delete mode 100644 OsmAnd/res/layout/travel_download_update_card.xml diff --git a/OsmAnd/res/layout/travel_download_update_card.xml b/OsmAnd/res/layout/travel_download_update_card.xml deleted file mode 100644 index 8ad3bb7779..0000000000 --- a/OsmAnd/res/layout/travel_download_update_card.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OsmAnd/res/layout/travel_needed_maps_card.xml b/OsmAnd/res/layout/travel_needed_maps_card.xml index c562b1fdd3..1a5aedcb7d 100644 --- a/OsmAnd/res/layout/travel_needed_maps_card.xml +++ b/OsmAnd/res/layout/travel_needed_maps_card.xml @@ -18,16 +18,34 @@ android:layout_margin="@dimen/content_padding" android:orientation="vertical"> - + android:layout_marginBottom="@dimen/bottom_sheet_content_padding_small"> + + + + + + mainIndexItems = new ArrayList<>(); private final List neededIndexItems = new ArrayList<>(); private boolean waitForIndexes; @@ -199,17 +196,24 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv } private void removeRedundantCards() { - if (mainIndexItem != null && mainIndexItem.isDownloaded() && !mainIndexItem.isOutdated()) { - removeDownloadUpdateCard(); - } - boolean allMapsDownloaded = true; - for (IndexItem item : neededIndexItems) { + boolean allTravelGuideDownloaded = true; + for (IndexItem item : mainIndexItems) { if (!item.isDownloaded()) { - allMapsDownloaded = false; + allTravelGuideDownloaded = false; break; } } - if (allMapsDownloaded) { + if (allTravelGuideDownloaded) { + removeDownloadUpdateCard(); + } + boolean neededMapsDownloaded = true; + for (IndexItem item : neededIndexItems) { + if (!item.isDownloaded()) { + neededMapsDownloaded = false; + break; + } + } + if (neededMapsDownloaded) { removeNeededMapsCard(); } } @@ -218,8 +222,9 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv new ProcessIndexItemsTask(this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - private void addIndexItemCards(IndexItem mainIndexItem, List neededIndexItems) { - this.mainIndexItem = mainIndexItem; + private void addIndexItemCards(List mainIndexItem, List neededIndexItems) { + this.mainIndexItems.clear(); + this.mainIndexItems.addAll(mainIndexItem); this.neededIndexItems.clear(); this.neededIndexItems.addAll(neededIndexItems); addDownloadUpdateCard(); @@ -228,53 +233,58 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv private void addDownloadUpdateCard() { final OsmandApplication app = getMyApplication(); - if (app != null) { - final DownloadIndexesThread downloadThread = app.getDownloadThread(); - - boolean outdated = mainIndexItem != null && mainIndexItem.isOutdated(); - boolean needsDownloading = mainIndexItem != null && !mainIndexItem.isDownloaded(); - - if (!app.getTravelHelper().isAnyTravelBookPresent() || needsDownloading || (outdated && SHOW_TRAVEL_UPDATE_CARD)) { - boolean showOtherMaps = false; - if (needsDownloading) { - List items = downloadThread.getIndexes().getWikivoyageItems(); - showOtherMaps = items != null && items.size() > 1; + if (app != null && !mainIndexItems.isEmpty() && SHOW_TRAVEL_UPDATE_CARD) { + boolean outdated = isMapsOutdated(); + downloadUpdateCard = new TravelDownloadUpdateCard(app, nightMode, mainIndexItems, !outdated); + downloadUpdateCard.setListener(new TravelDownloadUpdateCard.CardListener() { + @Override + public void onPrimaryButtonClick() { + if (downloadManager != null) { + downloadManager.startDownload(getMyActivity(), getAllItemsForDownload(mainIndexItems)); + adapter.updateDownloadUpdateCard(false); + } } - downloadUpdateCard = new TravelDownloadUpdateCard(app, nightMode, !outdated); - downloadUpdateCard.setShowOtherMapsBtn(showOtherMaps); - downloadUpdateCard.setListener(new TravelDownloadUpdateCard.ClickListener() { - @Override - public void onPrimaryButtonClick() { - if (mainIndexItem != null && downloadManager != null) { - downloadManager.startDownload(getMyActivity(), mainIndexItem); - adapter.updateDownloadUpdateCard(false); - } + @Override + public void onSecondaryButtonClick() { + if (downloadUpdateCard.isDownloading()) { + app.getDownloadThread().cancelDownload(mainIndexItems); + adapter.updateDownloadUpdateCard(false); + } else { + SHOW_TRAVEL_UPDATE_CARD = false; + removeDownloadUpdateCard(); } + } - @Override - public void onSecondaryButtonClick() { - if (downloadUpdateCard.isLoading()) { - downloadThread.cancelDownload(mainIndexItem); - adapter.updateDownloadUpdateCard(false); - } else if (!downloadUpdateCard.isDownload()) { - SHOW_TRAVEL_UPDATE_CARD = false; - removeDownloadUpdateCard(); - } else if (downloadUpdateCard.isShowOtherMapsBtn()) { - Activity activity = getActivity(); - if (activity != null) { - Intent newIntent = new Intent(activity, - ((OsmandApplication) activity.getApplication()).getAppCustomization().getDownloadActivity()); - newIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - activity.startActivity(newIntent); - } + @Override + public void onIndexItemClick(IndexItem item) { + if (item.getType() == DownloadActivityType.WIKIPEDIA_FILE && !Version.isPaidVersion(app)) { + FragmentManager fm = getFragmentManager(); + if (fm != null) { + ChoosePlanDialogFragment.showWikipediaInstance(fm); } + } else { + DownloadIndexesThread downloadThread = app.getDownloadThread(); + if (downloadThread.isDownloading(item)) { + downloadThread.cancelDownload(item); + } else if (!item.isDownloaded() && downloadManager != null) { + downloadManager.startDownload(getMyActivity(), item); + } + adapter.updateDownloadUpdateCard(false); } - }); - downloadUpdateCard.setIndexItem(mainIndexItem); - adapter.addDownloadUpdateCard(downloadUpdateCard); + } + }); + adapter.addDownloadUpdateCard(downloadUpdateCard); + } + } + + private boolean isMapsOutdated() { + for (IndexItem indexItem : mainIndexItems) { + if (indexItem.isOutdated()) { + return true; } } + return false; } private void addNeededMapsCard() { @@ -285,7 +295,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv @Override public void onPrimaryButtonClick() { if (downloadManager != null) { - downloadManager.startDownload(getMyActivity(), getAllItemsForDownload()); + downloadManager.startDownload(getMyActivity(), getAllItemsForDownload(neededIndexItems)); adapter.updateNeededMapsCard(false); } } @@ -323,10 +333,10 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv } } - private IndexItem[] getAllItemsForDownload() { + private IndexItem[] getAllItemsForDownload(List indexItems) { boolean paidVersion = Version.isPaidVersion(getMyApplication()); ArrayList res = new ArrayList<>(); - for (IndexItem item : neededIndexItems) { + for (IndexItem item : indexItems) { if (!item.isDownloaded() && (paidVersion || item.getType() != DownloadActivityType.WIKIPEDIA_FILE)) { res.add(item); } @@ -344,7 +354,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv neededMapsCard = null; } - private static class ProcessIndexItemsTask extends AsyncTask>> { + private static class ProcessIndexItemsTask extends AsyncTask, List>> { private static final DownloadActivityType[] types = new DownloadActivityType[]{ DownloadActivityType.NORMAL_FILE, @@ -354,40 +364,41 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv private final OsmandApplication app; private final WeakReference weakFragment; - private final String fileName; - ProcessIndexItemsTask(ExploreTabFragment fragment) { app = fragment.getMyApplication(); weakFragment = new WeakReference<>(fragment); - fileName = app != null ? app.getTravelHelper().getWikivoyageFileName() : null; } @Override - protected Pair> doInBackground(Void... voids) { - if (fileName != null) { - IndexItem mainItem = app.getDownloadThread().getIndexes().getWikivoyageItem(fileName); - - List neededItems = new ArrayList<>(); - for (TravelArticle article : app.getTravelHelper().getBookmarksHelper().getSavedArticles()) { - LatLon latLon = new LatLon(article.getLat(), article.getLon()); - try { - for (DownloadActivityType type : types) { - IndexItem item = DownloadResources.findSmallestIndexItemAt(app, latLon, type); - if (item != null && !item.isDownloaded() && !neededItems.contains(item)) { - neededItems.add(item); - } - } - } catch (IOException e) { - // ignore + protected Pair, List> doInBackground(Void... voids) { + List mainItems = new ArrayList<>(); + List allWikivoyageItems = app.getDownloadThread().getIndexes().getWikivoyageItems(); + if (allWikivoyageItems != null) { + for (IndexItem item : allWikivoyageItems) { + if (!item.isDownloaded() && !mainItems.contains(item)) { + mainItems.add(item); } } - return new Pair<>(mainItem, neededItems); } - return null; + List neededItems = new ArrayList<>(); + for (TravelArticle article : app.getTravelHelper().getBookmarksHelper().getSavedArticles()) { + LatLon latLon = new LatLon(article.getLat(), article.getLon()); + try { + for (DownloadActivityType type : types) { + IndexItem item = DownloadResources.findSmallestIndexItemAt(app, latLon, type); + if (item != null && !item.isDownloaded() && !neededItems.contains(item)) { + neededItems.add(item); + } + } + } catch (IOException e) { + // ignore + } + } + return new Pair<>(mainItems, neededItems); } @Override - protected void onPostExecute(Pair> res) { + protected void onPostExecute(Pair, List> res) { ExploreTabFragment fragment = weakFragment.get(); if (res != null && fragment != null && fragment.isResumed()) { fragment.addIndexItemCards(res.first, res.second); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java index d7aaa23bb7..f4a20a83f7 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java @@ -1,257 +1,47 @@ package net.osmand.plus.wikivoyage.explore.travelcards; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.recyclerview.widget.RecyclerView; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.download.IndexItem; -import java.lang.ref.WeakReference; -import java.text.DateFormat; +import java.util.List; -public class TravelDownloadUpdateCard extends BaseTravelCard { +public class TravelDownloadUpdateCard extends TravelNeededMapsCard { public static final int TYPE = 50; - private boolean download; - private boolean showOtherMapsBtn; - private WeakReference ref; + private final boolean download; - private ClickListener listener; - - @Nullable - private IndexItem indexItem; - - private DateFormat dateFormat; - - public boolean isDownload() { - return download; - } - - public boolean isShowOtherMapsBtn() { - return showOtherMapsBtn; - } - - public void setShowOtherMapsBtn(boolean showOtherMapsBtn) { - this.showOtherMapsBtn = showOtherMapsBtn; - } - - public void setListener(ClickListener listener) { - this.listener = listener; - } - - public void setIndexItem(@Nullable IndexItem indexItem) { - this.indexItem = indexItem; - } - - public TravelDownloadUpdateCard(OsmandApplication app, boolean nightMode, boolean download) { - super(app, nightMode); + public TravelDownloadUpdateCard(@NonNull OsmandApplication app, boolean nightMode, @NonNull List items, + boolean download) { + super(app, nightMode, items); this.download = download; - dateFormat = android.text.format.DateFormat.getMediumDateFormat(app); + } + + public int getTitle() { + if (isDownloading()) { + return R.string.shared_string_downloading; + } + return download ? R.string.download_file : R.string.update_is_available; } @Override - public void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) { - if (viewHolder instanceof DownloadUpdateVH) { - boolean loading = isLoading(); - DownloadUpdateVH holder = (DownloadUpdateVH) viewHolder; - this.ref = new WeakReference(holder); - holder.title.setText(getTitle(loading)); - holder.icon.setImageResource(getIconRes()); - holder.description.setText(getDescription()); - if (indexItem == null) { - holder.fileDataContainer.setVisibility(View.GONE); - } else { - holder.fileDataContainer.setVisibility(View.VISIBLE); - holder.fileIcon.setImageDrawable(getFileIcon()); - holder.fileTitle.setText(getFileTitle()); - holder.fileDescription.setText(getFileDescription()); - holder.progressBar.setVisibility(loading ? View.VISIBLE : View.GONE); - updateProgressBar(holder); - } - boolean primaryBtnVisible = updatePrimaryButton(holder, loading); - boolean secondaryBtnVisible = updateSecondaryButton(holder, loading); - holder.buttonsDivider.setVisibility(primaryBtnVisible && secondaryBtnVisible ? View.VISIBLE : View.GONE); - } - } - - public void updateProgresBar() { - if(ref != null) { - DownloadUpdateVH holder = ref.get(); - if (holder != null && holder.itemView.isShown()) { - updateProgressBar(holder); - } + public int getDescription() { + if (!isInternetAvailable()) { + return R.string.no_index_file_to_download; } + return download ? R.string.travel_card_download_descr : R.string.travel_card_update_descr; } - private void updateProgressBar(DownloadUpdateVH holder) { - if (isLoadingInProgress()) { - int progress = app.getDownloadThread().getCurrentDownloadingItemProgress(); - holder.progressBar.setProgress(progress < 0 ? 0 : progress); - } else { - holder.progressBar.setProgress(0); - } + @Override + public int getIconRes() { + return download ? R.drawable.travel_card_download_icon : R.drawable.travel_card_update_icon; } @Override public int getCardType() { return TYPE; } - - @NonNull - private String getTitle(boolean loading) { - if (loading) { - return app.getString(R.string.shared_string_downloading); - } - return app.getString(download ? R.string.download_file : R.string.update_is_available); - } - - private int getIconRes() { - return download ? R.drawable.travel_card_download_icon : R.drawable.travel_card_update_icon; - } - - @NonNull - private String getDescription() { - if (!isInternetAvailable()) { - return app.getString(R.string.no_index_file_to_download); - } - return app.getString(download ? R.string.travel_card_download_descr : R.string.travel_card_update_descr); - } - - @NonNull - private String getFileTitle() { - return indexItem == null ? "" : indexItem.getVisibleName(app, app.getRegions(), false); - } - - @NonNull - private String getFileDescription() { - StringBuilder sb = new StringBuilder(); - if (indexItem != null) { - sb.append(app.getString(R.string.file_size_in_mb, indexItem.getArchiveSizeMB())); - sb.append(" • "); - sb.append(indexItem.getRemoteDate(dateFormat)); - } - return sb.toString(); - } - - private Drawable getFileIcon() { - return getActiveIcon(R.drawable.ic_action_read_article); - } - - /** - * @return true if button is visible, false otherwise. - */ - private boolean updateSecondaryButton(DownloadUpdateVH vh, boolean loading) { - if (loading || !download || showOtherMapsBtn) { - vh.secondaryBtnContainer.setVisibility(View.VISIBLE); - vh.secondaryBtn.setText(getSecondaryBtnTextId(loading)); - vh.secondaryBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) { - listener.onSecondaryButtonClick(); - } - } - }); - return true; - } - vh.secondaryBtnContainer.setVisibility(View.GONE); - return false; - } - - @StringRes - private int getSecondaryBtnTextId(boolean loading) { - if (loading) { - return R.string.shared_string_cancel; - } - if (!download) { - return R.string.later; - } - return R.string.download_select_map_types; - } - - /** - * @return true if button is visible, false otherwise. - */ - private boolean updatePrimaryButton(DownloadUpdateVH vh, boolean loading) { - if (!loading) { - boolean enabled = isInternetAvailable(); - vh.primaryBtnContainer.setVisibility(View.VISIBLE); - vh.primaryBtnContainer.setBackgroundResource(getPrimaryBtnBgRes(enabled)); - vh.primaryButton.setTextColor(getResolvedColor(getPrimaryBtnTextColorRes(enabled))); - vh.primaryButton.setEnabled(enabled); - vh.primaryButton.setText(download ? R.string.shared_string_download : R.string.shared_string_update); - vh.primaryButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) { - listener.onPrimaryButtonClick(); - } - } - }); - return true; - } - vh.primaryBtnContainer.setVisibility(View.GONE); - return false; - } - - public boolean isLoading() { - return indexItem != null && app.getDownloadThread().isDownloading(indexItem); - } - - private boolean isLoadingInProgress() { - IndexItem current = app.getDownloadThread().getCurrentDownloadingItem(); - return indexItem != null && current != null && indexItem == current; - } - - public interface ClickListener { - - void onPrimaryButtonClick(); - - void onSecondaryButtonClick(); - } - - public static class DownloadUpdateVH extends RecyclerView.ViewHolder { - - final TextView title; - final ImageView icon; - final TextView description; - final View fileDataContainer; - final ImageView fileIcon; - final TextView fileTitle; - final TextView fileDescription; - final ProgressBar progressBar; - final View secondaryBtnContainer; - final TextView secondaryBtn; - final View buttonsDivider; - final View primaryBtnContainer; - final TextView primaryButton; - - @SuppressWarnings("RedundantCast") - public DownloadUpdateVH(View itemView) { - super(itemView); - title = (TextView) itemView.findViewById(R.id.title); - icon = (ImageView) itemView.findViewById(R.id.icon); - description = (TextView) itemView.findViewById(R.id.description); - fileDataContainer = itemView.findViewById(R.id.file_data_container); - fileIcon = (ImageView) itemView.findViewById(R.id.file_icon); - fileTitle = (TextView) itemView.findViewById(R.id.file_title); - fileDescription = (TextView) itemView.findViewById(R.id.file_description); - progressBar = (ProgressBar) itemView.findViewById(R.id.progress_bar); - secondaryBtnContainer = itemView.findViewById(R.id.secondary_btn_container); - secondaryBtn = (TextView) itemView.findViewById(R.id.secondary_button); - buttonsDivider = itemView.findViewById(R.id.buttons_divider); - primaryBtnContainer = itemView.findViewById(R.id.primary_btn_container); - primaryButton = (TextView) itemView.findViewById(R.id.primary_button); - } - } } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java index 505a2095f6..900c80f1a2 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java @@ -9,7 +9,9 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.StringRes; import androidx.recyclerview.widget.RecyclerView; import net.osmand.plus.OsmandApplication; @@ -60,8 +62,12 @@ public class TravelNeededMapsCard extends BaseTravelCard { if (viewHolder instanceof NeededMapsVH) { NeededMapsVH holder = (NeededMapsVH) viewHolder; ref = new WeakReference(holder); - holder.description.setText(isInternetAvailable() - ? R.string.maps_you_need_descr : R.string.no_index_file_to_download); + holder.title.setText(getTitle()); + holder.description.setText(getDescription()); + int iconRes = getIconRes(); + if (iconRes > 0) { + holder.icon.setImageResource(iconRes); + } adjustChildCount(holder.itemsContainer); updateView(holder); @@ -71,7 +77,23 @@ public class TravelNeededMapsCard extends BaseTravelCard { holder.buttonsDivider.setVisibility(primaryBtnVisible && secondaryBtnVisible ? View.VISIBLE : View.GONE); } } - + + @StringRes + public int getTitle() { + return R.string.maps_you_need; + } + + @StringRes + public int getDescription() { + return isInternetAvailable() + ? R.string.maps_you_need_descr : R.string.no_index_file_to_download; + } + + @DrawableRes + public int getIconRes() { + return 0; + } + public void updateView() { if (ref != null) { NeededMapsVH holder = ref.get(); @@ -227,7 +249,9 @@ public class TravelNeededMapsCard extends BaseTravelCard { public static class NeededMapsVH extends RecyclerView.ViewHolder { + final TextView title; final TextView description; + final ImageView icon; final LinearLayout itemsContainer; final View secondaryBtnContainer; final TextView secondaryBtn; @@ -238,7 +262,9 @@ public class TravelNeededMapsCard extends BaseTravelCard { @SuppressWarnings("RedundantCast") public NeededMapsVH(View itemView) { super(itemView); + title = (TextView) itemView.findViewById(R.id.title); description = (TextView) itemView.findViewById(R.id.description); + icon = (ImageView) itemView.findViewById(R.id.icon); itemsContainer = (LinearLayout) itemView.findViewById(R.id.items_container); secondaryBtnContainer = itemView.findViewById(R.id.secondary_btn_container); secondaryBtn = (TextView) itemView.findViewById(R.id.secondary_button); From 08b5e9fdf993e25a4f4c1ed2dfe94fc08fb472e7 Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Fri, 5 Feb 2021 18:32:54 +0200 Subject: [PATCH 02/44] Add Show more button --- OsmAnd/res/layout/wikivoyage_button_card.xml | 26 +++++++ .../plus/wikivoyage/data/TravelDbHelper.java | 10 +-- .../plus/wikivoyage/data/TravelHelper.java | 6 +- .../plus/wikivoyage/data/TravelObfHelper.java | 76 +++++++++++-------- .../wikivoyage/explore/ExploreRvAdapter.java | 8 ++ .../explore/ExploreTabFragment.java | 27 ++++++- .../explore/WikivoyageExploreActivity.java | 16 ++-- .../explore/travelcards/TravelButtonCard.java | 56 ++++++++++++++ 8 files changed, 178 insertions(+), 47 deletions(-) create mode 100644 OsmAnd/res/layout/wikivoyage_button_card.xml create mode 100644 OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java diff --git a/OsmAnd/res/layout/wikivoyage_button_card.xml b/OsmAnd/res/layout/wikivoyage_button_card.xml new file mode 100644 index 0000000000..412fd36f5d --- /dev/null +++ b/OsmAnd/res/layout/wikivoyage_button_card.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java index b53605a0bb..90e6444cff 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java @@ -174,9 +174,9 @@ public class TravelDbHelper implements TravelHelper { } @Override - public void initializeDataToDisplay() { + public void initializeDataToDisplay(boolean showMore) { localDataHelper.refreshCachedData(); - loadPopularArticles(); + loadPopularArticles(showMore); } @@ -283,7 +283,7 @@ public class TravelDbHelper implements TravelHelper { } @NonNull - public List loadPopularArticles() { + public List loadPopularArticles(boolean showMore) { String language = application.getLanguage(); SQLiteConnection conn = openConnection(); if (conn == null) { @@ -292,7 +292,7 @@ public class TravelDbHelper implements TravelHelper { } String LANG_WHERE = " WHERE " + ARTICLES_COL_LANG + " = '" + language + "'"; SQLiteCursor cursor = conn.rawQuery(POP_ARTICLES_TABLE_SELECT + LANG_WHERE, null); - if(cursor == null) { + if (cursor == null) { return popularArticles; } // read popular articles @@ -549,7 +549,7 @@ public class TravelDbHelper implements TravelHelper { @Override @Nullable - public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, boolean readGpx, @Nullable GpxReadCallback callback) { + public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, String lang, boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle res = null; SQLiteConnection conn = openConnection(); String routeId = articleId.routeId; diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java index 967138b0bd..4688dd7ff0 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java @@ -3,7 +3,6 @@ package net.osmand.plus.wikivoyage.data; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.GPXFile; import net.osmand.data.LatLon; import net.osmand.data.QuadRect; @@ -25,7 +24,7 @@ public interface TravelHelper { void initializeDataOnAppStartup(); - void initializeDataToDisplay(); + void initializeDataToDisplay(boolean showMore); boolean isAnyTravelBookPresent(); @@ -35,6 +34,9 @@ public interface TravelHelper { @NonNull List getPopularArticles(); + @NonNull + List loadPopularArticles(boolean showMore); + @NonNull Map> getNavigationMap(@NonNull TravelArticle article); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java index f230929f1d..162616e063 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java @@ -68,9 +68,7 @@ public class TravelObfHelper implements TravelHelper { public static final String ROUTE_ARTICLE = "route_article"; public static final String ROUTE_ARTICLE_POINT = "route_article_point"; public static final String ROUTE_TRACK = "route_track"; - public static final int POPULAR_ARTICLES_SEARCH_RADIUS = 100000; public static final int ARTICLE_SEARCH_RADIUS = 50000; - public static final int GPX_TRACKS_SEARCH_RADIUS = 10000; public static final int MAX_POPULAR_ARTICLES_COUNT = 30; public static final String REF_TAG = "ref"; public static final String NAME_TAG = "name"; @@ -81,6 +79,10 @@ public class TravelObfHelper implements TravelHelper { private List popularArticles = new ArrayList<>(); private final Map> cachedArticles = new ConcurrentHashMap<>(); private final TravelLocalDataHelper localDataHelper; + private int searchRadius = ARTICLE_SEARCH_RADIUS; + private int count = 0; + private int page = 0; + final List> amenities = new ArrayList<>(); public TravelObfHelper(OsmandApplication app) { this.app = app; @@ -98,48 +100,54 @@ public class TravelObfHelper implements TravelHelper { } @Override - public void initializeDataToDisplay() { + public void initializeDataToDisplay(boolean showMore) { localDataHelper.refreshCachedData(); - loadPopularArticles(); + loadPopularArticles(showMore); } @NonNull - public synchronized List loadPopularArticles() { + public synchronized List loadPopularArticles(boolean showMore) { String lang = app.getLanguage(); List popularArticles = new ArrayList<>(); - final List> amenities = new ArrayList<>(); - final LatLon location = app.getMapViewTrackingUtilities().getMapLocation(); - for (final BinaryMapIndexReader reader : getReaders()) { - try { - searchAmenity(amenities, location, reader, POPULAR_ARTICLES_SEARCH_RADIUS, -1, ROUTE_ARTICLE); - searchAmenity(amenities, location, reader, GPX_TRACKS_SEARCH_RADIUS, 15, ROUTE_TRACK); - } catch (Exception e) { - LOG.error(e.getMessage(), e); + if (amenities.size() - count < MAX_POPULAR_ARTICLES_COUNT) { + final LatLon location = app.getMapViewTrackingUtilities().getMapLocation(); + for (final BinaryMapIndexReader reader : getReaders()) { + try { + searchAmenity(amenities, location, reader, searchRadius, -1, ROUTE_ARTICLE); + searchAmenity(amenities, location, reader, searchRadius / 5, 15, ROUTE_TRACK); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } } + if (amenities.size() > 0) { + Collections.sort(amenities, new Comparator>() { + @Override + public int compare(Pair article1, Pair article2) { + int d1 = (int) (MapUtils.getDistance(((Amenity) article1.second).getLocation(), location)); + int d2 = (int) (MapUtils.getDistance(((Amenity) article2.second).getLocation(), location)); + return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1); + } + }); + } + searchRadius *= 2; } - if (amenities.size() > 0) { - Collections.sort(amenities, new Comparator>() { - @Override - public int compare(Pair article1, Pair article2) { - int d1 = (int) (MapUtils.getDistance(((Amenity) article1.second).getLocation(), location)); - int d2 = (int) (MapUtils.getDistance(((Amenity) article2.second).getLocation(), location)); - return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1); - } - }); - for (Pair amenity : amenities) { - if (!Algorithms.isEmpty(amenity.second.getName(lang))) { - TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null); - if (article != null) { - popularArticles.add(article); - if (popularArticles.size() >= MAX_POPULAR_ARTICLES_COUNT) { - break; - } + int lastIndex; + for (lastIndex = count; lastIndex < amenities.size() - 1; lastIndex++) { + Pair amenity = amenities.get(lastIndex); + if (!Algorithms.isEmpty(amenity.second.getName(lang))) { + TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null); + if (article != null) { + popularArticles.add(article); + this.popularArticles.add(article); + if (this.popularArticles.size() >= (page + 1) * MAX_POPULAR_ARTICLES_COUNT) { + page++; + break; } } } } - this.popularArticles = popularArticles; + count = ++lastIndex; return popularArticles; } @@ -172,8 +180,10 @@ public class TravelObfHelper implements TravelHelper { } if (!Algorithms.isEmpty(articles)) { TravelArticleIdentifier newArticleId = articles.values().iterator().next().generateIdentifier(); - cachedArticles.put(newArticleId, articles); - article = getCachedArticle(newArticleId, lang, readPoints, callback); + if (!cachedArticles.containsKey(newArticleId)) { + cachedArticles.put(newArticleId, articles); + article = getCachedArticle(newArticleId, lang, readPoints, callback); + } } return article; } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java index b18e04b7f4..923645b775 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java @@ -18,6 +18,8 @@ import net.osmand.plus.wikivoyage.explore.travelcards.OpenBetaTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.OpenBetaTravelCard.OpenBetaTravelVH; import net.osmand.plus.wikivoyage.explore.travelcards.StartEditingTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.StartEditingTravelCard.StartEditingTravelVH; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelButtonCard; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelButtonCard.TravelButtonVH; import net.osmand.plus.wikivoyage.explore.travelcards.TravelDownloadUpdateCard; import net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard; import net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard.TravelGpxVH; @@ -55,6 +57,9 @@ public class ExploreRvAdapter extends RecyclerView.Adapter 0; i--) { BaseTravelCard o = items.get(i); + if (o instanceof TravelButtonCard) { + return 0; + } if (o instanceof ArticleTravelCard || o instanceof TravelGpxCard) { return i; } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java index f3af57bc6d..2e0cacca65 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java @@ -36,6 +36,7 @@ import net.osmand.plus.wikivoyage.explore.travelcards.BaseTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.HeaderTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.OpenBetaTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.StartEditingTravelCard; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelButtonCard; import net.osmand.plus.wikivoyage.explore.travelcards.TravelDownloadUpdateCard; import net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard; import net.osmand.plus.wikivoyage.explore.travelcards.TravelNeededMapsCard; @@ -45,6 +46,8 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import static net.osmand.plus.wikivoyage.explore.WikivoyageExploreActivity.*; + public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEvents, TravelLocalDataHelper.Listener { private static boolean SHOW_TRAVEL_UPDATE_CARD = true; @@ -172,17 +175,37 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv if (!Version.isPaidVersion(app) && !OpenBetaTravelCard.isClosed()) { items.add(new OpenBetaTravelCard(activity, nightMode)); } - List popularArticles = app.getTravelHelper().getPopularArticles(); + final List popularArticles = app.getTravelHelper().getPopularArticles(); if (!popularArticles.isEmpty()) { items.add(new HeaderTravelCard(app, nightMode, getString(R.string.popular_destinations))); for (TravelArticle article : popularArticles) { if (article instanceof TravelGpx) { - items.add(new TravelGpxCard(app, nightMode, (TravelGpx) article, getActivity())); + items.add(new TravelGpxCard(app, nightMode, (TravelGpx) article, activity)); } else { items.add(new ArticleTravelCard(app, nightMode, article, activity.getSupportFragmentManager())); } } } + + TravelButtonCard travelButtonCard = new TravelButtonCard(app, nightMode); + travelButtonCard.setListener(new TravelNeededMapsCard.CardListener() { + @Override + public void onPrimaryButtonClick() { + new LoadWikivoyageData(ExploreTabFragment.this.getExploreActivity(), true).execute(); + } + + @Override + public void onSecondaryButtonClick() { + + } + + @Override + public void onIndexItemClick(IndexItem item) { + + } + }); + items.add(travelButtonCard); + items.add(new StartEditingTravelCard(activity, nightMode)); adapter.setItems(items); final DownloadIndexesThread downloadThread = app.getDownloadThread(); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java index dae47525aa..fc28bc6213 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java @@ -314,6 +314,10 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv } public void populateData() { + populateData(false); + } + + public void populateData(final boolean showMore) { switchProgressBarVisibility(true); if (app.isApplicationInitializing()) { final WeakReference activityRef = new WeakReference<>(this); @@ -326,12 +330,12 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv public void onFinish(AppInitializer init) { WikivoyageExploreActivity activity = activityRef.get(); if (AndroidUtils.isActivityNotDestroyed(activity)) { - new LoadWikivoyageData(activity).execute(); + new LoadWikivoyageData(activity, showMore).execute(); } } }); } else { - new LoadWikivoyageData(this).execute(); + new LoadWikivoyageData(this, showMore).execute(); } } @@ -380,19 +384,21 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv updateFragments(); } - private static class LoadWikivoyageData extends AsyncTask { + public static class LoadWikivoyageData extends AsyncTask { private final WeakReference activityRef; private final TravelHelper travelHelper; + private final boolean showMore; - LoadWikivoyageData(WikivoyageExploreActivity activity) { + LoadWikivoyageData(WikivoyageExploreActivity activity, boolean showMore) { travelHelper = activity.getMyApplication().getTravelHelper(); activityRef = new WeakReference<>(activity); + this.showMore = showMore; } @Override protected Void doInBackground(Void... params) { - travelHelper.initializeDataToDisplay(); + travelHelper.initializeDataToDisplay(showMore); return null; } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java new file mode 100644 index 0000000000..fd0a48718d --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java @@ -0,0 +1,56 @@ +package net.osmand.plus.wikivoyage.explore.travelcards; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelNeededMapsCard.CardListener; + +public class TravelButtonCard extends BaseTravelCard { + + public static final int TYPE = 5; + private CardListener listener; + + public TravelButtonCard(OsmandApplication app, boolean nightMode) { + super(app, nightMode); + } + + public void setListener(CardListener listener) { + this.listener = listener; + } + + @Override + public void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof TravelButtonVH) { + final TravelButtonVH holder = (TravelButtonVH) viewHolder; + UiUtilities.setupDialogButton(nightMode, holder.button, UiUtilities.DialogButtonType.SECONDARY, R.string.show_more); + holder.button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (listener != null) { + listener.onPrimaryButtonClick(); + } + } + }); + } + } + + public static class TravelButtonVH extends RecyclerView.ViewHolder { + + final View button; + + public TravelButtonVH(View itemView) { + super(itemView); + button = itemView.findViewById(R.id.button); + } + } + + @Override + public int getCardType() { + return TYPE; + } +} \ No newline at end of file From 27ee57339ba9cb243bdd92a5976969890cf07158 Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Mon, 8 Feb 2021 21:57:12 +0200 Subject: [PATCH 03/44] Fix compare by distance --- .../plus/wikivoyage/data/TravelDbHelper.java | 6 +++--- .../plus/wikivoyage/data/TravelHelper.java | 5 +++-- .../plus/wikivoyage/data/TravelObfHelper.java | 16 ++++++++++------ .../wikivoyage/explore/ExploreTabFragment.java | 4 +++- .../explore/WikivoyageExploreActivity.java | 14 ++++---------- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java index 90e6444cff..90ed62569f 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java @@ -174,9 +174,9 @@ public class TravelDbHelper implements TravelHelper { } @Override - public void initializeDataToDisplay(boolean showMore) { + public void initializeDataToDisplay() { localDataHelper.refreshCachedData(); - loadPopularArticles(showMore); + loadPopularArticles(); } @@ -283,7 +283,7 @@ public class TravelDbHelper implements TravelHelper { } @NonNull - public List loadPopularArticles(boolean showMore) { + public List loadPopularArticles() { String language = application.getLanguage(); SQLiteConnection conn = openConnection(); if (conn == null) { diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java index 4688dd7ff0..b8bb9cdf98 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java @@ -17,6 +17,7 @@ public interface TravelHelper { interface GpxReadCallback { void onGpxFileReading(); + void onGpxFileRead(@Nullable GPXFile gpxFile); } @@ -24,7 +25,7 @@ public interface TravelHelper { void initializeDataOnAppStartup(); - void initializeDataToDisplay(boolean showMore); + void initializeDataToDisplay(); boolean isAnyTravelBookPresent(); @@ -35,7 +36,7 @@ public interface TravelHelper { List getPopularArticles(); @NonNull - List loadPopularArticles(boolean showMore); + List loadPopularArticles(); @NonNull Map> getNavigationMap(@NonNull TravelArticle article); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java index 162616e063..036ba50bbb 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java @@ -100,13 +100,13 @@ public class TravelObfHelper implements TravelHelper { } @Override - public void initializeDataToDisplay(boolean showMore) { + public void initializeDataToDisplay() { localDataHelper.refreshCachedData(); - loadPopularArticles(showMore); + loadPopularArticles(); } @NonNull - public synchronized List loadPopularArticles(boolean showMore) { + public synchronized List loadPopularArticles() { String lang = app.getLanguage(); List popularArticles = new ArrayList<>(); if (amenities.size() - count < MAX_POPULAR_ARTICLES_COUNT) { @@ -123,9 +123,13 @@ public class TravelObfHelper implements TravelHelper { Collections.sort(amenities, new Comparator>() { @Override public int compare(Pair article1, Pair article2) { - int d1 = (int) (MapUtils.getDistance(((Amenity) article1.second).getLocation(), location)); - int d2 = (int) (MapUtils.getDistance(((Amenity) article2.second).getLocation(), location)); - return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1); + Amenity amenity1 = (Amenity) article1.second; + double d1 = MapUtils.getDistance(amenity1.getLocation(), location) + / (ROUTE_ARTICLE.equals(amenity1.getSubType()) ? 5 : 1); + Amenity amenity2 = (Amenity) article2.second; + double d2 = MapUtils.getDistance(amenity2.getLocation(), location) + / (ROUTE_ARTICLE.equals(amenity2.getSubType()) ? 5 : 1); + return Double.compare(d1, d2); } }); } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java index 2e0cacca65..9afa7a33c3 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java @@ -191,7 +191,9 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv travelButtonCard.setListener(new TravelNeededMapsCard.CardListener() { @Override public void onPrimaryButtonClick() { - new LoadWikivoyageData(ExploreTabFragment.this.getExploreActivity(), true).execute(); + if (activity instanceof WikivoyageExploreActivity) { + new LoadWikivoyageData((WikivoyageExploreActivity) activity).execute(); + } } @Override diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java index fc28bc6213..3191926522 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java @@ -314,10 +314,6 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv } public void populateData() { - populateData(false); - } - - public void populateData(final boolean showMore) { switchProgressBarVisibility(true); if (app.isApplicationInitializing()) { final WeakReference activityRef = new WeakReference<>(this); @@ -330,12 +326,12 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv public void onFinish(AppInitializer init) { WikivoyageExploreActivity activity = activityRef.get(); if (AndroidUtils.isActivityNotDestroyed(activity)) { - new LoadWikivoyageData(activity, showMore).execute(); + new LoadWikivoyageData(activity).execute(); } } }); } else { - new LoadWikivoyageData(this, showMore).execute(); + new LoadWikivoyageData(this).execute(); } } @@ -388,17 +384,15 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv private final WeakReference activityRef; private final TravelHelper travelHelper; - private final boolean showMore; - LoadWikivoyageData(WikivoyageExploreActivity activity, boolean showMore) { + LoadWikivoyageData(WikivoyageExploreActivity activity) { travelHelper = activity.getMyApplication().getTravelHelper(); activityRef = new WeakReference<>(activity); - this.showMore = showMore; } @Override protected Void doInBackground(Void... params) { - travelHelper.initializeDataToDisplay(showMore); + travelHelper.initializeDataToDisplay(); return null; } From 0c0d90d42cb21bfe4e98fb273de7d58764748875 Mon Sep 17 00:00:00 2001 From: Skalii Date: Tue, 9 Feb 2021 18:14:31 +0200 Subject: [PATCH 04/44] fix changing track info after enabling the "Join segments" option; fix display track info with enabled/disabled "Join segments" option in chart; --- .../other/TrackDetailsMenu.java | 21 ++- .../plus/track/GpxBlockStatisticsBuilder.java | 121 +++++++++--------- .../net/osmand/plus/track/OverviewCard.java | 5 +- .../osmand/plus/track/TrackMenuFragment.java | 7 +- 4 files changed, 83 insertions(+), 71 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index edec4eeb2f..e0efd25a7e 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -36,6 +36,7 @@ import net.osmand.data.LatLon; import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; +import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; @@ -66,6 +67,8 @@ public class TrackDetailsMenu { @Nullable private GpxDisplayItem gpxItem; @Nullable + private SelectedGpxFile selectedGpxFile; + @Nullable private TrackDetailsBarController toolbarController; @Nullable private TrkSegment segment; @@ -101,6 +104,15 @@ public class TrackDetailsMenu { this.gpxItem = gpxItem; } + @Nullable + public SelectedGpxFile getSelectedGpxFile() { + return selectedGpxFile; + } + + public void setSelectedGpxFile(@NonNull SelectedGpxFile selectedGpxFile) { + this.selectedGpxFile = selectedGpxFile; + } + public boolean isVisible() { return visible; } @@ -539,7 +551,7 @@ public class TrackDetailsMenu { } } - public boolean shouldShowXAxisPoints () { + public boolean shouldShowXAxisPoints() { return true; } @@ -707,18 +719,19 @@ public class TrackDetailsMenu { if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) { for (int i = 0; i < gpxItem.chartTypes.length; i++) { OrderedLineDataSet dataSet = null; + boolean withoutGaps = selectedGpxFile != null && (!selectedGpxFile.isJoinSegments() && gpxItem.isGeneralTrack()); switch (gpxItem.chartTypes[i]) { case ALTITUDE: dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, - gpxItem.chartAxisType, false, true, false); + gpxItem.chartAxisType, false, true, withoutGaps); break; case SPEED: dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, - gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, false); + gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, withoutGaps); break; case SLOPE: dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, - gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, false); + gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, withoutGaps); break; } if (dataSet != null) { diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java index 59cd460bcc..b6f07ecf50 100644 --- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java +++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java @@ -17,16 +17,16 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import net.osmand.AndroidUtils; +import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXTrackAnalysis; -import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; -import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; import net.osmand.plus.myplaces.SegmentActionsListener; import net.osmand.plus.widgets.TextViewEx; @@ -40,51 +40,60 @@ public class GpxBlockStatisticsBuilder { private final OsmandApplication app; private RecyclerView blocksView; private final SelectedGpxFile selectedGpxFile; - private final TrackDisplayHelper displayHelper; - private final GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_SEGMENT}; - public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile, TrackDisplayHelper displayHelper) { + public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile) { this.app = app; this.selectedGpxFile = selectedGpxFile; - this.displayHelper = displayHelper; } public void setBlocksView(RecyclerView blocksView) { this.blocksView = blocksView; } - private GPXTrackAnalysis getAnalysis() { - return selectedGpxFile.getTrackAnalysis(app); + private GpxDisplayItem getDisplayItem(GPXFile gpxFile) { + return GpxUiHelper.makeGpxDisplayItem(app, gpxFile); + } + + private GPXFile getGPXFile() { + return selectedGpxFile.getGpxFile(); } public void initStatBlocks(SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { - GPXTrackAnalysis analysis = getAnalysis(); - float totalDistance = analysis.totalDistance; - float timeSpan = analysis.timeSpan; - String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); - String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app); - String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); - String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); List items = new ArrayList<>(); + GPXFile gpxFile = getGPXFile(); + GpxDisplayItem gpxDisplayItem = null; + GPXTrackAnalysis analysis = null; + if (gpxFile.tracks.size() > 0) { + gpxDisplayItem = getDisplayItem(gpxFile); + analysis = gpxDisplayItem.analysis; + } + if (gpxDisplayItem != null && analysis != null) { + boolean withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack(); + float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance; + float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan; + String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); + String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app); + String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); + String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); - prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), - R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE); - prepareData(analysis, items, app.getString(R.string.altitude_ascent), asc, - R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE); - prepareData(analysis, items, app.getString(R.string.altitude_descent), desc, - R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE); - prepareData(analysis, items, app.getString(R.string.average_speed), avg, - R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); - prepareData(analysis, items, app.getString(R.string.max_speed), max, - R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); - prepareData(analysis, items, app.getString(R.string.shared_string_time_span), - Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()), - R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME); - - if (Algorithms.isEmpty(items)) { - AndroidUiHelper.updateVisibility(blocksView, false); - } else { - final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, actionsListener, activeColor, nightMode); + prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), + R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE); + prepareData(analysis, items, app.getString(R.string.altitude_ascent), asc, + R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE); + prepareData(analysis, items, app.getString(R.string.altitude_descent), desc, + R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE); + prepareData(analysis, items, app.getString(R.string.average_speed), avg, + R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); + prepareData(analysis, items, app.getString(R.string.max_speed), max, + R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); + prepareData(analysis, items, app.getString(R.string.shared_string_time_span), + Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()), + R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME); + } + boolean isNotEmpty = !Algorithms.isEmpty(items); + AndroidUiHelper.updateVisibility(blocksView, isNotEmpty); + if (isNotEmpty && gpxDisplayItem != null) { + final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, gpxDisplayItem, actionsListener, activeColor, nightMode); blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false)); blocksView.setAdapter(sbAdapter); } @@ -134,7 +143,6 @@ public class GpxBlockStatisticsBuilder { } public class StatBlock { - private final String title; private final String value; private final int imageResId; @@ -164,14 +172,17 @@ public class GpxBlockStatisticsBuilder { private class BlockStatisticsAdapter extends RecyclerView.Adapter { + private final List statBlocks; + private final GpxDisplayItem displayItem; + private final SegmentActionsListener actionsListener; @ColorInt private final int activeColor; - private final List statBlocks; private final boolean nightMode; - private final SegmentActionsListener actionsListener; - public BlockStatisticsAdapter(List statBlocks, SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { + public BlockStatisticsAdapter(List statBlocks, GpxDisplayItem displayItem, + SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { this.statBlocks = statBlocks; + this.displayItem = displayItem; this.actionsListener = actionsListener; this.activeColor = activeColor; this.nightMode = nightMode; @@ -200,32 +211,20 @@ public class GpxBlockStatisticsBuilder { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - List groups = displayHelper.getDisplayGroups(filterTypes); - GpxDisplayGroup group = null; - for (GpxDisplayGroup g : groups) { - if (g.isGeneralTrack()) { - group = g; - } - } - if (group == null && !groups.isEmpty()) { - group = groups.get(0); - } - if (group != null) { - GpxDisplayItem displayItem = group.getModifiableList().get(0); - if (displayItem != null && displayItem.analysis != null) { - ArrayList list = new ArrayList<>(); - if (displayItem.analysis.hasElevationData || displayItem.analysis.isSpeedSpecified() || displayItem.analysis.hasSpeedData) { - if (item.firstType != null) { - list.add(item.firstType); - } - if (item.secondType != null) { - list.add(item.secondType); - } + GPXTrackAnalysis analysis = displayItem.analysis; + if (displayItem != null && analysis != null) { + ArrayList list = new ArrayList<>(); + if (analysis.hasElevationData || analysis.isSpeedSpecified() || analysis.hasSpeedData) { + if (item.firstType != null) { + list.add(item.firstType); + } + if (item.secondType != null) { + list.add(item.secondType); } - displayItem.chartTypes = list.size() > 0 ? list.toArray(new GPXDataSetType[0]) : null; - displayItem.locationOnMap = displayItem.locationStart; - actionsListener.openAnalyzeOnMap(displayItem); } + displayItem.chartTypes = list.size() > 0 ? list.toArray(new GPXDataSetType[0]) : null; + displayItem.locationOnMap = displayItem.locationStart; + actionsListener.openAnalyzeOnMap(displayItem); } } }); diff --git a/OsmAnd/src/net/osmand/plus/track/OverviewCard.java b/OsmAnd/src/net/osmand/plus/track/OverviewCard.java index d0a396499d..bb56b43f89 100644 --- a/OsmAnd/src/net/osmand/plus/track/OverviewCard.java +++ b/OsmAnd/src/net/osmand/plus/track/OverviewCard.java @@ -43,12 +43,11 @@ public class OverviewCard extends BaseCard { private final SelectedGpxFile selectedGpxFile; private final GpxBlockStatisticsBuilder blockStatisticsBuilder; - public OverviewCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper, - @NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) { + public OverviewCard(@NonNull MapActivity mapActivity, @NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) { super(mapActivity); this.actionsListener = actionsListener; this.selectedGpxFile = selectedGpxFile; - blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, displayHelper); + blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile); } @Override diff --git a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java index e0e196a712..ff2ec67140 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java @@ -326,7 +326,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card } headerContainer.addView(overviewCard.getView()); } else { - overviewCard = new OverviewCard(getMapActivity(), displayHelper, this, selectedGpxFile); + overviewCard = new OverviewCard(getMapActivity(), this, selectedGpxFile); overviewCard.setListener(this); headerContainer.addView(overviewCard.build(getMapActivity())); } @@ -760,7 +760,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card segment = segments.get(0); } } - GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT}; + GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[]{GpxDisplayItemType.TRACK_SEGMENT}; List items = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes)); if (segment != null && !Algorithms.isEmpty(items)) { SplitSegmentDialogFragment.showInstance(fragmentManager, displayHelper, items.get(0), segment); @@ -1013,6 +1013,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card public void openAnalyzeOnMap(GpxDisplayItem gpxItem) { TrackDetailsMenu trackDetailsMenu = getMapActivity().getTrackDetailsMenu(); trackDetailsMenu.setGpxItem(gpxItem); + trackDetailsMenu.setSelectedGpxFile(selectedGpxFile); trackDetailsMenu.show(); hide(); } @@ -1110,7 +1111,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card @Override public void gpxSavingFinished(Exception errorMessage) { if (selectedGpxFile != null) { - List groups = displayHelper.getDisplayGroups(new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT}); + List groups = displayHelper.getDisplayGroups(new GpxDisplayItemType[]{GpxDisplayItemType.TRACK_SEGMENT}); selectedGpxFile.setDisplayGroups(groups, app); selectedGpxFile.processPoints(app); } From fb3820f907f7928af27259c394475f93e2dfbeb8 Mon Sep 17 00:00:00 2001 From: Skalii Date: Wed, 10 Feb 2021 04:31:49 +0200 Subject: [PATCH 05/44] add ability to update data with track recording interval --- .../plus/track/GpxBlockStatisticsBuilder.java | 117 +++++++++++------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java index b6f07ecf50..2f11a6136a 100644 --- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java +++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java @@ -1,10 +1,10 @@ package net.osmand.plus.track; import android.graphics.drawable.Drawable; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.ColorInt; @@ -12,7 +12,6 @@ import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatImageView; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -24,7 +23,6 @@ import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.UiUtilities; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; @@ -41,6 +39,13 @@ public class GpxBlockStatisticsBuilder { private RecyclerView blocksView; private final SelectedGpxFile selectedGpxFile; + private BlockStatisticsAdapter adapter; + private final List items = new ArrayList<>(); + + private final Handler handler = new Handler(); + private Runnable updatingItems; + private boolean updateRunning = false; + public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile) { this.app = app; this.selectedGpxFile = selectedGpxFile; @@ -59,7 +64,39 @@ public class GpxBlockStatisticsBuilder { } public void initStatBlocks(SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { - List items = new ArrayList<>(); + initItems(); + boolean isNotEmpty = !Algorithms.isEmpty(items); + AndroidUiHelper.updateVisibility(blocksView, isNotEmpty); + if (isNotEmpty) { + adapter = new BlockStatisticsAdapter(getDisplayItem(getGPXFile()), actionsListener, activeColor, nightMode); + adapter.setItems(items); + blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false)); + blocksView.setAdapter(adapter); + } + } + + public void stopUpdatingStatBlocks() { + handler.removeCallbacks(updatingItems); + updateRunning = false; + } + + public void runUpdatingStatBlocks() { + updatingItems = new Runnable() { + @Override + public void run() { + if (adapter != null) { + initItems(); + adapter.setItems(items); + AndroidUiHelper.updateVisibility(blocksView, !Algorithms.isEmpty(items)); + } + int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get(); + handler.postDelayed(this, Math.max(1000, interval)); + } + }; + updateRunning = handler.post(updatingItems); + } + + public void initItems() { GPXFile gpxFile = getGPXFile(); GpxDisplayItem gpxDisplayItem = null; GPXTrackAnalysis analysis = null; @@ -76,72 +113,55 @@ public class GpxBlockStatisticsBuilder { String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); - prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), + items.clear(); + prepareData(analysis, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE); - prepareData(analysis, items, app.getString(R.string.altitude_ascent), asc, + prepareData(analysis, app.getString(R.string.altitude_ascent), asc, R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE); - prepareData(analysis, items, app.getString(R.string.altitude_descent), desc, + prepareData(analysis, app.getString(R.string.altitude_descent), desc, R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE); - prepareData(analysis, items, app.getString(R.string.average_speed), avg, + prepareData(analysis, app.getString(R.string.average_speed), avg, R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); - prepareData(analysis, items, app.getString(R.string.max_speed), max, + prepareData(analysis, app.getString(R.string.max_speed), max, R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); - prepareData(analysis, items, app.getString(R.string.shared_string_time_span), + prepareData(analysis, app.getString(R.string.shared_string_time_span), Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()), R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME); } - boolean isNotEmpty = !Algorithms.isEmpty(items); - AndroidUiHelper.updateVisibility(blocksView, isNotEmpty); - if (isNotEmpty && gpxDisplayItem != null) { - final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, gpxDisplayItem, actionsListener, activeColor, nightMode); - blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false)); - blocksView.setAdapter(sbAdapter); - } } - public void prepareData(GPXTrackAnalysis analysis, List listItems, String title, - String value, @DrawableRes int imageResId, @ColorRes int imageColorId, + public void prepareData(GPXTrackAnalysis analysis, String title, String value, + @DrawableRes int imageResId, @ColorRes int imageColorId, GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) { StatBlock statBlock = new StatBlock(title, value, imageResId, imageColorId, firstType, secondType, itemType); switch (statBlock.itemType) { case ITEM_DISTANCE: { if (analysis.totalDistance != 0f) { - listItems.add(statBlock); + items.add(statBlock); } break; } case ITEM_ALTITUDE: { if (analysis.hasElevationData) { - listItems.add(statBlock); + items.add(statBlock); } break; } case ITEM_SPEED: { if (analysis.isSpeedSpecified()) { - listItems.add(statBlock); + items.add(statBlock); } break; } case ITEM_TIME: { if (analysis.hasSpeedData) { - listItems.add(statBlock); + items.add(statBlock); } break; } } } - private void setImageDrawable(ImageView iv, @DrawableRes Integer resId, @ColorRes int color) { - Drawable icon = resId != null ? app.getUIUtilities().getIcon(resId, color) - : UiUtilities.tintDrawable(iv.getDrawable(), getResolvedColor(color)); - iv.setImageDrawable(icon); - } - - @ColorInt - protected int getResolvedColor(@ColorRes int colorId) { - return ContextCompat.getColor(app, colorId); - } - public class StatBlock { private final String title; private final String value; @@ -172,16 +192,15 @@ public class GpxBlockStatisticsBuilder { private class BlockStatisticsAdapter extends RecyclerView.Adapter { - private final List statBlocks; + private final List items = new ArrayList<>(); private final GpxDisplayItem displayItem; private final SegmentActionsListener actionsListener; @ColorInt private final int activeColor; private final boolean nightMode; - public BlockStatisticsAdapter(List statBlocks, GpxDisplayItem displayItem, - SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { - this.statBlocks = statBlocks; + public BlockStatisticsAdapter(GpxDisplayItem displayItem, SegmentActionsListener actionsListener, + @ColorInt int activeColor, boolean nightMode) { this.displayItem = displayItem; this.actionsListener = actionsListener; this.activeColor = activeColor; @@ -190,7 +209,7 @@ public class GpxBlockStatisticsBuilder { @Override public int getItemCount() { - return statBlocks.size(); + return items.size(); } @NonNull @@ -203,16 +222,19 @@ public class GpxBlockStatisticsBuilder { @Override public void onBindViewHolder(BlockStatisticsViewHolder holder, int position) { - final StatBlock item = statBlocks.get(position); + final StatBlock item = items.get(position); holder.valueText.setText(item.value); holder.titleText.setText(item.title); + if (updateRunning) { + holder.titleText.setWidth(app.getResources().getDimensionPixelSize(R.dimen.map_route_buttons_width)); + } holder.valueText.setTextColor(activeColor); holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light)); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - GPXTrackAnalysis analysis = displayItem.analysis; - if (displayItem != null && analysis != null) { + GPXTrackAnalysis analysis = displayItem != null ? displayItem.analysis : null; + if (analysis != null) { ArrayList list = new ArrayList<>(); if (analysis.hasElevationData || analysis.isSpeedSpecified() || analysis.hasSpeedData) { if (item.firstType != null) { @@ -228,9 +250,16 @@ public class GpxBlockStatisticsBuilder { } } }); - setImageDrawable(holder.imageView, item.imageResId, item.imageColorId); + Drawable icon = app.getUIUtilities().getIcon(item.imageResId, item.imageColorId); + holder.imageView.setImageDrawable(icon); AndroidUtils.setBackgroundColor(app, holder.divider, nightMode, R.color.divider_color_light, R.color.divider_color_dark); - AndroidUiHelper.updateVisibility(holder.divider, position != statBlocks.size() - 1); + AndroidUiHelper.updateVisibility(holder.divider, position != items.size() - 1); + } + + public void setItems(List items) { + this.items.clear(); + this.items.addAll(items); + notifyDataSetChanged(); } } From ecd911a79c006d578fbcee8e89c0fe6b0179960f Mon Sep 17 00:00:00 2001 From: max-klaus Date: Wed, 10 Feb 2021 10:53:21 +0300 Subject: [PATCH 06/44] Fix free version manifest --- OsmAnd/AndroidManifest-gplayFree.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/AndroidManifest-gplayFree.xml b/OsmAnd/AndroidManifest-gplayFree.xml index 873848e1e9..eb06260f4e 100644 --- a/OsmAnd/AndroidManifest-gplayFree.xml +++ b/OsmAnd/AndroidManifest-gplayFree.xml @@ -4,7 +4,7 @@ Date: Wed, 10 Feb 2021 10:57:24 +0300 Subject: [PATCH 07/44] Fix lib gradle --- OsmAnd/build-library.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/build-library.gradle b/OsmAnd/build-library.gradle index c282fa6fa2..2c50079396 100644 --- a/OsmAnd/build-library.gradle +++ b/OsmAnd/build-library.gradle @@ -24,6 +24,7 @@ android { // Build that doesn't include 3D OpenGL legacy { dimension "coreversion" + resValue "string", "app_edition", "" } } } From b9c2f9029ea8f2e7fcef58b2008b5cada5c13bbe Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:07 +0000 Subject: [PATCH 08/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 06d4d70284..8d9da7a4fd 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -593,6 +593,7 @@ التغييرات POI داخل التطبيق لا تؤثرعلى ملفات الخرائط المحملة، يتم حفظ التغييرات إلى ملف محلي بدلا من ذلك. وضع تركيز الكاميرا: أوسماند+ (OSM اتجاهات التنقل التلقائية) +\n \n عبارة عن تطبيق ملاحة مفتوح المصدر مع إمكانية الوصول إلى العديد من بيانات عالمية للموقع. كل بيانات الخرائط (خرائط التوجيه أو الخرائط الجزئية) يمكن تخزينها في ذاكرة الجهاز للإستخدام دون إنترنت. يوفر التطبيق كذلك وظائف توجيه بما في ذلك التوجيه الصوتي. \n \nبعض الميزات الأساسية: @@ -602,6 +603,7 @@ \n - ميزة ويكيبيديا المحلية ( قم بتحميل نقاط الاهتمام لويكيبيديا)، الأمثل لمشاهدة المعالم الأثرية \n - يمكن تراكب عدة طبقات للخرائط، ك GPX أو مسارات الملاحة، مواقع ذات الاهتمام ، الأماكن المفضلة، الحدود الكنتورية، أماكن توقف النقل العمومي، خرائط إضافية بشفافية قابلة للتعديل \n - البحث عن العناوين وأماكن الاهتمام دون إنترنت +\n \n - تحديد الطريق لمسافات متوسطة المدى \n - وضع السيارة، الدراجة والمشاة متوفر مع: \n - تبديل اختياري آلي لوضع الرؤية في الليل/النهار @@ -3954,7 +3956,7 @@ تعليق ملاحظة OSM قم بتسجيل الدخول باستخدام طريقة المصادقة الآمنة أو استخدم اسم المستخدم وكلمة المرور. إضافة صورة - سجل في + سجل في \nOpenPlaceReviews.org قم بتسجيل الدخول إلى موقع مشروع البيانات المفتوحة OpenPlaceReviews.org لرفع المزيد من الصور. إنشاء حساب جديد @@ -3970,9 +3972,9 @@ لا يوجد مساحة كافية أضف إلى مابيلاي إضافة إلى OpenPlaceReviews - يعرض صورا من عدة مصادر: -\nOpenPlaceReviews - صور POI ؛ -\nMapillary - صور على مستوى الشارع ؛ + يعرض صورا من عدة مصادر: +\nOpenPlaceReviews - صور POI ؛ +\nMapillary - صور على مستوى الشارع ؛ \nالويب / ويكيميديا - صور POI المحددة في بيانات OpenStreetMap. حدد المجموعات التي سيتم استيرادها. حدد العناصر التي سيتم استيرادها. @@ -3988,17 +3990,17 @@ تقسيم قبل تقسيم بعد إضافة شريحة جديدة - • خيار مضاف لتصدير واستيراد جميع البيانات بما في ذلك الإعدادات والموارد والأماكن الخاصة بي -\n -\n • مخطط الطريق: الرسوم البيانية لأجزاء المسار مع الطريق ، إضافة القدرة على إنشاء وتحرير مقاطع مسارات متعددة -\n -\n • تمت إضافة طريقة مصادقة آلية OAuth ل OpenStreetMap ، وواجهة مستخدم محسنة لمربعات حوار OSM -\n + • خيار مضاف لتصدير واستيراد جميع البيانات بما في ذلك الإعدادات والموارد والأماكن الخاصة بي +\n +\n • مخطط الطريق: الرسوم البيانية لأجزاء المسار مع الطريق ، إضافة القدرة على إنشاء وتحرير مقاطع مسارات متعددة +\n +\n • تمت إضافة طريقة مصادقة آلية OAuth ل OpenStreetMap ، وواجهة مستخدم محسنة لمربعات حوار OSM +\n \n • دعم ألوان مخصصة للمفضلة ونقاط لمسار الطريق \n \n - وضع التطبيق - حساب المستخدم + وضع الاستعراض + ملف تعريف المستخدم عكس جميع النقاط حدد الوضع الذي سيتم استخدامه في بدء التطبيق. آخر استخدام @@ -4030,7 +4032,7 @@ تحديد مجلد تحديد مجلد أو إضافة واحد جديد فارغ - تحليل حسب الفاصل الزمني + التحليل حسب الفواصل الزمنية (الفاصل الزمني) رفع إلى خريطة الشارع المفتوح تحرير المسار تسمية المسار @@ -4080,7 +4082,7 @@ \nجميع بيانات OpenPlaceReview مفتوحة ومتاحة للجميع: http://openplacereviews.org/data. \n \nيمكنك قراءة المزيد على: http://openplacereviews.org - مراجعات الأمكنة + OpenPlaceReviews استخدام test.openplacereviews.org الدخول إلى OpenPlaceReviews \ No newline at end of file From 5a7a0079c4b8dd08dbab546e9a65f15c95a7730a Mon Sep 17 00:00:00 2001 From: nasr pen Date: Tue, 9 Feb 2021 11:07:10 +0000 Subject: [PATCH 09/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 8d9da7a4fd..8858534772 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1964,8 +1964,7 @@ \nليست هناك حاجة لتحميل خريطة خاصة،الرؤية يتم إنشاؤها من خلال خرائطنا المحلية. \n \nهذه الرؤية يمكن التراجع عنها إما عن طريق تعطيلها هنا، أو تغيير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة. - - Online OSM تصنيف الخريطة مع الصور. + Online OSM تصنيف الخريطة مع الصور. تعيين الحد الأقصى لوقت الانتظار لكل إصلاح موقع في الخلفية. الانتظار الأقصى للإصلاح إصدار غير معتمد من البيانات الصوتية @@ -2074,7 +2073,7 @@ اللون والسمك خذ المخرج %1$d ثم واصل المدينة أو المنطقة - مقالات ويكيبيديا قريبة + مقالات ويكيبيديا القريبة استخدام الطرق السريعة السماح للطرق السريعة. الصربية (اللاتينية) @@ -2618,7 +2617,7 @@ ج ش اسم النقطة - الطرق القريبة في الداخل + الطرق الداخلية المجاورة أدخل اسم الملف. خطأ أثناء استرجاع الخريطة تمت عملية استيراد الخريطة @@ -3945,7 +3944,7 @@ الحساب تسجيل الدخول \"إمكانية التتبع\" تعني أن التتبع لا يظهر في أي قوائم عامة ولكن نقاط التتبع المعالجة مع طوابع زمنية صادرة عنها(التي لا يمكن أن تكون مرتبطة بك مباشرة) ستظهر خلال التنزيلات من واجهة برمجة التطبيقات GPS API العامة. - سجل تاريخ العلامات + سِجل تاريخ العلامات أرسل ملف GPX إلى OpenStreetMap أدخل العلامات مفصولة بفاصلة. \"خاص\"يعني أن التتبع لن يظهر في أي قوائم عامة ، ولكن نقاط التتبع الصادرة عنه ستظل متاحة من خلال واجهة برمجة تطبيقات GPS API العامة بدون طوابع زمنية ولكن لن يتم ترتيبها ترتيبًا زمنيًا. From 012bdf69cfe89b969f400b0923d91a6cf5246728 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:11 +0000 Subject: [PATCH 10/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 188 +++++++++++++++---------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 8858534772..28ff589f66 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -2693,7 +2693,7 @@ تنزيل الكل إعادة تشغيل التطبيق إشارة مرجعية - نقاط بالطريق تم إزالتها من علامات الخريطة + نقاط بالطريق تم إزالتها من التوجيه المباشر للخريطة بواسطة أوسماند الأسعار والاشتراك شهري @@ -2708,19 +2708,19 @@ يجدد سنويا حدد فترة الدفع المناسبة لك: تبرعات مساعدة صندوق رسم الخرائط OSM. - حذف العلامة \'%s\'؟ - تعديل العلامة + حذف التوجيه المباشر \'%s\'؟ + تعديل التوجيه المباشر بحث عن شارع اختر المدينة أولاً استعادة تطبيق من طرف ثالث - ستبقى العلامات المضافة من مجموعة إحداثيات أو من نقاط طريق على الخريطة عند اختيار \"تجاوز العلامة\". إذا كانت المجموعة غير نشطة ستختفي العلامات من الخريطة. - إبقاء العلامة المتجاوز + عند التفعيل سيبقى التوجيه المباشر المضاف من مجموعة إحداثيات أو من نقاط طريق على الخريطة عند اختيار \"تجاوز التوجيه المباشر\". إذا كانت المجموعة غير نشطة ستختفي الوجهات المباشرة من الخريطة. + إبقاء التوجيه المباشر المتجاوز هناك المزيد من وسائل النقل في هذا الموقف. يرجى إعطاء إذن تحديد الموقع للتطبيق لكي يواصل. شكرا على الرد النقطة أو الطريق غير موجود. - لايوجد نتائج للبحث؟ + لايوجد نتائج للبحث؟ \nأخبرنا برأيك زيادة نصف قطر البحث إلى %1$s إرسال استفسار البحث؟ @@ -2753,7 +2753,7 @@ اختر العنصر المناسب لا تفعل افعل - صور المقالة يمكن تحملها للاستخدام بدون اتصال. + صور المقالة يمكن تحملها للاستخدام بدون اتصال. \nدائماً متوفرة في \'اكتشف\'←\'خيارات\'. الصفحة متاحة على الإنترنت فقط. فتح في متصفح الويب؟ الصور المؤقتة @@ -2993,7 +2993,7 @@ سنوات ثلاثة أشهر مجاناً - إظهار شبكة طرق الدارجات الهوائية + إظهار شبكة مسارات الدارجات الهوائية نافذة تحميل الخريطة النوافذ والإشعارات التحكم في النوافذ المنبثقة ، ومربعات الحوار والإشعارات. @@ -3018,7 +3018,7 @@ لصق مسار مجلد بيانات أوسماند تغيير مجلد التخزين ؟ نقل للموقع الجديد - تجنب بعض أنواع الطرق + تجنب بعض الطرق جنبًا إلى جنب طريق تلفريك اتصال @@ -3043,21 +3043,21 @@ تفضيل الطرق الغير معبدة تفضيل الطرق الغير معبدة. تحديث كل الخرائط - تحديث (%1$d) خريطة؟ - • تحديث التطبيق وإعدادات الأوضاع: يتم ترتيب الإعدادات الآن حسب النوع. يمكن تخصيص كل وضع بشكل منفصل. -\n -\n • نافذة جديدة لتنزيل الخريطة المقترحة أثناء تصفح الخرائط -\n -\n • إصلاحات للنمط الليلي -\n -\n • إصلاح العديد من مشاكل التوجيه في جميع أنحاء العالم -\n -\n • خريطة الأساس المحدثة مع شبكة طرق أكثر تفصيلا -\n -\n • تحديث المناطق التي غمرتها الفيضانات في جميع أنحاء العالم -\n -\n • توجيه التزلج: إضافة وضع الارتفاع وتعقيد المسار إلى تفاصيل المسار -\n + هل أنت متأكد من رغبتك بتحديث (%1$d) خريطة؟ + • تحديث التطبيق وإعدادات الأوضاع: يتم ترتيب الإعدادات الآن حسب النوع. يمكن تخصيص كل وضع بشكل منفصل. +\n +\n • نافذة جديدة لتنزيل الخريطة المقترحة أثناء تصفح الخرائط +\n +\n • إصلاحات للنمط الليلي +\n +\n • إصلاح العديد من مشاكل التوجيه في جميع أنحاء العالم +\n +\n • خريطة الأساس المحدثة مع شبكة طرق أكثر تفصيلا +\n +\n • تحديث المناطق التي غمرتها الفيضانات في جميع أنحاء العالم +\n +\n • توجيه التزلج: إضافة وضع الارتفاع وتعقيد المسار إلى تفاصيل المسار +\n \n • إصلاحات أخرى \n \n @@ -3234,7 +3234,7 @@ تحديثات الخريطة الشهرية تحديثات الخريطة كل ساعة سيتم إرسال استعلام البحث إلى: \"%1$s\" ، بالإضافة إلى موقعك. -\n +\n \nلا يتم جمع المعلومات الشخصية ، فقط بيانات البحث اللازمة لتحسين البحث. لامركبة ترام تجنب مركبة الترام @@ -3259,8 +3259,8 @@ عرض الإحداثيات سياسة الخصوصية ساعدنا في جعل أوسماند أفضل - السماح ل OsmAnd بجمع ومعالجة بيانات استخدام التطبيق المجهول. لا يتم جمع بيانات حول موقعك أو المواقع التي تعرضها على الخريطة. -\n + السماح ل OsmAnd بجمع ومعالجة بيانات استخدام التطبيق المجهول. لا يتم جمع بيانات حول موقعك أو المواقع التي تعرضها على الخريطة. +\n \nقم بإعدادها في أي وقت لاحق في \'الإعدادات\' ← \'الخصوصية والأمان\'. اختر نوع البيانات التي تريد مشاركتها: الخرائط التي تم تنزيلها @@ -3379,7 +3379,7 @@ اختر اللون لا يمكنك حذف أوضاع أوسماند الافتراضية ، ولكن يمكنك تعطيلها في الشاشة السابقة ، أو نقلها إلى الأسفل. تحرير الأوضاع - يؤثر نوع التنقل على قواعد حساب الطرق. + يؤثر نوع التنقل على قواعد حسابات المسار. مظهر الوضع اختر الايقونة واللون والاسم تحرير قائمة الأوضاع @@ -3496,8 +3496,8 @@ تضمين بيانات إضافية يمكنك تحديد بيانات إضافية للتصدير مع الوضع. القارة القطبية الجنوبية - هذا الملحق هو تطبيق منفصل ، بإمكانك إزالته بشكل منفصل إذا لم تعد تخطط لاستخدامه. -\n + هذا الملحق هو تطبيق منفصل ، بإمكانك إزالته بشكل منفصل إذا لم تعد تخطط لاستخدامه. +\n \nسيبقى الملحق الإضافي على الجهاز بعد إزالة أوسماند. %1$s — %2$s — %3$s يحتوي الوضع المستوردة على بيانات إضافية. انقر فوق \"استيراد\" لاستيراد بيانات الوضع فقط أو حدد بيانات إضافية لاستيرادها. @@ -3524,8 +3524,8 @@ المدرج %1$s, موجودة بالفعل في أوسماند. احتفظ بكليهما سيتم إضافة العناصر المستوردة مع زيادة قبل اسمها - OsmAnd يحتوي بالفعل على عناصر بنفس الأسماء مثل التي استوردتها. -\n + OsmAnd يحتوي بالفعل على عناصر بنفس الأسماء مثل التي استوردتها. +\n \nحدد إجراء. بعض العناصر موجودة بالفعل حدد البيانات التي سيتم استيرادها. @@ -3535,11 +3535,11 @@ استعادة جميع إعدادات الوضع؟ حفظ الوضع الجديد لا يمكن عمل نسخة احتياطية لهذا الوضع. - مسح البيانات المسجلة؟ + هل أنت متأكد من أنك تريد مسح البيانات المسجلة؟ استيراد البيانات من %1$s استيراد - OsmAnd تحقق %1$s للتكرارات مع العناصر الموجودة في التطبيق. -\n + OsmAnd تحقق %1$s للتكرارات مع العناصر الموجودة في التطبيق. +\n \nقد يستغرق الأمر بعض الوقت. العناصر المضافة تم الاستيراد @@ -3586,8 +3586,8 @@ اللغة جميع اللغات هناك حاجة إلى خرائط إضافية لعرض النقاط المهمة من ويكيبيديا على الخريطة. - تخصيص كمية العناصر في درج تكوين خريطة قائمة السياق. -\n + تخصيص كمية العناصر في درج تكوين خريطة قائمة السياق. +\n \nيمكنك تعطيل الإضافات غير المستخدمة لإخفاء جميع الضوابط من الطلب %1$s. عناصر الدرج، قائمة السياق تخصيص واجهة المستخدم @@ -3637,10 +3637,10 @@ خرائط إضافية %1$s إجراء غير معتمد %1$s / %2$s - سيتم احتساب الدفع لحساب Google Play الخاص بك في تأكيد الشراء. -\n -\nيتم تجديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم تحميل حسابك لفترة التجديد (شهر / ثلاثة أشهر / سنة) فقط في تاريخ التجديد. -\n + سيتم احتساب الدفع لحساب Google Play الخاص بك في تأكيد الشراء. +\n +\nيتم تجديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم تحميل حسابك لفترة التجديد (شهر / ثلاثة أشهر / سنة) فقط في تاريخ التجديد. +\n \nيمكنك إدارة وإلغاء الاشتراكات الخاصة بك عن طريق الذهاب إلى إعدادات Google Play الخاصة بك. البحث عن أنواع poi اجمع أنواع النقاط المهمة من فئات مختلفة. اضغط على مفتاح التبديل لتحديد الكل ، ثم انقر على الجانب الأيسر لاختيار الفئة. @@ -3656,22 +3656,22 @@ مشتريات أوسماند دليل رموز الخريطة. أوضاع الملاحة - • خرائط جديدة للتضاريس توضح المنحدرات من دون الحاجة للاتصال بالإنترنت -\n -\n • التخصيص الكامل للمفضلات ونقاط الطرق GPX - الألوان المخصصة والأيقونات والأشكال -\n -\n • تخصيص ترتيب العناصر في قائمة السياق ، تكوين الخريطة ، درج -\n -\n • عرض ويكيبيديا كطبقة منفصلة في تكوين الخريطة ، حدد اللغات المطلوبة فقط -\n -\n • إنشاء مرشح / خرائط للمعالم الخاصة بك مع مرونة تامة -\n -\n • تمت إضافة خيارات لاستعادة إعدادات الأوضاع المخصصة -\n -\n • مسارات GPX كاملة من الممرات دعم حركة المرور وتعليمات كاملة -\n -\n • إصلاح أحجام واجهة المستخدم على الأجهزة اللوحية -\n + • خرائط جديدة للتضاريس توضح المنحدرات من دون الحاجة للاتصال بالإنترنت +\n +\n • التخصيص الكامل للمفضلات ونقاط الطرق GPX - الألوان المخصصة والأيقونات والأشكال +\n +\n • تخصيص ترتيب العناصر في قائمة السياق ، تكوين الخريطة ، درج +\n +\n • عرض ويكيبيديا كطبقة منفصلة في تكوين الخريطة ، حدد اللغات المطلوبة فقط +\n +\n • إنشاء مرشح / خرائط للمعالم الخاصة بك مع مرونة تامة +\n +\n • تمت إضافة خيارات لاستعادة إعدادات الأوضاع المخصصة +\n +\n • مسارات GPX كاملة من الممرات دعم حركة المرور وتعليمات كاملة +\n +\n • إصلاح أحجام واجهة المستخدم على الأجهزة اللوحية +\n \n • إصلاح الخلل مع اللغات التي تكتب من اليمين \n \n @@ -3723,15 +3723,15 @@ \n \n%2$s هي مستويات التكبير التي ستكون فيها الإطارات المتجانبة الأصلية مرئية. سوف يحدث التحجيم للأكبر أو الأصغر خارج هذه القيم. وقت انتهاء الصلاحية بالدقائق. سيتم إعادة تحميل الإطارات المتجانبة المخزنة مؤقتًا بعد الوقت المحدد. اترك هذا الحقل فارغًا لعدم تحديث الإطارات المتجانبة لهذا المصدر. -\n -\nيوم واحد هو 1440 دقيقة. -\nأسبوع واحد هو 10080 دقيقة. +\n +\nيوم واحد هو 1440 دقيقة. +\nأسبوع واحد هو 10080 دقيقة. \nشهر واحد هو 43 829 دقيقة. اختر كيفية تخزين الطبقات المنزلة. مهلة الشاشة الافتراضية يمكنك تصدير أو استيراد إجراءات سريعة باستخدام أوضاع التطبيق . حذف الكل؟ - حذف الاختصارات السريعة %d نهائيًا؟ + هل أنت متأكد من رغبتك في حذف الاختصارات السريعة %d نهائيًا؟ مهلة الشاشة نغمات أدل بعرض مركبتك، قد يتم تطبيق بعض القيود على المركبات العريضة. @@ -3761,12 +3761,12 @@ %1$s محذوفة إعادة التشغيل مطلوبة لحذف بيانات كاميرا السرعة بالكامل. إلغاء التثبيت وإعادة التشغيل - في بعض البلدان أو المناطق، يحظر القانون استخدام تطبيقات التحذير من كاميرا السرعة. -\n -\nعليك أن تختار اعتمادا على قانون بلدك. -\n -\nحدد %1$s وستتلقى تنبيهات وتحذيرات حول كاميرات السرعة. -\n + في بعض البلدان أو المناطق، يحظر القانون استخدام تطبيقات التحذير من كاميرا السرعة. +\n +\nعليك أن تختار اعتمادا على قانون بلدك. +\n +\nحدد %1$s وستتلقى تنبيهات وتحذيرات حول كاميرات السرعة. +\n \nحدد %2$s. جميع البيانات المتعلقة كاميرات السرعة: التنبيهات، والإشعارات، سيتم حذف نقاط الاهتمام حتى يتم إعادة تثبيت أوسماند تماما. تحديد الارتفاع الأعلى المسموح به على الطرق. حد الطول @@ -3788,7 +3788,7 @@ أغلق ملاحظة OSM تحتاج إلى تعيين أيام العمل للمتابعة المسار بين النقاط - تخطيط طريق + قياس المسافة إضافة إلى مسار لن تكون النقطة المضافة مرئية على الخريطة، نظرًا لأن المجموعة المحددة مخفية، يمكنك العثور عليها في \"%s\". إظهار رموز البدء والانتهاء @@ -3801,7 +3801,7 @@ التعديل الأخير استيراد المسار فتح مسار موجود - إنشاء طريق جديد + إنشاء مسار جديد حدد المسار للفتح. تم الكتابة فوق المسار @@ -3817,7 +3817,7 @@ بعد ذلك ، ألقط مسارك بأقرب طريق مسموح به باستخدام أحد أوضاع التنقل الخاصة بك لاستخدام هذا الخيار. بداية المسافة صور للشارع - إغلاق مسار الرحلة دون حفظ؟ ستفقد كل التغييرات؟ + هل أنت متأكد أنك تريد إغلاق مسار الرحلة دون حفظ؟ سوف تفقد كل التغييرات؟ في حالة الاتجاه المعاكس تسجيل المسار أثناء الملاحة حفظ كملف مسار جديد @@ -3834,15 +3834,15 @@ أضف إحداثية مسار تسجيل الرحلة حفظ كمسار - اتبع المسار + تتبع المسار اختر مسار للمتابعة اختر ملف المسار للمتابعة أو قم باستيراده من الجهاز. - حدد مساراً آخر + حدد مسارا آخر انتقل من موقعي إلى المسار نقطة المسار للتنقل بداية المسار أقرب نقطة - إرفاق بالطرق + إرفاق الطرق حذف عنوان إضافة عنوان أدخل العنوان @@ -3865,22 +3865,22 @@ فتح المسار المحفوظ محفوظ مسار مبسط - سيتم حفظ خط الطريق فقط، وسيتم حذف نقاط المسار. + سيتم حفظ خط التوجيه فقط، وسيتم حذف نقاط الطريق. اسم الملف الرجاء إضافة نقطتين على الأقل. إعادة - • ميزة تخطيط المسار المحدثة: تسمح باستخدام أنواع الملاحة المختلفة لكل جزء وكذا اظافة طرق -\n -\n• قائمة مظهر جديدة للمسارات: تحديد اللون، السماكة، اظهار أسهم التوجيه، أيقونات الانطلاق والنهاية -\n -\n• تحسين رؤية عقد الدراجات -\n -\n• المسارات قابلة للنقر عليها الان وقائمة سياق بمعلومات أساسية -\n -\n• خوارزميات بحث محسنة -\n -\n• تم تحسين خيارات متابعة المسار خلال الملاحة -\n + • ميزة تخطيط المسار المحدثة: تسمح باستخدام أنواع الملاحة المختلفة لكل جزء وكذا اظافة طرق +\n +\n• قائمة مظهر جديدة للمسارات: تحديد اللون، السماكة، اظهار أسهم التوجيه، أيقونات الانطلاق والنهاية +\n +\n• تحسين رؤية عقد الدراجات +\n +\n• المسارات قابلة للنقر عليها الان وقائمة سياق بمعلومات أساسية +\n +\n• خوارزميات بحث محسنة +\n +\n• تم تحسين خيارات متابعة المسار خلال الملاحة +\n \n• تم إصلاح المشكلات المتعلقة باستيراد/تصدير الأوضاع الشخصية \n \n @@ -3890,10 +3890,10 @@ أيقونات البدء والانتهاء شكرا لشرائك \"خطوط الكنتور\" يتم احتساب الاشتراك للفترة المحددة. قم بإلغائه في AppGallery في أي وقت تريد. - يتم الخصم من حساب AppGallery الخاص بك عند تأكيد الشراء. -\n -\nيتم تمديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم الخصم من الحساب على فترة التجديد (شهر/ ثلاثة أشهر/ سنة) فقط عند تاريخ التجديد. -\n + يتم الخصم من حساب AppGallery الخاص بك عند تأكيد الشراء. +\n +\nيتم تمديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم الخصم من الحساب على فترة التجديد (شهر/ ثلاثة أشهر/ سنة) فقط عند تاريخ التجديد. +\n \nيمكنك إدارة وإلغاء الاشتراكات الخاصة بك في إعدادات AppGallery. تجنب الممرات تجنب الممرات @@ -3911,7 +3911,7 @@ تم استيراد الملف بالفعل في أوسماند استخدام خوارزمية توجيه من مرحلتين A* %1$s البيانات المتوفرة فقط على الطرق ، تحتاج إلى حساب طريق باستخدام \"الطريق بين النقاط\" للحصول عليها. - في انتظار إعادة حساب الطريق + في انتظار إعادة حساب الطريق \nسيتوفر الرسم البياني بعد إعادة الحساب. للقيادة على الجليد مع طرق ومسارات مخصصة. رسم بياني @@ -3937,14 +3937,14 @@ اشتراك OsmAnd Live معلق تسجيل الدخول لخريطة الشارع المفتوح تسجيل الدخول إلى خريطة الشارع المفتوح - قم بتسجيل الدخول لرفع التغييرات الجديدة أو المعدلة. -\n + قم بتسجيل الدخول لرفع التغييرات الجديدة أو المعدلة. +\n \nإما باستخدام المصادقة أو باستخدام اسم المستخدم وكلمة المرور. سجل الدخول باسم المستخدم وكلمة المرور الحساب تسجيل الدخول \"إمكانية التتبع\" تعني أن التتبع لا يظهر في أي قوائم عامة ولكن نقاط التتبع المعالجة مع طوابع زمنية صادرة عنها(التي لا يمكن أن تكون مرتبطة بك مباشرة) ستظهر خلال التنزيلات من واجهة برمجة التطبيقات GPS API العامة. - سِجل تاريخ العلامات + سجل تاريخ العلامات أرسل ملف GPX إلى OpenStreetMap أدخل العلامات مفصولة بفاصلة. \"خاص\"يعني أن التتبع لن يظهر في أي قوائم عامة ، ولكن نقاط التتبع الصادرة عنه ستظل متاحة من خلال واجهة برمجة تطبيقات GPS API العامة بدون طوابع زمنية ولكن لن يتم ترتيبها ترتيبًا زمنيًا. From f906c5ac864fda8aede86b1d583fd8da5117c35c Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:14 +0000 Subject: [PATCH 11/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 44 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 28ff589f66..b429b3c15d 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -2469,7 +2469,7 @@ إضافة نقطة قبل إضافة نقطة بعد خيارات - سيتم توصيل النقاط بطرق الوضع المحدد. + سيتم توصيل النقاط بمسارات الوضع المحدد. يمكنك حفظ النقاط إما كنقاط طريق أو كخط. اختر وضع الملاحة إضافة نقاط مسار @@ -2482,12 +2482,12 @@ عتبة توجيه الخريطة حدد أدناه على أي سرعة يتغير توجيه الخريطة من \'اتجاه الحركة\' إلى \'البوصلة\'. تم نقل جميع العلامات إلى السجل - تم نقل العلامة إلى السجل - العلامة أصبحت نشطة + تم نقل التوجيه المباشر إلى السجل + التوجيه المباشر انتقل كنشط قائمة مجموعات آخر استخدام : %1$s - تنشيط العلامة + تنشيط التوجيه المباشر اليوم أمس آخر ٧ أيام @@ -2503,12 +2503,12 @@ سهم متجه للهدف عرض المتجاوز إخفاء المتجاوز - إزالة من \"علامات الخريطة\" + إزالة من \"التوجيه المباشر\" تنازلي تصاعدي تاريخ الإضافة ترتيب حسب: - حدد كيفية الإشارة إلى مسافة واتجاه العلامة على شاشة الخريطة: + حدد كيفية الإشارة إلى المسافة والاتجاه للتوجيه المباشر على شاشة الخريطة: استخدم الموقع أضف موقعك كنقطة أولى لتخطيط طريق مثالي. موقعي @@ -2519,7 +2519,7 @@ تصدير علاماتك إلى ملف يمكنك تحديده هنا: نقل إلى السجل سيتم إزالة المجموعة بعد إعادة تشغيل التطبيق. - العلامات + التوجيه المباشر نمط الإحداثيات لوحة مفاتيح النظام اختر نسق إدخال الأحداثيات. يمكنك دائماً تغييره بالنقر على خيارات. @@ -2536,12 +2536,12 @@ أظهر الخريطة تم حساب المسار رحلة ذهاب وإياب - يجب عليك إضافة علامة واحدة على الأقل لاستخدام هذه الوظيفة. + يجب عليك إضافة توجيه مباشر واحد على الأقل لاستخدام هذه الوظيفة. تنسيق خاطئ أدخل اسم جديد عودة عرض - تمت إضافة نقاط الطريق إلى علامات الخريطة + تمت إضافة نقاط الطريق إلى التوجيه المباشر للخريطة إدخال خاطئ يمكن استيرادها كنقاط مفضلة، أو كملف GPX. استيراد كملف GPX @@ -2549,15 +2549,15 @@ استيراد ملف نقرة على الخريطة ستفعل أزرار التحكم والويدجت. شاشة كاملة - علامة مُجتازة + توجيه مباشر مجتاز إنشاء أو تعديل عناصر OSM قم بإنشاء أو تعديل نقاط الاهتمام OSM ، وفتح ملاحظات OSM أو التعليق عليها ، والمساهمة في ملفات GPX المسجلة. حذف مُعدلة تمت الإضافة تعديل طلب البحث. - تم تنشيط العلامة %s. - انقر على العلامة في الخريطة لجعلها بالاعلى بدون فتح القائمة. + تم تنشيط التوجيه المباشر %s. + انقر على التوجيه المباشر في الخريطة لجعله الاعلى بدون فتح القائمة. تدوين ملاحظات! بدون حد زمني اقرأ المقال كاملا @@ -2565,27 +2565,27 @@ جميع نقاط هذه المجموعة افتح من مفتوح حتى - يغلق عند - يفتح عند - يفتح عند + يغلق أبوابه على + سيفتح الأبواب على + يفتح أبوابه على إجراءات إضافية إجراءات - العلامات + توجيه مباشر الملاحظات حسب التاريخ حسب التاريخ حسب النوع المزيد - المظهر على الخريطة + التوجيه المباشر نقاط المسار إضافة مجموعة - قم بإنشاء علامات على الخريطة ! + قم بإنشاء التوجيه المباشر على الخريطة ! استيراد مجموعات عدد الأرقام اليمين اليسار لصق الانتقال إلى الحقل التالي - إعادة تسمية العلامة + إعادة تسمية التوجيه المباشر مجموع التبرعات تسميات POI بدون اسم @@ -2617,7 +2617,7 @@ ج ش اسم النقطة - الطرق الداخلية المجاورة + الطرق القريبة التي في الداخل أدخل اسم الملف. خطأ أثناء استرجاع الخريطة تمت عملية استيراد الخريطة @@ -2629,7 +2629,7 @@ قم باختيار نسق الملف جميع البيانات ملاحظات OSM - سيفتح غداً عند + سيفتح أبوابه غداً على ماذا هنا: اللاوسية عرض خريطة السياحة @@ -2843,7 +2843,7 @@ إضافة ملاحظة صوتية أو فيديو أو صورة لكل نقطة على الخريطة، باستخدام قائمة السياق أو القطعة. ابحث عن المسارات مع نقاط الطريق حدد مسار لإضافة نقاط الطريق إلى العلامات(يتم سرد المسارات فقط مع نقاط الطريق). - نقرة طويلة أو قصيرة على الأماكن ثم اضغط على زر علامة. + نقرة طويلة أو قصيرة على الأماكن ثم اضغط على زر التوجيه المباشر. يمكنك استيراد المجموعات المفضلة أو نقاط المسار كتوجيه. ستظهر العلامات التي تم تجاوزها على هذه الشاشة. خط مباشر من موقعك إلى الهدف. From 21e7d202052791b5d8cc8a076c2440ee61f5f51a Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:15 +0000 Subject: [PATCH 12/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index b429b3c15d..f47a05d2f6 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1378,7 +1378,7 @@ خامل الرجاء إدخال عنوان بريد إلكتروني صالح أدخل اسم عمومي - شكرا لدعمكم أوسماند! + شكرا لدعمكم أوسماند! \nلتنشيط جميع الميزات الجديدة ، تحتاج إلى إعادة تشغيل أوسماند. إعدادات الاشتراك شريط جانبي @@ -1392,7 +1392,7 @@ قطار المسار الحالي مستوى البطارية - تغيير موقع العلامة + تغيير موقع التوجيه المباشر تابعنا اتجاه صدى الصوت الملاحة عبر أوسماند لايف @@ -1413,7 +1413,7 @@ مظهرالخريطة رقيقة متوسط - أضف علامات عبر الخريطة + لم تضف توجيه مباشر على الخريطة لم يتم العثور على نقاط الطريق التقرير سمح الآن للتطبيق بالكتابة على وحدة التخزين الخارجية. الرجاء إعادة تشغيله يدويا. @@ -1432,7 +1432,7 @@ سيتم إرسال جزء من التبرع إلى مستخدمي OSM الذين يقومون بإرسال التغييرات إلى الخريطة في تلك المنطقة. يرجى شراء اشتراك أوسماند لايف أولا يُتيحُ لك هذا الاشتراك الحصول على التحديثات كُل ساعة لجميع الخرائط حول العالم. -\nجزء من الدخل سيعود إلى مجتمع OSM ويُدفَع لكل مساهمة. +\nجزء من الدخل سيعود إلى مجتمع OSM ويُدفَع لكل مساهمة. \nإن كنت تحب أوسماند وOSM وترغب في الدّعم، هذه هي الطريقة المُثلى للقيام بذلك. وجهات أخرى رفع كمستخدم مجهول @@ -1474,7 +1474,7 @@ حرف غير قانوني في اسم الملف تقرير عن خرائط العالم - حرك الخريطة لتغيير مكان العلامة + حرك الخريطة لتغيير مكان التوجيه المباشر إشارة صوتية عند اتجاه نقطة الوصول. حدد اتجاه النقطة المستهدفة بالاهتزاز. @@ -1490,7 +1490,7 @@ عريض المستخدم المجهول لا يمكنه : \n- إنشاء مجموعة; -\n- مزامنة المجموعات والأجهزة مع السيرفر; +\n- مزامنة المجموعات والأجهزة مع السيرفر; \n- إدارة المجموعات والأجهزة من خلال لوحة تحكم خاصة على الموقع. تطبيق الملاحة أوسماند خطأ أثناء تحميل البيانات من الخادم. @@ -2073,7 +2073,7 @@ اللون والسمك خذ المخرج %1$d ثم واصل المدينة أو المنطقة - مقالات ويكيبيديا القريبة + مقالات ويكيبيديا قريبة استخدام الطرق السريعة السماح للطرق السريعة. الصربية (اللاتينية) From 283f15837048a39f2271184a83f6c374bd700486 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:17 +0000 Subject: [PATCH 13/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index f47a05d2f6..3223e1b6ff 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -628,7 +628,7 @@ حالة وضع السكون استخدمها لتشغيل أوسماند عندما تكون الشاشة مُطفأة. لا يوجد مساحة كافية لتحميل %1$s م.ب المساحة الخالية: %2$s. - تحميل {0} ملف(ات) ؟ + تحميل {0} ملف(ات) ؟ \n مساحة التخزين المستخدمة هي {1} مب (المساحة المتوفرة هي {2} مب). السمة الشفافة المكتبات الأصيلة غير مدعومة على هذا الجهاز. @@ -1438,7 +1438,7 @@ رفع كمستخدم مجهول رفع ملاحظة OSM شريط الأدوات - حدد علامات الخريطة + حدد توجيه مباشرعلى الخريطة ترتيب عكسي تفعيل ميزة العلامات. الأسترية @@ -1592,10 +1592,10 @@ حرك للاسفل اسم مستخدم و كلمة سر OSM نحن بحاجة اليه لكي نوفر لك معلومات حول المساهمات. - اختر علامة + حدد توجيه مباشر عرض شريط الشفافية - لا توجد مساحة كافية! -\n {3} MB مطلوب مؤقتا ، {1} ميجا بايت بشكل دائم. + لا توجد مساحة كافية! +\n {3} MB مطلوب مؤقتا ، {1} ميجا بايت بشكل دائم. \n (فقط {2} ميغابايت المتاحة.) نقطة الانطلاق الصوت @@ -1631,10 +1631,10 @@ الخرائط الموجودة انتقال للأعلى التعديلات %1$s ، الرتبة %2$s ، مجموع التعديلات %3$s - أول علامة - ثاني علامة - إضافة إلى علامات الخريطة - حذف كافة العلامات النشطة على الخريطة؟ + التوجيه المباشرالأول للخريطة + التوجيه المباشرالثاني للخريطة + إضافة إلى التوجيه المباشر + حذف كافة التوجيه المباشرالنشط على الخريطة؟ علامة خريطة عرض المضلعات الحالة @@ -1745,13 +1745,13 @@ الدخول عبر الخريطة عرض عند البدء التأثير النسبي - تحميل {0} ملف؟ + تحميل {0} ملف؟ \nمساحة التخزين المستخدمة هي {3} مب مؤقتة، {1} مب دائمة. (المساحة المتوفرة هي {2} مب.) مسافة المسلك خطأ تحيين القائمة المحلية لPOI. تحيين الPOI قم بتحميل مذكرة OSM الخاصة بك دون الكشف عن هويتك أو باستخدام ملف تعريف OpenStreetMap.org . - إضافة جميع النقاط إلى علامات الخريطة؟ + إضافة جميع النقاط إلى التوجيه المباشر؟ مسح السجلات ؟ إظهار مسارات الدراجة الجبلية يمكنك إزالة التحديثات المحملة والرجوع إلى الإصدار الأصلي للخريطة From 29986743ed149da9d4d5611dcf893f297f55119f Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:17 +0000 Subject: [PATCH 14/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 3223e1b6ff..6f0102bf92 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1613,7 +1613,7 @@ \nللعودة إلى واحدة من أنماط الخريطة التقليدية، ببساطة إما عطل هذا الملحق مرة أخرى أو غير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة. البحث قرب مركز الخريطة الحالية عدد خطوط التوجيه - علامات الخريطة + التوجيه المباشر تخطي الحدود حدد الطرق التي تريد تجنبها أثناء التنقل. الفئات @@ -1635,7 +1635,7 @@ التوجيه المباشرالثاني للخريطة إضافة إلى التوجيه المباشر حذف كافة التوجيه المباشرالنشط على الخريطة؟ - علامة خريطة + توجيه مباشر على الخريطة عرض المضلعات الحالة حفظ التعديلات From dab1fb8da091717ba056a1a6298fe9f226489538 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:20:20 +0000 Subject: [PATCH 15/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 6f0102bf92..3fcd16c645 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -417,7 +417,7 @@ مساء صباحاً مكان للوقوف - يساعد هذا الملحق بحفظ الأماكن التي ركنت بها سيارتك والوقت المتبقي للركن (في حالة وجود وقت محدد). + يساعد هذا الملحق بحفظ الأماكن التي ركنت بها سيارتك والوقت المتبقي للركن (في حالة وجود وقت محدد). \nكل من المكان والزمن متواجدان على لوحة التحكم وكذلك في المؤشرات على شاشة الخريطة. يمكن إضافة منبه إلى التقويم للتذكير. مكان الموقف موقف السيارة @@ -557,11 +557,11 @@ تقديم الخريطة هل تريد حذف %1$d من التعديلات؟ احذف الكل - يوفر هذا الملحق طبقة خط كنتوري وطبقة للتضاريس ظاهرة على الخريطة الأساسية للتطبيق. هذه الوظيفة ستكون محل تقدير من طرف الرياضيين، المتنزهين، الرحالة، وكل من هو مهتم بجمال ورخاء الطبيعة. -\n + يوفر هذا الملحق طبقة خط كنتوري وطبقة للتضاريس ظاهرة على الخريطة الأساسية للتطبيق. هذه الوظيفة ستكون محل تقدير من طرف الرياضيين، المتنزهين، الرحالة، وكل من هو مهتم بجمال ورخاء الطبيعة. +\n \nالبيانات العالمية (بين 70 درجة شمالا و70 جنوبا) مبنية حسب قياسات SRTM (مكوك رادار البعثة الطبوغرافية) وASTER (المكوك المتقدم الخاص بالانبعاث الحراري والانعكاس الإشعاعي)، أداة تصوير على متن Terra، القمر الصناعي الرئيسي لنظام رصد الأرض التابع لناسا. ASTER هو جهد تعاوني فيما بين وكالة ناسا، وزارة الاقتصاد اليابانية، التجارة والصناعة (METI)، و أنظمة الفضاء اليابانية (J-spacesystems). - يوفر هذا الملحق خطوط كنتورية وطبقة تضاريس (طبيعية) تظهر على خرائط أوسماند. هذه الوظيفة ستعجب كثيرا الرياضيين، المتجولين، الرحالة، و كل من تهمه بنية التضاريس الطبيعية (يرجى ملاحظة أن بيانات الخطوط الكنتورية/أو المساعدة منفصلة ، وتتوفر تنزيلات إضافية بعد تنشيط الملحق.) -\nالبيانات العالمية (ما بين 70 درجة شمالاً و70 جنوباً) مبنية على مقاييس SRTM (مكوك رادار البعثة الطبوغرافية) و ASTER (الانبعاث الحراري الفضائي المتقدم والإنعكاس الإشعاعي)، أداة التصوير على متن Terra، القمر الصناعي الرئيسي لنظام رصد الأرض التابع لناسا. + يوفر هذا الملحق خطوط كنتورية وطبقة تضاريس (طبيعية) تظهر على خرائط أوسماند. هذه الوظيفة ستعجب كثيرا الرياضيين، المتجولين، الرحالة، و كل من تهمه بنية التضاريس الطبيعية (يرجى ملاحظة أن بيانات الخطوط الكنتورية/أو المساعدة منفصلة ، وتتوفر تنزيلات إضافية بعد تنشيط الملحق.) +\nالبيانات العالمية (ما بين 70 درجة شمالاً و70 جنوباً) مبنية على مقاييس SRTM (مكوك رادار البعثة الطبوغرافية) و ASTER (الانبعاث الحراري الفضائي المتقدم والإنعكاس الإشعاعي)، أداة التصوير على متن Terra، القمر الصناعي الرئيسي لنظام رصد الأرض التابع لناسا. \n ASTER هو جهد تعاوني بين كل من وكالة ناسا، وزارة الاقتصاد اليابانية، التجارة والصناعة (METI)، ونظم الفضاء اليابانية (J-spacesystems). أوسماند (اتجاهات التنقل الآلية OSM) \n @@ -585,10 +585,10 @@ \n - لا توجد إمكانية الوصول دون اتصال إلى النقاط المهمة في ويكيبيديا \n \n يجري تطوير أوسماند بنشاط ويعتمد مشروعنا والتقدم المستمر على المساهمات المالية لتطوير واختبار وظائف جديدة. يرجى النظر في شراء أوسماند+ ، أو تمويل ميزات جديدة محددة أو تقديم تبرع عام على https://osmand.net. - هذا الملحق يمكنك من الوصول إلى أنواع عديدة من خرائط النت (تدعى بالقطع أو النقطية)، من قطع OSM مسبقة ( مثل Mapnik) إلى صور أقمار وطبقات مخصصة كخرائط الطقس، الخرائط الجيولوجية، طبقات التضاريس...إلخ. -\n -\nكل من هذه الخرائط يمكن أن تستخدم إما كخرائط رئيسية (قاعدية) تظهر على واجهة التطبيق، أو كطبقة فوقية أو تحتية لخريطة قاعدية آخرى( كخرائط التطبيق المحلية). لجعل أي طبقة تحتية خريطة أكثر وضوحا، بعض عناصر خرائط التطبيق التوجيهيه يمكن إخفاءها في قائمة \'ضبط الخريطة\' حسب الرغبة. -\n + هذا الملحق يمكنك من الوصول إلى أنواع عديدة من خرائط النت (تدعى بالقطع أو النقطية)، من قطع OSM مسبقة ( مثل Mapnik) إلى صور أقمار وطبقات مخصصة كخرائط الطقس، الخرائط الجيولوجية، طبقات التضاريس...إلخ. +\n +\nكل من هذه الخرائط يمكن أن تستخدم إما كخرائط رئيسية (قاعدية) تظهر على واجهة التطبيق، أو كطبقة فوقية أو تحتية لخريطة قاعدية آخرى( كخرائط التطبيق المحلية). لجعل أي طبقة تحتية خريطة أكثر وضوحا، بعض عناصر خرائط التطبيق التوجيهيه يمكن إخفاءها في قائمة \'ضبط الخريطة\' حسب الرغبة. +\n \nأجزاء الخرائط يمكن الحصول عليها من مصادر إنترنت، أو تحضيرها للإستخدام دون إنترنت ( ونسخها يدويا إلى مجلد بيانات التطبيق) كقاعدة بيانات SQLite والتي يمكن إنتاجها عن طريق مجموعة متنوعة من أدوات تحضير الخرائط المستقلة. التغييرات POI داخل التطبيق لا تؤثرعلى ملفات الخرائط المحملة، يتم حفظ التغييرات إلى ملف محلي بدلا من ذلك. وضع تركيز الكاميرا: @@ -933,7 +933,7 @@ زيارة بعد زيارة قبل محاكاة تخيلية - خط العرض %1$s + خط العرض %1$s \nخط الطول %2$s الأسئلة الشائعة، التغييرات الحديثة، وأخرى. إعدادات الملاحة @@ -1025,8 +1025,8 @@ فشل في إعادة التسمية. عودة إلى الخريطة شارك ملاحظة - الموقع: -\n Lat %1$s + الموقع: +\n Lat %1$s \n Lon %2$s ملاحظات خريطة إنترنت @@ -1606,10 +1606,10 @@ الزمن : انعطف يميناً انعطف يسارا واذهب - هذا الملحق يوفير خرائط بحرية للزوارق والمراكب الشراعية وأنواع أخرى من الرياضات المائية. -\n -\nخريطة خاصة إضافية للتطبيق ستقدم كل علامات الملاحة البحرية سواء داخلية أو شاطئية وكذلك جدول للرموز. وصف كل وجهة ملاحة يوفر التفاصيل اللازمة للتعرف عليها ومعانيها (الفئة، الشكل، اللون، التسلسل، المرجع...إلخ.). -\n + هذا الملحق يوفير خرائط بحرية للزوارق والمراكب الشراعية وأنواع أخرى من الرياضات المائية. +\n +\nخريطة خاصة إضافية للتطبيق ستقدم كل علامات الملاحة البحرية سواء داخلية أو شاطئية وكذلك جدول للرموز. وصف كل وجهة ملاحة يوفر التفاصيل اللازمة للتعرف عليها ومعانيها (الفئة، الشكل، اللون، التسلسل، المرجع...إلخ.). +\n \nللعودة إلى واحدة من أنماط الخريطة التقليدية، ببساطة إما عطل هذا الملحق مرة أخرى أو غير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة. البحث قرب مركز الخريطة الحالية عدد خطوط التوجيه @@ -1657,7 +1657,7 @@ اختر التوجيه الصوتي اختر أو قم بتحميل التوجيه الصوتي الخاص بلغتك. منح الوصول إلى بيانات الموقع. - طرق الخيول + مسارات الخيول إخفاء جودة أقل أعلى جودة @@ -1870,7 +1870,7 @@ تلوين وفق الانتماء للشبكة تلوين وفق رمز تنزه OSMC خروج - حذف الملاحظات %1$d؟ + هل أنت متأكد من أنك تريد حذف الملاحظات %1$d؟ لعرض الخرائط البحرية، يجب تحميل خريطة خاصة محلياً. تسجيل الموقع العام إلى ملف GPX يمكن تشغيله أو إيقافه باستخدام نافذة تسجيل GPX على الشاشة خريطة. ضبط اسم مضيف البروكسي (مثال 127.0.0.1). @@ -1891,8 +1891,8 @@ أخرى %1$s %2$s عنصر ؟ البيانات الجغرافية المؤقتة - هذا الملحق يفعل وظيفة تسجيل وحفظ المسارات الخاصة بك عبر الضغط على نافذة GPX على شاشة الخريطة، أو كذلك تسجيل كافة طرق الملاحة الخاص بك تلقائيا إلى ملف GPX. -\n + هذا الملحق يفعل وظيفة تسجيل وحفظ المسارات الخاصة بك عبر الضغط على نافذة GPX على شاشة الخريطة، أو كذلك تسجيل كافة طرق الملاحة الخاص بك تلقائيا إلى ملف GPX. +\n \nالمسارات المسجلة يمكن مشاركتها مع أصدقائك أو استخدامها كمساهمات ل OSM . الرياضيون يمكنهم استخدام المسارات المسجلة لمتابعة تدريباتهم. بعض تحليل المسار الابتدائية يمكن القيام بها مباشرة في التطبيق، مثل توقيت الدورات، ومتوسط السرعة...الخ، و يمكن أيضا تحليل المسارات باستعمال أدوات تحليل جانبية لاحقا. أوسماند ليس لديه إذن لاستخدام ذاكرة البطاقة هل تريد حقا حفظ POI بدون تحديد نوعه؟ @@ -1990,8 +1990,8 @@ يرجى تفعيل ملحق المعالم البحرية %1$.1f من %2$.1f مب %.1f مب - يضع هذا الملحق بين يديك تفاصيل منحدرات تزلج عالمية، مسارات تزلج عبر كامل البلاد، التلفريك ومصاعد التزلج. الطرقات والمعابر مبينة بألوان حسب الصعوبة، -\n + يضع هذا الملحق بين يديك تفاصيل منحدرات تزلج عالمية، مسارات تزلج عبر كامل البلاد، التلفريك ومصاعد التزلج. الطرقات والمعابر مبينة بألوان حسب الصعوبة، +\n \nومصورة بنمط خريطة مميز \'شتوي\' تمثل مناظر الطبيعة بلون مثلج شتوي. أشياء فوق سطح الأرض تغيير @@ -2163,7 +2163,7 @@ قم بالضغط على الزر لفترة أطوَل ثم اسحبه لتغيير مكانه على الشاشة. معالم العمق البحري تقسيم المسارات آلياً إلى أجزاء بعد كل فراغ - تقصير رمز التموضع المفتوح + تقصير رمز التموضع المفتوح \n يُرجى تقديم رمزٍ كامل اسم الاختصار السريع مكرر سوف تكون تتمة هذه الرسالة تلقائية في المجال المخصص للتعليق. @@ -2419,7 +2419,7 @@ اسم الاختصار السريع المحدد قيد الاستخدام، لقد تم تغييره إلى %1$s لتجنب التكرار. الضغط على زر الإجراء سيطبق أحد الأنماط من القائمة أدناه. تنقلاتك على هذا الطريق - OLC الصالحة بالكامل\nتمثل المنطقة: %1$s x %2$s + OLC الصالحة بالكامل تمثل المنطقة: %1$s x %2$s اسم المستخدم خاطئ إلى مِن From c267e35b145256dc0ed1eede87f844d63a64a373 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:18 +0000 Subject: [PATCH 16/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 3fcd16c645..accf0baef2 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1832,7 +1832,7 @@ ملاحظة OSM معلق عليها مسار زلق لإظهار خرائط التزلج، يجب تحميل خريطة خاصة محلية. - حافلة، عربة وغيرها + حافلة، ترامواي وغيرها إنشاء ملاحظة OSM حدث استثناء: لم يتم إنشاء الملاحظة. حدث استثناء: لم يتم غلق الملاحظة. From c71b6bdae9695d29363a747c93039b0347b06680 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:19 +0000 Subject: [PATCH 17/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index accf0baef2..bbda174f77 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1172,7 +1172,7 @@ طرق الحافلات الكهربائية طرق الحافلات سكك قطار الأنفاق - تاكسي مشاركة الطرق + شارك طرق التاكسي حدد حد السرعة المسموح به لتلقي تنبيه صوتي إذا ما تجاوزته. مراقبة الحدود كشك الرسوم From 12a277a226d5ad17943799299cc2b5ab6077dc89 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:19 +0000 Subject: [PATCH 18/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index bbda174f77..b149bdab61 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1073,7 +1073,7 @@ تجنب الطرق… طرق السكك الحديدية خطوط الترام - الطرق + المسارات الرياضية وسائل المواصلات سمات أخرى للخريطة العناصر الأخرى From 768bf89dcb61931603b9a5d634cedda24e022f7b Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:20 +0000 Subject: [PATCH 19/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index b149bdab61..fd131b6a8c 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -979,7 +979,7 @@ مصدر الخريطة عرض أسماء المفضلة لغة الخريطة - التفاصيل + تفاصيل إضافية الوقت الحالي اتجاه الخريطة اتجاه الحركة في الأعلى From 8d8f526cf324ad3bec2b32192af80c32a5026f7e Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:23 +0000 Subject: [PATCH 20/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 118 +++++++++++++++---------------- 1 file changed, 58 insertions(+), 60 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index fd131b6a8c..e79e7ddea5 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -329,7 +329,7 @@ نسخ الاحتياطي كتعديل OSM %1$d ملف بقى يظهر الإعدادات لتمكين التتبع والملاحة في وضعية السكون ( الشاشة مغلقة ) عبر إيقاظ دوري لجهاز GPS. - حساب الطرق بدقة دون أخطاء. لا يزال محدود المسافة وبطيء. + تمكين لحساب المسارات بدقة دون أخطاء. لا يزال محدود المسافة وبطيء. صورة %1$s %2$s مزامنة المسارات والملاحظات الصوتية / الفيديو مع حساب Dropbox الخاص بك. تنسيق الفيديو الناتج: @@ -372,9 +372,9 @@ مسطرة عرض الاتجاه عدادات شفافة - تشغيل + تشغيل \n التطبيق في الخلفية - إيقاف + إيقاف \n التشغيل في الخلفية الاختصارات أين أنا @@ -497,9 +497,9 @@ تركيز تلقائي التركيز البؤري نوع الكاميرا - * انقر لتحديد نقطة. -\n  * اضغط لفترة طويلة على الخريطة لحذف النقطة السابقة. -\n  * اضغط لفترة طويلة على نقطة لعرض وإرفاق الوصف. + * انقر لتحديد نقطة. +\n  * اضغط لفترة طويلة على الخريطة لحذف النقطة السابقة. +\n  * اضغط لفترة طويلة على نقطة لعرض وإرفاق الوصف. \n  * اضغط على أداة القياس لمعرفة المزيد من الإجراءات. طبقة التضاريس طبقة التضاريس @@ -546,7 +546,7 @@ اختيار المسار النشط الحالي اختيار مسار محفوظ تذكر اختياري - إجمالي الذاكرة الأصلية المخصصة من قبل التطبيق %1$s م.ب (دلفيك %2$s م.ب, أخرى %3$s م.ب). + إجمالي الذاكرة الأصلية المخصصة من قبل التطبيق %1$s م.ب (دلفيك %2$s م.ب, أخرى %3$s م.ب). \nالذاكرة النسبية %4$s م.ب (حد الأندرويد %5$s م.ب, دلفيك %6$s م.ب). مشي دراجة نارية @@ -592,23 +592,21 @@ \nأجزاء الخرائط يمكن الحصول عليها من مصادر إنترنت، أو تحضيرها للإستخدام دون إنترنت ( ونسخها يدويا إلى مجلد بيانات التطبيق) كقاعدة بيانات SQLite والتي يمكن إنتاجها عن طريق مجموعة متنوعة من أدوات تحضير الخرائط المستقلة. التغييرات POI داخل التطبيق لا تؤثرعلى ملفات الخرائط المحملة، يتم حفظ التغييرات إلى ملف محلي بدلا من ذلك. وضع تركيز الكاميرا: - أوسماند+ (OSM اتجاهات التنقل التلقائية) -\n -\n عبارة عن تطبيق ملاحة مفتوح المصدر مع إمكانية الوصول إلى العديد من بيانات عالمية للموقع. كل بيانات الخرائط (خرائط التوجيه أو الخرائط الجزئية) يمكن تخزينها في ذاكرة الجهاز للإستخدام دون إنترنت. يوفر التطبيق كذلك وظائف توجيه بما في ذلك التوجيه الصوتي. -\n -\nبعض الميزات الأساسية: -\n - تشغيل كامل دون إنترنت( خزن خرائط التوجيه أو الخرائط الجزئية المنزلة في ذاكرة الجهاز) -\n - خرائط التوجيه المدمجة للعالم ككل متاحة لتعمل دون إنترنت -\n - تحميل غير محدود لخرائط البلدان أو المناطق مباشرة من التطبيق -\n - ميزة ويكيبيديا المحلية ( قم بتحميل نقاط الاهتمام لويكيبيديا)، الأمثل لمشاهدة المعالم الأثرية -\n - يمكن تراكب عدة طبقات للخرائط، ك GPX أو مسارات الملاحة، مواقع ذات الاهتمام ، الأماكن المفضلة، الحدود الكنتورية، أماكن توقف النقل العمومي، خرائط إضافية بشفافية قابلة للتعديل -\n - البحث عن العناوين وأماكن الاهتمام دون إنترنت -\n -\n - تحديد الطريق لمسافات متوسطة المدى -\n - وضع السيارة، الدراجة والمشاة متوفر مع: -\n - تبديل اختياري آلي لوضع الرؤية في الليل/النهار -\n - تكبير اختياري حسب السرعة -\n - محاذاة اختيارية للخريطة حسب البوصلة أو اتجاه الحركة + أوسماند+ (OSM اتجاهات التنقل التلقائية) +\n عبارة عن تطبيق ملاحة مفتوح المصدر مع إمكانية الوصول إلى العديد من بيانات عالمية للموقع. كل بيانات الخرائط (خرائط التوجيه أو الخرائط الجزئية) يمكن تخزينها في ذاكرة الجهاز للإستخدام دون إنترنت. يوفر التطبيق كذلك وظائف توجيه بما في ذلك التوجيه الصوتي. +\n +\nبعض الميزات الأساسية: +\n - تشغيل كامل دون إنترنت( خزن خرائط التوجيه أو الخرائط الجزئية المنزلة في ذاكرة الجهاز) +\n - خرائط التوجيه المدمجة للعالم ككل متاحة لتعمل دون إنترنت +\n - تحميل غير محدود لخرائط البلدان أو المناطق مباشرة من التطبيق +\n - ميزة ويكيبيديا المحلية ( قم بتحميل نقاط الاهتمام لويكيبيديا)، الأمثل لمشاهدة المعالم الأثرية +\n - يمكن تراكب عدة طبقات للخرائط، ك GPX أو مسارات الملاحة، مواقع ذات الاهتمام ، الأماكن المفضلة، الحدود الكنتورية، أماكن توقف النقل العمومي، خرائط إضافية بشفافية قابلة للتعديل +\n - البحث عن العناوين وأماكن الاهتمام دون إنترنت +\n - تحديد الطريق لمسافات متوسطة المدى +\n - وضع السيارة، الدراجة والمشاة متوفر مع: +\n - تبديل اختياري آلي لوضع الرؤية في الليل/النهار +\n - تكبير اختياري حسب السرعة +\n - محاذاة اختيارية للخريطة حسب البوصلة أو اتجاه الحركة \n - توجيه اختياري للممر، عرض الحد الأقصى للسرعة، أصوات TTS (نص إلى كلام) أو أخرى مسجلة \n {0} POI/الملاحظات تم رفعها @@ -880,7 +878,7 @@ تجنب العبارات وزن المركبة منذ نسخة أندرويد كتكات 4.4، لا يمكنك تحميل أو تحديث الخرائط في مكان التخزين السابق (%s). هل تريد التغيير إلى مكان مسموح ونسخ كل الملفات إليه ؟ ملاحظات: 1-الملفات القديمة ستبقى كما هي (يمكن حذفها يدويا). -\n +\n \n2-لايمكن مشاركة الملفات بين أوسماند و +أوسماند في مكان التخزين الجديد. ينسخ الملف (%s) إلى مساره الجديد… تنبيه الوصول @@ -1186,7 +1184,7 @@ قيود الدخول عرض قيود الدخول عرض سطح الطريق - إظهار طرق الدراجات + إظهار مسارات الدراجات بدء التوجيه المفصل تلقائياً مسارات فرعية: %1$s نقاط الطريق: %1$s @@ -2313,8 +2311,8 @@ بدء مقطع جديدة بعد فارق 6 دقائق، مسار جديد بعد فارق 2 ساعة، أو ملف جديد بعد فارق أطول إذا تغير التاريخ. متوقف مؤقتاً قد يكون المسار طويلا جدا للحساب. يرجى إضافة وجهات وسطى إذا لم يتم العثور على نتيجة خلال 10 دقائق. - أوسماند(توجيهات OSM للتنقل الآلية) تطبيق خريطة وتنقل مع إمكانية الوصول إلى بيانات (OSM) مجاناً وفي جميع أنحاء العالم، وبجودة عالية -\n + أوسماند(توجيهات OSM للتنقل الآلية) تطبيق خريطة وتنقل مع إمكانية الوصول إلى بيانات (OSM) مجاناً وفي جميع أنحاء العالم، وبجودة عالية +\n \n. استمتع بمستكشف بالصوت والصورة، وعرض (نقاط الاهتمام)، إنشاء وإدارة مسارات GPX، استخدام عرض ارتفاع بيانات الخطوط الكنتورية(عن طريق الملحق)، اختيار بين نمط القيادة، ركوب الدراجات والمشاة، التعديل على الموقع وغيرها. التنقل عبر GPS \n• يمكنك أن تختار بين وضع دون اتصال (لا رسوم تجوال عندما تكون في الخارج) أو بالإنترنت (أسرع) @@ -2330,20 +2328,20 @@ \n خريطة \n• \"عرض النقاط POI\" (نقطة اهتمام) من حولك -\n• ضبط الخريطة اتجاه الحركة أو (البوصلة) +\n• ضبط الخريطة اتجاه الحركة أو (البوصلة) \n• إظهار مكانك الحالي وما يقابلك \n• مشاركة موقعك حتى يتسنى لأصدقاء إيجادك \n• الاحتفاظ بأهم الأماكن في المفضلة \n• يسمح لك باختيار كيفية عرض الأسماء على الخريطة: باللغة الإنجليزية، اللغة المحلية أو حسب الإملاء الصوتي \n• إظهار نمط خريطة إنترنت متخصص ، صورة قمر صناعي (بينج)، إظهار طبقات خريطة متراكبة مختلفة كالسياحة/مسارات GPX للملاحة وطبقات إضافية مع شفافية قابلة للتعديل \n - التزلج + التزلج \nملحق خرائط أوسماند للتزلج يمكنك من مشاهدة مسارات التزلج مع مستوى من التعقيد وبعض المعلومات الإضافية، كمواقع المصاعد والمرافق الأخرى. - ركوب الدراجات الهوائية -\n• العثورعلى مسار دراجات على الخريطة -\n• التنقل في وضع ركوب الدراجات تقترح لك مسار دراجات -\n• يمكنك مشاهدة سرعتك وارتفاعك -\n• خيار تسجيل GPX يتيح لك تسجيل رحلتك ومشاركتها + ركوب الدراجات الهوائية +\n• العثورعلى مسار دراجات على الخريطة +\n• التنقل في وضع ركوب الدراجات تقترح لك مسار دراجات +\n• يمكنك مشاهدة سرعتك وارتفاعك +\n• خيار تسجيل GPX يتيح لك تسجيل رحلتك ومشاركتها \n• عبر ملحق إضافي يمكنك عرض الخطوط الكنتورية والتضاريس المشي، التنزه، جولة في المدينة \n• الخريطة تظهر لك ممرات المشي والتنزه @@ -2366,34 +2364,34 @@ \n• أنتاركتيكا: * \nمعظم البلدان في جميع أنحاء العالم متاحة للتحميل! \nاحصل على برنامج تنقل موثوق به في بلدك - سواءاً في فرنسا، ألمانيا، المكسيك، المملكة المتحدة، إسبانيا، هولندا، الولايات المتحدة الأمريكية، روسيا، البرازيل أو أي دولة أخرى. - أوسماند بلس (توجيهات OSM للملاحة الآلية) تطبيق خريطة وملاحة مع إمكانية الوصول إلى بيانات الموقع مجاناً وفي جميع أنحاء العالم، وبجودة عالية. -\nاستمتع بالملاحة بصوت والصورة، عرض النقاط المهمة حولك (POI)، وإنشاء وإدارة مسارات GPX باستخدام معلومات عن تصور وعلو الخطوط الكنتورية، خياراً بين القيادة، ركوب الدراجات، وضع المشاة، التعديل على OSM وأكثر من ذلك بكثير. -\n -\nأوسماند بلس هو إصدار للتطبيق مدفوع الأجر. قبل شرائه، ادعم المشروع، بتمويل لتطوير الميزات الجديدة والحصول على آخر التحديثات. -\n + أوسماند بلس (توجيهات OSM للملاحة الآلية) تطبيق خريطة وملاحة مع إمكانية الوصول إلى بيانات الموقع مجاناً وفي جميع أنحاء العالم، وبجودة عالية. +\nاستمتع بالملاحة بصوت والصورة، عرض النقاط المهمة حولك (POI)، وإنشاء وإدارة مسارات GPX باستخدام معلومات عن تصور وعلو الخطوط الكنتورية، خياراً بين القيادة، ركوب الدراجات، وضع المشاة، التعديل على OSM وأكثر من ذلك بكثير. +\n +\nأوسماند بلس هو إصدار للتطبيق مدفوع الأجر. قبل شرائه، ادعم المشروع، بتمويل لتطوير الميزات الجديدة والحصول على آخر التحديثات. +\n \n بعض الميزات الرئيسية: - الملاحة + الملاحة \n• يعمل على الإنترنت (سريع) أو في وضع غير متصل (لا رسوم تجوال خارج الوطن) \n• توجيه صوتي بالتفصيل (الأصوات المسجلة أو مدرجة) \n• موجه مسار اختياري، عرض اسم الشارع، والوقت المقدر للوصول \n• يدعم نقاط وسيطة خلال مسارك \n• إعادة تلقائية للتوجيه كلما انحرفت عن الطريق \n• البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية - عرض الخريطة -\n• عرض موقعك والتوجيه -\n• محاذاة اختيارية للصورة وفق البوصلة أو توجيه الحركة -\n• حفظ أهم أماكنك المفضلة -\n• عرض نقاط الاهتمام من حولك -\n• عرض متخصص لبيانات خرائط على الإنترنت، الرؤية من الأقمار الصناعية (من بينج) وتراكب طبقات خرائط مختلفة كالسياحة ومسارات GPX للملاحة وطبقات إضافية مع شفافية قابلة للتعديل + عرض الخريطة +\n• عرض موقعك والتوجيه +\n• محاذاة اختيارية للصورة وفق البوصلة أو توجيه الحركة +\n• حفظ أهم أماكنك المفضلة +\n• عرض نقاط الاهتمام من حولك +\n• عرض متخصص لبيانات خرائط على الإنترنت، الرؤية من الأقمار الصناعية (من بينج) وتراكب طبقات خرائط مختلفة كالسياحة ومسارات GPX للملاحة وطبقات إضافية مع شفافية قابلة للتعديل \n• عرض اختياري لأسماء الأماكن باللغة الإنكليزية، اللغة المحلية، أو عبر الإملاء الصوتي \n - استخدام OSM وبيانات ويكيبيديا -\n• جودة معلومات من أفضل المشاريع التعاونية العالمية -\n• بيانات OSM متاحة لكل بلد أو منطقة -\n• POI ويكيبيديا، الأفضل لمشاهدة المعالم السياحية -\n• التنزيلات مجانية غير محدودة، مباشرة من التطبيق -\n• خرائط فيكتور مدمجة تحدث مرة واحدة في شهر على الأقل -\n + استخدام OSM وبيانات ويكيبيديا +\n• جودة معلومات من أفضل المشاريع التعاونية العالمية +\n• بيانات OSM متاحة لكل بلد أو منطقة +\n• POI ويكيبيديا، الأفضل لمشاهدة المعالم السياحية +\n• التنزيلات مجانية غير محدودة، مباشرة من التطبيق +\n• خرائط فيكتور مدمجة تحدث مرة واحدة في شهر على الأقل +\n \n• اختر بين بيانات منطقة كاملة أو شبكة الطرق فقط (مثال: سعة اليابان 700 MB في حين 200 MB لشبكة الطرق فقط) ميزات الأمان \n• عرض اختياري لوضع النهار/اليل @@ -2401,12 +2399,12 @@ \n• تكبير/تصغيير اختياري حسب السرعة \n• مشاركة موقعك حتى يتمكن لأصدقاءك ايجادك \n - ميزات الدراجة والمشاة -\n • عرض ممرات المشاة، التنزه، وأنشطة الهواء الطلق -\n • توجيه متخصص وعرض طرق خاصة باللدراجات الهوائية والمشاة -\n • محطات نقل عام اختيارية (حافلات، الترامواي، القطار) بما في ذلك أسماء خطوط النقل -\n • تسجيل رحلة اختياري إلى ملف GPX محلي أو لخدمة على الإنترنت -\n • عرض اختياري للسرعة والارتفاع + ميزات الدراجة والمشاة +\n • عرض ممرات المشاة، التنزه، وأنشطة الهواء الطلق +\n • توجيه متخصص وعرض طرق خاصة باللدراجات الهوائية والمشاة +\n • محطات نقل عام اختيارية (حافلات، الترامواي، القطار) بما في ذلك أسماء خطوط النقل +\n • تسجيل رحلة اختياري إلى ملف GPX محلي أو لخدمة على الإنترنت +\n • عرض اختياري للسرعة والارتفاع \n • عرض الخطوط الكنتورية والتضاريس (عن طريق برامج ملحق إضافي) المساهمة مباشرة في OSM \n• الابلاغ عن الأخطاء في البرنامج From ac284c49d901dc2a795d995c6f2d64bf6144b0ca Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:23 +0000 Subject: [PATCH 21/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index e79e7ddea5..6cfa74a29d 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -471,7 +471,7 @@ إفريقيا آسيا أستراليا و أوقيانوسيا - التوجيه + التوجيه مع الطرق ضبط خاص لكل وضع من أوضاع الملاحة. إدارة بيانات الخرائط إعدادات عامة @@ -721,8 +721,8 @@ عكس اتجاه المسار استخدم الوجهة الحالية يمر على طول المسار باكمله - خريطة التنقل متوفرة لهذا الموقع فعلها عبر -\n + خريطة التنقل متوفرة لهذا الموقع فعلها عبر +\n \n\'القائمة\' ← \'ضبط الخريطة\' ← \'مصدر الخريطة\' ← \'الخريطة المحملة\'. مصدر التوجيه الصوتي اختيار قناة لتشغيل التوجيه الصوتي. From 8c3bc0d36843f193b129a6b122f6f238411b59dd Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:24 +0000 Subject: [PATCH 22/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 6cfa74a29d..befbe065ae 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -770,7 +770,7 @@ ميل ساعة ميل شارك المكان باستخدام - الموقع: %1$s + الموقع: %1$s \n%2$s إتبع رابط متصفح الويب لمشاهدة المكان %1$s أو استعمل رابط أندرويد الخاص %2$s إرسال الموقع @@ -992,7 +992,7 @@ تسجيل المسار اختر الفاصل الزمني لتسجيل المسار أثناء الملاحة صوت مسج - الاتجاهات + التوجيه مع الطرق استخدام الموقع… مفضلة نقاط مفضلة مجاورة @@ -1895,8 +1895,8 @@ أوسماند ليس لديه إذن لاستخدام ذاكرة البطاقة هل تريد حقا حفظ POI بدون تحديد نوعه؟ هناك خيار جديد لتحكم بشكل مرن بالتطبيق عبر لوحة القياس أو القائمة الثابتة. اختيارك يمكن تغييره دائما في إعدادات لوحة القياس. - ملاحة أوسماند دون نت ميزة تجريبية وهي لا تعمل لمسافات تزيد عن 20 كم. -\n + ملاحة أوسماند دون نت ميزة تجريبية وهي لا تعمل لمسافات تزيد عن 20 كم. +\n \n خدمة الملاحة حولت مؤقتا إلى CloudMade على الإنترنت. إصدار {0} تثبيت بنجاح ({1}). جار تحميل الإصدار… @@ -1969,7 +1969,7 @@ البيانات الصوتية المحددة تالفة بطاقة الذاكرة غير متاحة. \nلن تكون قادرا على رؤية الخرائط أو العثور على أماكن. - بطاقة الذاكرة في وضع القراءة فقط. + بطاقة الذاكرة في وضع القراءة فقط. \n يمكنك فقط مشاهدة الخريطة المحملة مسبقاً ولا يمكنك التحميل من الإنترنت. انعطف يميناً بشكل حاد انعطف يساراً بشكل حاد @@ -1979,7 +1979,7 @@ المسار اللاحق للرحلة حساب الجزء الأول فقط من الطريق للرحلات الطويلة. إلغاء - خرائط محلية + خرائط محلية \nوملاحة إنشاء إحداثية POI عدد الصفوف في الدفعة %1$s @@ -2088,7 +2088,7 @@ إجراءات سريعة إجراء %d شاشة %d - إضافة علامة خريطة + إضافة توجيه مباشر للخريطة إضافة POI نمط الخريطة نمط الخرائط تغير ل \"%s\". @@ -3354,8 +3354,8 @@ لوحة المفاتيح وندرلينك ببغاء - المسار: المسافة%1$s، الوقت %2$s. -\nالحساب: %3$.1f ث، %4$d طريق، %5$d تجانب + المسار: المسافة%2$s، وقت التوجيه %1$s. +\nالحساب: %3$.1f ث، %4$d طريق، %5$d تجانب) الأوكيتانية ثم %1$s تطبيق فقط على \"%1$s\" From 8e8928a3af53c50009c28148fab6e9c318574f54 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:25 +0000 Subject: [PATCH 23/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index befbe065ae..e9a9b1e536 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3327,7 +3327,7 @@ طرق لجولات التزلج. تزلج منحدرات لاستخدام الزلاجات. - السماح بالطرق المتوسطة + السماح بالمسارات المتوسطة طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات ينبغي تجنبها. السماح للطرق المتقدمة طرق صعبة ، مع عقبات خطيرة وأقسام شديدة الانحدار. From c78b03515f601c3971e3fc4dc8865e56b46e89dd Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:25 +0000 Subject: [PATCH 24/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index e9a9b1e536..ab52475a31 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3328,7 +3328,7 @@ تزلج منحدرات لاستخدام الزلاجات. السماح بالمسارات المتوسطة - طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات ينبغي تجنبها. + طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات التي ينبغي تجنبها. السماح للطرق المتقدمة طرق صعبة ، مع عقبات خطيرة وأقسام شديدة الانحدار. السماح بطرق المتخصصين From 16c8f713c1ba3087d1400c4e07c3155aebdddef7 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Tue, 9 Feb 2021 23:22:39 +0000 Subject: [PATCH 25/44] Translated using Weblate (Hebrew) Currently translated at 99.9% (3660 of 3661 strings) --- OsmAnd/res/values-iw/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index d91880e6d1..02eb125d47 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -3970,7 +3970,7 @@ בחירת תקינה נא לבחור תיקייה או להוסיף אחת חדשה ריק - ניתוח לפי מרווחים (פיצול מרווחים) + ניתוח מרווחי פיצול העלאה ל־OpenStreetMap עריכת מסלול שינוי שם מסלול @@ -4016,4 +4016,11 @@ OpenPlaceReviews להשתמש ב־test.openplacereviews.org כניסה ל־OpenPlaceReviews + זמן ההכרזה של ההנחיות הקוליות השונות תלוי בסוג ההכרזה, במהירות הניווט הנוכחית ובמהירות הניווט כבררת מחדל. + הצללה / מדרון / קווי מתאר + OpenPlaceReviews הוא מיזם בהובלת הקהילה בנוגע למקומות ציבוריים כגון מסעדות, מלונות, מוזיאונים ונקודות דרך. הוא אוסף מידע ציבורי עליהם כגון תמונות, סקירות, קישורים למערכות אחרות שמקושרות ל־OpenStreetMap, ויקיפדיה. +\n +\nכל הנתונים של OpenPlaceReview הם פתוחים וזמינים לציבור הרחב: http://openplacereviews.org/data. +\n +\nניתן לקרוא עוד באתר: http://openplacereviews.org \ No newline at end of file From fc808871882b3ce7823cc8f9a5f56de80010af97 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 09:21:26 +0000 Subject: [PATCH 26/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3661 of 3661 strings) --- OsmAnd/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index ab52475a31..6952e1c6c8 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3334,7 +3334,7 @@ السماح بطرق المتخصصين طرق صعبة للغاية ، مع عقبات خطيرة والمناطق المحيطة بها. السماح بالتزلج على الطرق فقط - طرق مصممة للأسلوب الحر أو التزلج فقط بدون المسارات الكلاسيكية. + الطريق مصممة خصيصا بحرية أو التزلج على الجليد. السماح للطرق الكلاسيكية فقط تم إعداد الطرق للأسلوب الكلاسيكي فقط دون مسارات التزلج. يشمل ذلك الطرق التي يتم إعدادها بواسطة عربة ثلجية أصغر مع زحلقة مرنة ومسارات مصنوعة يدوياً بواسطة المتزلجين. الصعوبة المفضلة From a9cc73f3fa74b8b039240e8c90f910a064bd4a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Babos=20G=C3=A1bor?= Date: Tue, 9 Feb 2021 17:58:50 +0000 Subject: [PATCH 27/44] Translated using Weblate (Hungarian) Currently translated at 99.9% (3889 of 3891 strings) --- OsmAnd/res/values-hu/phrases.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index b4ca7f9b08..b8a0cd6817 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -54,7 +54,7 @@ Autógumi-szerelő Autómosó Benzinkút;Töltőállomás;Gázolajtöltő-állomás - Elektromos töltőállomás + Elektromos töltőállomás;Elektromos autó töltése;Villanyautó töltése;Elektromos töltőpont Sűrített levegő Parkoló Motorkerékpár-parkoló @@ -3879,4 +3879,14 @@ Denevéralagút Denevérhíd Vadátjáró + Csúcsnapló nincs + Csúcsnapló van + Hegyi mentő nincs + Hegyi mentő van + Erdei pálya + Mozgó könyvtár tartózkodási helye + Pálya állapota: zárva + Pálya állapota: nyitva + Pálya neve + Síugrósánc \ No newline at end of file From 162182a8ee2b91af8efad9d04ed4b7e7985fdf01 Mon Sep 17 00:00:00 2001 From: Skalii Date: Wed, 10 Feb 2021 12:30:09 +0200 Subject: [PATCH 28/44] fix for future use when new track recording starts --- .../net/osmand/plus/track/GpxBlockStatisticsBuilder.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java index 2f11a6136a..7d7b911078 100644 --- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java +++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java @@ -100,12 +100,15 @@ public class GpxBlockStatisticsBuilder { GPXFile gpxFile = getGPXFile(); GpxDisplayItem gpxDisplayItem = null; GPXTrackAnalysis analysis = null; + boolean withoutGaps = false; if (gpxFile.tracks.size() > 0) { gpxDisplayItem = getDisplayItem(gpxFile); - analysis = gpxDisplayItem.analysis; } - if (gpxDisplayItem != null && analysis != null) { - boolean withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack(); + if (gpxDisplayItem != null) { + analysis = gpxDisplayItem.analysis; + withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack(); + } + if (analysis != null) { float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance; float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan; String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); From 32509e40ced42d824bfe59b9d91601191aea43a1 Mon Sep 17 00:00:00 2001 From: androiddevkotlin <64539346+androiddevkotlin@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:33:57 +0200 Subject: [PATCH 29/44] scrollbars="none" --- OsmAnd/res/layout/wpt_list_item.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/layout/wpt_list_item.xml b/OsmAnd/res/layout/wpt_list_item.xml index db24c056ac..1c018bd5d7 100644 --- a/OsmAnd/res/layout/wpt_list_item.xml +++ b/OsmAnd/res/layout/wpt_list_item.xml @@ -103,6 +103,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" + android:scrollbars="none" android:textColor="@color/wikivoyage_secondary_text" android:textSize="@dimen/default_sub_text_size" osmand:typeface="@string/font_roboto_regular" From aa81622bb90318020c084174199ccad9fbfd73ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 10 Feb 2021 10:25:03 +0000 Subject: [PATCH 30/44] Translated using Weblate (Turkish) Currently translated at 100.0% (3674 of 3674 strings) --- OsmAnd/res/values-tr/strings.xml | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 1f9d208ac4..cdb2e6571f 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -2227,7 +2227,7 @@ İşaretleyicilerinizi şu GPX dosyasına aktarın: Haritada yön gösterici okları göster OsmAnd seçilmiş profil için rotalı noktalara bağlanacak. - Lütfen en az bir nokta ekleyiniz. + Lütfen en az bir nokta ekleyin. Haritayı görüntüle ve nokta ekle Kaydedilmiş izlenen yolları aylık klasörlerde depola Resimleri göndericiye, tarihe ya da türüne göre filtreleyin. Sadece yakın mesafe yakınlaştırmasında etkin. @@ -3738,7 +3738,7 @@ Koyu Son düzenleme Yolu içe aktar - Mevcut yolu aç + Var olan yolu aç Yeni güzergah oluştur Açmak için bir yol dosyası seçin. Bitti @@ -3968,7 +3968,7 @@ Klasör seç Klasör seçin veya yeni bir tane ekleyin Boş - Aralıklara göre analiz et (bölme aralığı) + Bölünmüş aralıkları analiz et OpenStreetMap\'e yükle Yolu düzenle Yolu yeniden adlandır @@ -4012,4 +4012,26 @@ %1$d / %2$d karşıya yükleniyor %1$d / %2$d karşıya yüklendi Karşıya yüklenecek düzenlemeleri seçin + tepe gölgesi / yamaç / eş yükselti eğrileri + OpenPlaceReviews, restoranlar, oteller, müzeler, ara noktalar gibi halka açık yerler hakkında topluluk tarafından yürütülen bir projedir. Fotoğraflar, yorumlar, OpenStreetMap, Wikipedia gibi diğer sistemlere bağlantılar gibi onlar hakkındaki tüm halka açık bilgileri toplar. +\n +\nTüm OpenPlaceReview verileri açık ve herkes tarafından kullanılabilir: http://openplacereviews.org/data +\n +\nDaha fazlasını şu adresten okuyabilirsiniz: http://openplacereviews.org + OpenPlaceReviews + test.openplacereviews.org adresini kullan + OpenPlaceReviews\'te oturum aç + Su + Kış + Kar arabası + Binme + Yarış + Dağ bisikleti + Bisiklet sürme + Yürüyüş + Koşma + Yürüme + Arazi + Motosiklet + Araba \ No newline at end of file From 75379bc9d451b17dd4e8bbcd9ef53bb6a30940ed Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 10 Feb 2021 10:33:12 +0000 Subject: [PATCH 31/44] Translated using Weblate (Arabic) Currently translated at 100.0% (3674 of 3674 strings) --- OsmAnd/res/values-ar/strings.xml | 70 ++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 6952e1c6c8..b0ea31530a 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -359,7 +359,7 @@ برنامج عرض الخرائط العالمية والملاحة باستخدام خرائط الشوارع المفتوحة OSM أثناء الاتصال بالإنترنت أو من دونه أوسماند+ للخرائط و الملاحة برنامج عرض الخرائط العالمية والملاحة باستخدام خرائط الشوارع المفتوحة OSM أثناء الاتصال بالإنترنت أو من دونه - أنشئ مُرشِّح نقاط مهمة + إنشاء فلتر نقاط الاهتمام نمط المواصلات: وسائل النقل: الشروق: %1$s @@ -1830,7 +1830,7 @@ ملاحظة OSM معلق عليها مسار زلق لإظهار خرائط التزلج، يجب تحميل خريطة خاصة محلية. - حافلة، ترامواي وغيرها + حافلة، عربة وغيرها إنشاء ملاحظة OSM حدث استثناء: لم يتم إنشاء الملاحظة. حدث استثناء: لم يتم غلق الملاحظة. @@ -2071,7 +2071,7 @@ اللون والسمك خذ المخرج %1$d ثم واصل المدينة أو المنطقة - مقالات ويكيبيديا قريبة + مقالات ويكيبيديا القريبة استخدام الطرق السريعة السماح للطرق السريعة. الصربية (اللاتينية) @@ -2218,18 +2218,19 @@ حدد مجلد المسار المسارات الوقت - التغطية التقريبية للخريطة و جودتها : -\n• أوروبا الغربية : **** -\n• أوروبا الشرقية : *** -\n• روسيا : *** -\n• أمريكا الشمالية : *** -\n• امريكا الجنوبية : ** -\n• آسيا : ** -\n• اليابان وكوريا : *** -\n• الشرق الأوسط : ** -\n• إفريقيا : ** -\n• أنتاركتيكا : * -\n معظم البلدان في جميع أنحاء العالم متاحة للتنزيل ! من أفغانستان إلى زيمبابوي، من أستراليا إلى الولايات المتحدة الأمريكية. الأرجنتين، البرازيل، كندا، فرنسا، ألمانيا، المكسيك، المملكة المتحدة، إسبانيا + التغطية التقريبية للخريطة و جودتها: +\n • أوروبا الغربية: **** +\n • أوروبا الشرقية: *** +\n • روسيا: *** +\n • أمريكا الشمالية: *** +\n • امريكا الجنوبية: ** +\n • آسيا: ** +\n • اليابان وكوريا: *** +\n • الشرق الأوسط : ** +\n • إفريقيا: ** +\n • أنتاركتيكا: * +\n معظم البلدان في جميع أنحاء العالم متاحة للتنزيل +\n من أفغانستان إلى زيمبابوي، من أستراليا إلى الولايات المتحدة الأمريكية. الأرجنتين، البرازيل، كندا، فرنسا، ألمانيا، المكسيك، المملكة المتحدة، أسبانيا , … \n إعادة البحث المساهمة في OSM @@ -2370,13 +2371,14 @@ \nأوسماند بلس هو إصدار للتطبيق مدفوع الأجر. قبل شرائه، ادعم المشروع، بتمويل لتطوير الميزات الجديدة والحصول على آخر التحديثات. \n \n بعض الميزات الرئيسية: - الملاحة -\n• يعمل على الإنترنت (سريع) أو في وضع غير متصل (لا رسوم تجوال خارج الوطن) -\n• توجيه صوتي بالتفصيل (الأصوات المسجلة أو مدرجة) -\n• موجه مسار اختياري، عرض اسم الشارع، والوقت المقدر للوصول -\n• يدعم نقاط وسيطة خلال مسارك -\n• إعادة تلقائية للتوجيه كلما انحرفت عن الطريق -\n• البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية + الملاحة +\n • يعمل على الإنترنت (سريع) أو في وضع غير متصل (لا رسوم تجوال خارج الوطن) +\n • توجيه صوتي بالتفصيل (الأصوات المسجلة أو مدرجة) +\n • موجه مسار اختياري، عرض اسم الشارع، والوقت المقدر للوصول +\n • يدعم نقاط وسيطة خلال مسارك +\n • إعادة تلقائية للتوجيه كلما انحرفت عن الطريق +\n • البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية +\n عرض الخريطة \n• عرض موقعك والتوجيه \n• محاذاة اختيارية للصورة وفق البوصلة أو توجيه الحركة @@ -2417,7 +2419,8 @@ اسم الاختصار السريع المحدد قيد الاستخدام، لقد تم تغييره إلى %1$s لتجنب التكرار. الضغط على زر الإجراء سيطبق أحد الأنماط من القائمة أدناه. تنقلاتك على هذا الطريق - OLC الصالحة بالكامل تمثل المنطقة: %1$s x %2$s + الصالحة بالكامل OLC +\nيمثل المنطقة: %1$s x %2$s اسم المستخدم خاطئ إلى مِن @@ -2615,7 +2618,7 @@ ج ش اسم النقطة - الطرق القريبة التي في الداخل + الطرق الداخلية المجاورة أدخل اسم الملف. خطأ أثناء استرجاع الخريطة تمت عملية استيراد الخريطة @@ -3334,7 +3337,7 @@ السماح بطرق المتخصصين طرق صعبة للغاية ، مع عقبات خطيرة والمناطق المحيطة بها. السماح بالتزلج على الطرق فقط - الطريق مصممة خصيصا بحرية أو التزلج على الجليد. + طرق مصممة للأسلوب الحر أو التزلج فقط بدون المسارات الكلاسيكية. السماح للطرق الكلاسيكية فقط تم إعداد الطرق للأسلوب الكلاسيكي فقط دون مسارات التزلج. يشمل ذلك الطرق التي يتم إعدادها بواسطة عربة ثلجية أصغر مع زحلقة مرنة ومسارات مصنوعة يدوياً بواسطة المتزلجين. الصعوبة المفضلة @@ -3840,7 +3843,7 @@ نقطة المسار للتنقل بداية المسار أقرب نقطة - إرفاق الطرق + إرفاق بالطرق حذف عنوان إضافة عنوان أدخل العنوان @@ -3863,7 +3866,7 @@ فتح المسار المحفوظ محفوظ مسار مبسط - سيتم حفظ خط التوجيه فقط، وسيتم حذف نقاط الطريق. + سيتم حفظ خط الطريق فقط، وسيتم حذف نقاط المسار. اسم الملف الرجاء إضافة نقطتين على الأقل. إعادة @@ -4082,4 +4085,17 @@ OpenPlaceReviews استخدام test.openplacereviews.org الدخول إلى OpenPlaceReviews + ماء + شتاء + الثلج + ركوب + سباق + دراجة جبلية + دراجة + مشي + الجري + مشي + الطرق الوعرة + دراجة نارية + سيارة \ No newline at end of file From fdf881c070f98d6e0ba1337edf5525279dfb4a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 10 Feb 2021 10:20:20 +0000 Subject: [PATCH 32/44] Translated using Weblate (Turkish) Currently translated at 83.1% (3234 of 3891 strings) --- OsmAnd/res/values-tr/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml index b76cd1cada..5c3b4f7a6c 100644 --- a/OsmAnd/res/values-tr/phrases.xml +++ b/OsmAnd/res/values-tr/phrases.xml @@ -502,7 +502,7 @@ Tırmanma Kriket Kroket - Bisiklete binme + Bisiklet sürme Dalış Tüplü dalış Köpek yarışı From ff1b4fa9122b011bc8fc8e897f3d66bbb24d1c1a Mon Sep 17 00:00:00 2001 From: Verdulo Date: Wed, 10 Feb 2021 10:41:23 +0000 Subject: [PATCH 33/44] Translated using Weblate (Esperanto) Currently translated at 99.9% (3888 of 3891 strings) --- OsmAnd/res/values-eo/phrases.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index fd389f4538..2af7eb4454 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -3881,4 +3881,11 @@ Ponto por vespertoj Trairejo por sovaĝaj bestoj Naĝejo natura + Stato de skivojo: fermita + Stato de skivojo: malfermita + Kontrolata: ne + Kontrolata: jes + Senarbigita: jes + Nomo de skivojo + Skisaltejo \ No newline at end of file From c50a671021ed91c0d2719631451484c4c4024ecb Mon Sep 17 00:00:00 2001 From: Skalii Date: Wed, 10 Feb 2021 13:07:36 +0200 Subject: [PATCH 34/44] fix for future use when new track recording starts p2 --- OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java index 7d7b911078..0e005b0d8c 100644 --- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java +++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java @@ -100,7 +100,7 @@ public class GpxBlockStatisticsBuilder { GPXFile gpxFile = getGPXFile(); GpxDisplayItem gpxDisplayItem = null; GPXTrackAnalysis analysis = null; - boolean withoutGaps = false; + boolean withoutGaps = true; if (gpxFile.tracks.size() > 0) { gpxDisplayItem = getDisplayItem(gpxFile); } From 3979b6ab16f3a0fab3cc54257443e280ccef88b4 Mon Sep 17 00:00:00 2001 From: androiddevkotlin <64539346+androiddevkotlin@users.noreply.github.com> Date: Wed, 10 Feb 2021 13:29:17 +0200 Subject: [PATCH 35/44] Update gpx_track_item.xml --- OsmAnd/res/layout/gpx_track_item.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/layout/gpx_track_item.xml b/OsmAnd/res/layout/gpx_track_item.xml index 54dd3e9161..69bfbb6119 100644 --- a/OsmAnd/res/layout/gpx_track_item.xml +++ b/OsmAnd/res/layout/gpx_track_item.xml @@ -37,6 +37,7 @@ android:layout_marginRight="@dimen/dialog_content_margin" android:layout_marginEnd="@dimen/dialog_content_margin" android:clickable="false" + android:scrollbars="none" android:focusableInTouchMode="false" /> Date: Wed, 10 Feb 2021 12:52:51 +0000 Subject: [PATCH 36/44] Translated using Weblate (Chinese (Simplified)) Currently translated at 69.4% (2550 of 3674 strings) --- OsmAnd/res/values-zh-rCN/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 9550f1fb9c..04e0d0a0f0 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -2663,7 +2663,7 @@ 旅游书 下载图片 黑色 - + 木头 地铁 骑马 品红色 @@ -2839,7 +2839,7 @@ 显示关闭的注记 关闭的OSM注记 添加在线资源 - + 驮道 砾石 比利时石砌路 允许专家路线 From 6a532846e5e5e090ae023e5c078726dbceedd478 Mon Sep 17 00:00:00 2001 From: Liu Tao Date: Wed, 10 Feb 2021 12:50:32 +0000 Subject: [PATCH 37/44] Translated using Weblate (Chinese (Simplified)) Currently translated at 69.4% (2550 of 3674 strings) --- OsmAnd/res/values-zh-rCN/strings.xml | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 04e0d0a0f0..137c034f83 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -3124,4 +3124,79 @@ 添加轨迹航点 将轨迹记录到GPX文件 当应用程序被杀死时,跟踪日志将被暂停(通过最近的应用程序)。(OsmAnd背景指示会从Android通知栏中消失)。 + 添加在线路线引擎 + 编辑在线路线引擎 + 子类型 + 车辆 + API 密钥 + 服务器 URL + 输入参数 + 否则请保持空白 + 测试路线计算 + 驾驶 + 汽车 + 复制地址 + 在线路线引擎 + 在线路线引擎 + 文件夹 + 选择文件夹 + 选择文件夹或添加新文件夹 + 上传到 OpenStreetMap + 编辑轨迹 + 重命名轨迹 + 更改文件夹 + + 通过 + 长时间准备 + 准备 + 偏离路线 + 到达目的地 + 转弯 + 时间和距离间隔 + 不同语音提示的公告时间取决于提示类型、当前导航速度和默认导航速度。 + 公告时间 + 开始录制 + 在地图上显示轨迹 + 轮椅 + 徒步 + 步行 + 电动自行车 + 山地自行车 + 公路自行车 + 重型货车 + 小型卡车 + 卡车 + 踏板车 + 竞速自行车 + 山地车 + 服务器错误:%1$s + 删除这个在线路线引擎? + 名字已经存在 + 阅读全文 + 编辑描述 + 删除航点 + 复制到地图标记 + 复制到收藏 + 上传中 + 上传完成 + 正在上传 %1$d,共 %2$d + 选择要上传的编辑 + 已上传 %1$d,共 %2$d + 山体阴影/斜坡/等高线 + OpenPlaceReviews 是一个社区驱动的项目,关于公共场所,如餐馆,酒店,博物馆,航点。它收集了所有关于它们的公共信息,如照片、评论、链接到其他系统的 OpenStreetMap、维基百科。 +\n +\n所有 OpenPlaceReview 的数据都是开放的,所有人都可以使用:http://openplacereviews.org/data。 +\n +\n你可以在以下网站阅读更多信息:http://openplacereviews.org + OpenPlaceReviews + 使用 test.openplacereviews.org + 登录 OpenPlaceReviews + 冬季 + 雪地摩托 + 骑行 + 骑车 + 健行 + 跑步 + 步行 + 摩托车 \ No newline at end of file From 2f6f362217f5390e692d95c6f9c84d4b641d7126 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Wed, 10 Feb 2021 11:05:32 +0000 Subject: [PATCH 38/44] Translated using Weblate (French) Currently translated at 99.8% (3669 of 3674 strings) --- OsmAnd/res/values-fr/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 1f8808c5dc..33f448572b 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -4005,4 +4005,13 @@ OpenPlaceReviews Utilisez test.openplacereviews.org Se connecter à OpenPlaceReviews + Eau + Hiver + Motoneige + Vélo + VTT + Randonnée + Course à pied + Marche + Voiture \ No newline at end of file From 3004acacef1db17b934ce416e30000754064787c Mon Sep 17 00:00:00 2001 From: Verdulo Date: Wed, 10 Feb 2021 11:06:41 +0000 Subject: [PATCH 39/44] Translated using Weblate (Esperanto) Currently translated at 100.0% (3674 of 3674 strings) --- OsmAnd/res/values-eo/strings.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index da7a929cf2..def12120ad 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -4020,4 +4020,17 @@ OpenPlaceReviews Uzi test.openplacereviews.org Ensaluti al OpenPlaceReviews + Akvo + Vintro + Motorsledo + Rajdado + Kurkonkurso + Montbiciklo + Biciklado + Marŝado + Kurado + Piedirado + Ekstervoje + Motorciklo + Aŭto \ No newline at end of file From a5c0abd1c44e3fc8c890bf758b9189e89500d833 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Wed, 10 Feb 2021 10:46:14 +0000 Subject: [PATCH 40/44] Translated using Weblate (Esperanto) Currently translated at 100.0% (3891 of 3891 strings) --- OsmAnd/res/values-eo/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index 2af7eb4454..a6ca5bed0f 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -3888,4 +3888,7 @@ Senarbigita: jes Nomo de skivojo Skisaltejo + Movebla biblioteko (haltloko) + Pint‑taglibro: ne + Pint‑taglibro: jes \ No newline at end of file From 22241d2956ec9742b528771e272fba466c40789a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Wed, 10 Feb 2021 11:15:45 +0000 Subject: [PATCH 41/44] Translated using Weblate (Icelandic) Currently translated at 99.9% (3673 of 3674 strings) --- OsmAnd/res/values-is/strings.xml | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index ebb0385e37..4b92baf978 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3972,7 +3972,7 @@ Veldu möppu Veldu möppu eða bættu við nýrri Tómt - Greina eftir millibilum (uppskipting millibila) + Greina eftir uppskiptingu millibila Senda inn í OpenStreetMap Breyta ferli Endurnefna feril @@ -4005,4 +4005,32 @@ Fjallahjól Villa í netþjóni: %1$s Nafnið er þegar til staðar + Eyða þessari leiðagerð á netinu\? + Lesa óstytt + Breyta lýsingu + Eyða ferilpunktum + Afrita í kortamerki + Afrita í eftirlæti + Sendi inn + Innsendingu er lokið + Sendi inn %1$d af %2$d + Sent inn %1$d af %2$d + Veldu breytingar til að senda inn + Hæðaskygging / Halli / Hæðarlínur + OpenPlaceReviews + Nota test.openplacereviews.org + Skrá inn á OpenPlaceReviews + Vatn + Vetur + Vélsleðar + Útreiðar + Kappakstur + Fjallahjól + Hjólreiðar + Gönguferðir + Hlaup + Gangandi + Utanvegaakstur + Vélhjól + Akandi \ No newline at end of file From 5117056ec79cdcb5637e3e35f4f60413f6755873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Wed, 10 Feb 2021 11:13:37 +0000 Subject: [PATCH 42/44] Translated using Weblate (Icelandic) Currently translated at 100.0% (3891 of 3891 strings) --- OsmAnd/res/values-is/phrases.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index e2ee6f1cb3..459a777d6c 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -3881,4 +3881,14 @@ Brú fyrir leðurblökur Þverun villtra dýra Sundsvæði + Stæði fyrir bókabíl + Skráning á tind: nei + Skráning á tind: já + Staða brautar: lokuð + Staða brautar: opin + Eftirlit: nei + Eftirlit: já + Skafið: já + Heiti brautar + Skíðastökk \ No newline at end of file From 5ab2b0319cf6f12e47b8d08b52c57370292847a8 Mon Sep 17 00:00:00 2001 From: One Two Date: Wed, 10 Feb 2021 12:53:48 +0000 Subject: [PATCH 43/44] Translated using Weblate (Chinese (Simplified)) Currently translated at 69.4% (2550 of 3674 strings) --- OsmAnd/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 137c034f83..97e514b125 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -2674,7 +2674,7 @@ 兴趣点(POI) 容量 金属 - 路径 + 走道 直升机 滑雪 滑雪 From 8c92c3f87c6a36b70ea1e8ab3ff1a85d04f5fb4a Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Wed, 10 Feb 2021 18:18:37 +0200 Subject: [PATCH 44/44] Fix review --- .../plus/wikivoyage/data/TravelArticle.java | 22 +++++++- .../plus/wikivoyage/data/TravelDbHelper.java | 8 +-- .../plus/wikivoyage/data/TravelHelper.java | 7 +-- .../plus/wikivoyage/data/TravelObfHelper.java | 54 ++++++++++--------- .../explore/ExploreTabFragment.java | 2 +- .../explore/WikivoyageExploreActivity.java | 10 ++-- 6 files changed, 62 insertions(+), 41 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java index 952b85be4d..a346f496eb 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java @@ -169,6 +169,26 @@ public class TravelArticle { return new String[]{md5.substring(0, 1), md5.substring(0, 2)}; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TravelArticle that = (TravelArticle) o; + return TravelArticleIdentifier.areLatLonEqual(that.lat, that.lon, lat, lon) && + Algorithms.objectEquals(file, that.file) && + Algorithms.stringsEqual(routeId, that.routeId) && + Algorithms.stringsEqual(routeSource, that.routeSource); + } + + @Override + public int hashCode() { + return Algorithms.hash(file, lat, lon, routeId, routeSource); + } + public static class TravelArticleIdentifier implements Parcelable { @Nullable File file; double lat; @@ -249,7 +269,7 @@ public class TravelArticle { return Algorithms.hash(file, lat, lon, routeId, routeSource); } - private static boolean areLatLonEqual(double lat1, double lon1, double lat2, double lon2) { + public static boolean areLatLonEqual(double lat1, double lon1, double lat2, double lon2) { boolean latEqual = (Double.isNaN(lat1) && Double.isNaN(lat2)) || Math.abs(lat1 - lat2) < 0.00001; boolean lonEqual = (Double.isNaN(lon1) && Double.isNaN(lon2)) || Math.abs(lon1 - lon2) < 0.00001; return latEqual && lonEqual; diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java index 90ed62569f..0fc6c232f9 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java @@ -174,7 +174,7 @@ public class TravelDbHelper implements TravelHelper { } @Override - public void initializeDataToDisplay() { + public void initializeDataToDisplay(boolean resetData) { localDataHelper.refreshCachedData(); loadPopularArticles(); } @@ -549,13 +549,13 @@ public class TravelDbHelper implements TravelHelper { @Override @Nullable - public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, String lang, boolean readGpx, @Nullable GpxReadCallback callback) { + public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle res = null; SQLiteConnection conn = openConnection(); String routeId = articleId.routeId; - if (conn != null && !Algorithms.isEmpty(routeId)) { + if (conn != null && !Algorithms.isEmpty(routeId) && lang != null) { SQLiteCursor cursor = conn.rawQuery(ARTICLES_TABLE_SELECT + " WHERE " + ARTICLES_COL_TRIP_ID + " = ? AND " - + ARTICLES_COL_LANG + " = ?", new String[] { routeId, lang }); + + ARTICLES_COL_LANG + " = ?", new String[]{routeId, lang}); if (cursor != null) { if (cursor.moveToFirst()) { res = readArticle(cursor); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java index b8bb9cdf98..7e89431690 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java @@ -25,7 +25,7 @@ public interface TravelHelper { void initializeDataOnAppStartup(); - void initializeDataToDisplay(); + void initializeDataToDisplay(boolean resetData); boolean isAnyTravelBookPresent(); @@ -35,14 +35,11 @@ public interface TravelHelper { @NonNull List getPopularArticles(); - @NonNull - List loadPopularArticles(); - @NonNull Map> getNavigationMap(@NonNull TravelArticle article); @Nullable - TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, boolean readGpx, @Nullable GpxReadCallback callback); + TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, boolean readGpx, @Nullable GpxReadCallback callback); @Nullable TravelArticle getArticleByTitle(@NonNull String title, @NonNull String lang, boolean readGpx, @Nullable GpxReadCallback callback); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java index 036ba50bbb..b15b157089 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java @@ -80,9 +80,8 @@ public class TravelObfHelper implements TravelHelper { private final Map> cachedArticles = new ConcurrentHashMap<>(); private final TravelLocalDataHelper localDataHelper; private int searchRadius = ARTICLE_SEARCH_RADIUS; - private int count = 0; - private int page = 0; - final List> amenities = new ArrayList<>(); + private int foundAmenitiesIndex = 0; + private final List> foundAmenities = new ArrayList<>(); public TravelObfHelper(OsmandApplication app) { this.app = app; @@ -100,7 +99,13 @@ public class TravelObfHelper implements TravelHelper { } @Override - public void initializeDataToDisplay() { + public void initializeDataToDisplay(boolean resetData) { + if (resetData) { + foundAmenities.clear(); + foundAmenitiesIndex = 0; + popularArticles.clear(); + searchRadius = ARTICLE_SEARCH_RADIUS; + } localDataHelper.refreshCachedData(); loadPopularArticles(); } @@ -108,19 +113,19 @@ public class TravelObfHelper implements TravelHelper { @NonNull public synchronized List loadPopularArticles() { String lang = app.getLanguage(); - List popularArticles = new ArrayList<>(); - if (amenities.size() - count < MAX_POPULAR_ARTICLES_COUNT) { + List popularArticles = new ArrayList<>(this.popularArticles); + if (foundAmenities.size() - foundAmenitiesIndex < MAX_POPULAR_ARTICLES_COUNT) { final LatLon location = app.getMapViewTrackingUtilities().getMapLocation(); for (final BinaryMapIndexReader reader : getReaders()) { try { - searchAmenity(amenities, location, reader, searchRadius, -1, ROUTE_ARTICLE); - searchAmenity(amenities, location, reader, searchRadius / 5, 15, ROUTE_TRACK); + searchAmenity(foundAmenities, location, reader, searchRadius, -1, ROUTE_ARTICLE); + searchAmenity(foundAmenities, location, reader, searchRadius / 5, 15, ROUTE_TRACK); } catch (Exception e) { LOG.error(e.getMessage(), e); } } - if (amenities.size() > 0) { - Collections.sort(amenities, new Comparator>() { + if (foundAmenities.size() > 0) { + Collections.sort(foundAmenities, new Comparator>() { @Override public int compare(Pair article1, Pair article2) { Amenity amenity1 = (Amenity) article1.second; @@ -136,22 +141,21 @@ public class TravelObfHelper implements TravelHelper { searchRadius *= 2; } - int lastIndex; - for (lastIndex = count; lastIndex < amenities.size() - 1; lastIndex++) { - Pair amenity = amenities.get(lastIndex); + int pagesCount = popularArticles.size() / MAX_POPULAR_ARTICLES_COUNT; + while (foundAmenitiesIndex < foundAmenities.size() - 1) { + Pair amenity = foundAmenities.get(foundAmenitiesIndex); if (!Algorithms.isEmpty(amenity.second.getName(lang))) { TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null); - if (article != null) { + if (article != null && !popularArticles.contains(article)) { popularArticles.add(article); - this.popularArticles.add(article); - if (this.popularArticles.size() >= (page + 1) * MAX_POPULAR_ARTICLES_COUNT) { - page++; + if (popularArticles.size() >= (pagesCount + 1) * MAX_POPULAR_ARTICLES_COUNT) { break; } } } + foundAmenitiesIndex++; } - count = ++lastIndex; + this.popularArticles = popularArticles; return popularArticles; } @@ -184,10 +188,8 @@ public class TravelObfHelper implements TravelHelper { } if (!Algorithms.isEmpty(articles)) { TravelArticleIdentifier newArticleId = articles.values().iterator().next().generateIdentifier(); - if (!cachedArticles.containsKey(newArticleId)) { - cachedArticles.put(newArticleId, articles); - article = getCachedArticle(newArticleId, lang, readPoints, callback); - } + cachedArticles.put(newArticleId, articles); + article = getCachedArticle(newArticleId, lang, readPoints, callback); } return article; } @@ -628,8 +630,8 @@ public class TravelObfHelper implements TravelHelper { } @Override - public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, - boolean readGpx, @Nullable GpxReadCallback callback) { + public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, + boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle article = getCachedArticle(articleId, lang, readGpx, callback); if (article == null) { article = localDataHelper.getSavedArticle(articleId.file, articleId.routeId, lang); @@ -641,8 +643,8 @@ public class TravelObfHelper implements TravelHelper { } @Nullable - private TravelArticle getCachedArticle(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, - boolean readGpx, @Nullable GpxReadCallback callback) { + private TravelArticle getCachedArticle(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, + boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle article = null; Map articles = cachedArticles.get(articleId); if (articles != null) { diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java index 9afa7a33c3..ff692f8f1c 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreTabFragment.java @@ -192,7 +192,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv @Override public void onPrimaryButtonClick() { if (activity instanceof WikivoyageExploreActivity) { - new LoadWikivoyageData((WikivoyageExploreActivity) activity).execute(); + new LoadWikivoyageData((WikivoyageExploreActivity) activity,false).execute(); } } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java index 3191926522..bc4de7d575 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java @@ -326,12 +326,12 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv public void onFinish(AppInitializer init) { WikivoyageExploreActivity activity = activityRef.get(); if (AndroidUtils.isActivityNotDestroyed(activity)) { - new LoadWikivoyageData(activity).execute(); + new LoadWikivoyageData(activity,true).execute(); } } }); } else { - new LoadWikivoyageData(this).execute(); + new LoadWikivoyageData(this,true).execute(); } } @@ -384,15 +384,17 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv private final WeakReference activityRef; private final TravelHelper travelHelper; + private final boolean resetData; - LoadWikivoyageData(WikivoyageExploreActivity activity) { + LoadWikivoyageData(WikivoyageExploreActivity activity, boolean resetData) { travelHelper = activity.getMyApplication().getTravelHelper(); activityRef = new WeakReference<>(activity); + this.resetData = resetData; } @Override protected Void doInBackground(Void... params) { - travelHelper.initializeDataToDisplay(); + travelHelper.initializeDataToDisplay(resetData); return null; }