Sort travel GPX card and travel article, UI
This commit is contained in:
parent
ac66073e12
commit
a914efaa28
4 changed files with 184 additions and 86 deletions
|
@ -10,17 +10,13 @@
|
||||||
android:id="@+id/background_view"
|
android:id="@+id/background_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/content_padding_small"
|
android:background="?attr/wikivoyage_card_bg_color">
|
||||||
android:layout_marginStart="@dimen/content_padding"
|
|
||||||
android:layout_marginEnd="@dimen/content_padding"
|
|
||||||
android:background="?attr/wikivoyage_travel_card_bg">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?attr/selectableItemBackground"
|
android:background="?attr/selectableItemBackground"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingBottom="@dimen/bottom_sheet_content_padding_small"
|
|
||||||
android:paddingTop="@dimen/content_padding">
|
android:paddingTop="@dimen/content_padding">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -75,6 +71,14 @@
|
||||||
osmand:srcCompat="@drawable/ic_action_distance_16"
|
osmand:srcCompat="@drawable/ic_action_distance_16"
|
||||||
android:contentDescription="@string/distance"/>
|
android:contentDescription="@string/distance"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="16dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginEnd="@dimen/content_padding_half"
|
||||||
|
android:layout_marginRight="@dimen/content_padding_half"
|
||||||
|
android:background="?attr/wikivoyage_card_divider_color" />
|
||||||
|
|
||||||
<net.osmand.plus.widgets.TextViewEx
|
<net.osmand.plus.widgets.TextViewEx
|
||||||
android:id="@+id/diff_ele_down"
|
android:id="@+id/diff_ele_down"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -94,10 +98,18 @@
|
||||||
android:layout_marginRight="@dimen/content_padding_half"
|
android:layout_marginRight="@dimen/content_padding_half"
|
||||||
android:layout_marginStart="@dimen/content_padding_half"
|
android:layout_marginStart="@dimen/content_padding_half"
|
||||||
android:layout_marginLeft="@dimen/content_padding_half"
|
android:layout_marginLeft="@dimen/content_padding_half"
|
||||||
osmand:srcCompat="@drawable/ic_action_distance_16"
|
osmand:srcCompat="@drawable/ic_action_arrow_down_16"
|
||||||
android:tint="@color/icon_color_default_light"
|
android:tint="@color/icon_color_default_light"
|
||||||
android:contentDescription="@string/distance" />
|
android:contentDescription="@string/distance" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="16dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginEnd="@dimen/content_padding_half"
|
||||||
|
android:layout_marginRight="@dimen/content_padding_half"
|
||||||
|
android:background="?attr/wikivoyage_card_divider_color" />
|
||||||
|
|
||||||
<net.osmand.plus.widgets.TextViewEx
|
<net.osmand.plus.widgets.TextViewEx
|
||||||
android:id="@+id/diff_ele_up"
|
android:id="@+id/diff_ele_up"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -117,30 +129,58 @@
|
||||||
android:layout_marginRight="@dimen/content_padding_half"
|
android:layout_marginRight="@dimen/content_padding_half"
|
||||||
android:layout_marginStart="@dimen/content_padding_half"
|
android:layout_marginStart="@dimen/content_padding_half"
|
||||||
android:layout_marginLeft="@dimen/content_padding_half"
|
android:layout_marginLeft="@dimen/content_padding_half"
|
||||||
osmand:srcCompat="@drawable/ic_action_distance_16"
|
osmand:srcCompat="@drawable/ic_action_arrow_up_16"
|
||||||
android:tint="@color/icon_color_default_light"
|
android:tint="@color/icon_color_default_light"
|
||||||
android:contentDescription="@string/distance" />
|
android:contentDescription="@string/distance" />
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:id="@+id/content"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingTop="@dimen/content_padding_half"
|
||||||
|
android:paddingBottom="@dimen/content_padding_small">
|
||||||
|
|
||||||
|
<net.osmand.plus.widgets.TextViewEx
|
||||||
|
android:id="@+id/user_name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/btn_border_bg_light"
|
||||||
|
android:gravity="center_vertical"
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:maxLines="3"
|
android:maxLines="1"
|
||||||
|
android:paddingTop="@dimen/subHeaderPadding"
|
||||||
|
android:paddingBottom="@dimen/subHeaderPadding"
|
||||||
|
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
|
||||||
|
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
|
||||||
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
|
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
|
||||||
android:textColor="@null"
|
android:textColor="?attr/active_color_basic"
|
||||||
tools:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard." />
|
android:textSize="@dimen/default_desc_text_size"
|
||||||
|
osmand:typeface="@string/font_roboto_medium"
|
||||||
|
android:drawablePadding="@dimen/content_padding_small_half"
|
||||||
|
android:drawableStart="@drawable/ic_action_user_account_16"
|
||||||
|
android:drawableLeft="@drawable/ic_action_user_account_16"
|
||||||
|
tools:drawableTint="?attr/wikivoyage_active_color"
|
||||||
|
tools:text="Lorem Ipsum" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:visibility="invisible"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:background="?attr/wikivoyage_card_divider_color" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="@dimen/content_padding_small_half"
|
||||||
|
android:paddingBottom="@dimen/content_padding_small_half">
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -159,10 +199,10 @@
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:paddingBottom="@dimen/context_menu_padding_margin_tiny"
|
android:paddingBottom="@dimen/content_padding_half"
|
||||||
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
|
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
|
||||||
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
|
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
|
||||||
android:paddingTop="@dimen/context_menu_padding_margin_tiny"
|
android:paddingTop="@dimen/content_padding_half"
|
||||||
android:textColor="?attr/wikivoyage_active_color"
|
android:textColor="?attr/wikivoyage_active_color"
|
||||||
android:textSize="@dimen/default_desc_text_size"
|
android:textSize="@dimen/default_desc_text_size"
|
||||||
osmand:typeface="@string/font_roboto_medium"
|
osmand:typeface="@string/font_roboto_medium"
|
||||||
|
@ -198,10 +238,10 @@
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:paddingBottom="@dimen/context_menu_padding_margin_tiny"
|
android:paddingBottom="@dimen/content_padding_half"
|
||||||
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
|
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
|
||||||
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
|
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
|
||||||
android:paddingTop="@dimen/context_menu_padding_margin_tiny"
|
android:paddingTop="@dimen/content_padding_half"
|
||||||
android:textColor="?attr/wikivoyage_active_color"
|
android:textColor="?attr/wikivoyage_active_color"
|
||||||
android:textSize="@dimen/default_desc_text_size"
|
android:textSize="@dimen/default_desc_text_size"
|
||||||
osmand:typeface="@string/font_roboto_medium"
|
osmand:typeface="@string/font_roboto_medium"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package net.osmand.plus.wikivoyage.data;
|
package net.osmand.plus.wikivoyage.data;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
@ -13,7 +14,6 @@ import net.osmand.OsmAndCollator;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.ResultMatcher;
|
import net.osmand.ResultMatcher;
|
||||||
import net.osmand.binary.BinaryMapIndexReader;
|
import net.osmand.binary.BinaryMapIndexReader;
|
||||||
import net.osmand.binary.BinaryMapIndexReader.SearchPoiTypeFilter;
|
|
||||||
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
||||||
import net.osmand.data.Amenity;
|
import net.osmand.data.Amenity;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
|
@ -47,6 +47,8 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import static net.osmand.GPXUtilities.WptPt;
|
import static net.osmand.GPXUtilities.WptPt;
|
||||||
import static net.osmand.GPXUtilities.writeGpxFile;
|
import static net.osmand.GPXUtilities.writeGpxFile;
|
||||||
|
import static net.osmand.plus.helpers.GpxUiHelper.getGpxTitle;
|
||||||
|
import static net.osmand.util.Algorithms.capitalizeFirstLetter;
|
||||||
|
|
||||||
public class TravelObfHelper implements TravelHelper {
|
public class TravelObfHelper implements TravelHelper {
|
||||||
|
|
||||||
|
@ -54,8 +56,10 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
private static final String WORLD_WIKIVOYAGE_FILE_NAME = "World_wikivoyage.travel.obf";
|
private static final String WORLD_WIKIVOYAGE_FILE_NAME = "World_wikivoyage.travel.obf";
|
||||||
public static final String ROUTE_ARTICLE = "route_article";
|
public static final String ROUTE_ARTICLE = "route_article";
|
||||||
public static final String ROUTE_ARTICLE_POINT = "route_article_point";
|
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 POPULAR_ARTICLES_SEARCH_RADIUS = 100000;
|
||||||
public static final int ARTICLE_SEARCH_RADIUS = 50000;
|
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 = 100;
|
public static final int MAX_POPULAR_ARTICLES_COUNT = 100;
|
||||||
|
|
||||||
private final OsmandApplication app;
|
private final OsmandApplication app;
|
||||||
|
@ -90,16 +94,29 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
public synchronized List<TravelArticle> loadPopularArticles() {
|
public synchronized List<TravelArticle> loadPopularArticles() {
|
||||||
String lang = app.getLanguage();
|
String lang = app.getLanguage();
|
||||||
List<TravelArticle> popularArticles = new ArrayList<>();
|
List<TravelArticle> popularArticles = new ArrayList<>();
|
||||||
for (BinaryMapIndexReader reader : getReaders()) {
|
final List<Pair<File, Amenity>> amenities = new ArrayList<>();
|
||||||
try {
|
|
||||||
final LatLon location = app.getMapViewTrackingUtilities().getMapLocation();
|
final LatLon location = app.getMapViewTrackingUtilities().getMapLocation();
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(
|
for (final BinaryMapIndexReader reader : getReaders()) {
|
||||||
location, POPULAR_ARTICLES_SEARCH_RADIUS, -1, getSearchFilter(false), null);
|
try {
|
||||||
List<Amenity> amenities = reader.searchPoi(req);
|
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() > 0) {
|
if (amenities.size() > 0) {
|
||||||
for (Amenity amenity : amenities) {
|
Collections.sort(amenities, new Comparator<Pair<File, Amenity>>() {
|
||||||
if (!Algorithms.isEmpty(amenity.getName(lang))) {
|
@Override
|
||||||
TravelArticle article = cacheTravelArticles(reader.getFile(), amenity, lang, false);
|
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<File, Amenity> amenity : amenities) {
|
||||||
|
if (!Algorithms.isEmpty(amenity.second.getName(lang))) {
|
||||||
|
TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false);
|
||||||
if (article != null) {
|
if (article != null) {
|
||||||
popularArticles.add(article);
|
popularArticles.add(article);
|
||||||
if (popularArticles.size() >= MAX_POPULAR_ARTICLES_COUNT) {
|
if (popularArticles.size() >= MAX_POPULAR_ARTICLES_COUNT) {
|
||||||
|
@ -108,29 +125,38 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(popularArticles, new Comparator<TravelArticle>() {
|
|
||||||
@Override
|
|
||||||
public int compare(TravelArticle article1, TravelArticle article2) {
|
|
||||||
int d1 = (int) (MapUtils.getDistance(article1.getLat(), article1.getLon(),
|
|
||||||
location.getLatitude(), location.getLongitude()));
|
|
||||||
int d2 = (int) (MapUtils.getDistance(article2.getLat(), article2.getLon(),
|
|
||||||
location.getLatitude(), location.getLongitude()));
|
|
||||||
return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
LOG.error(e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.popularArticles = popularArticles;
|
this.popularArticles = popularArticles;
|
||||||
return popularArticles;
|
return popularArticles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void searchAmenity(final List<Pair<File, Amenity>> amenitiesList, LatLon location,
|
||||||
|
final BinaryMapIndexReader reader, int searchRadius, int zoom,
|
||||||
|
String searchFilter) throws IOException {
|
||||||
|
reader.searchPoi(BinaryMapIndexReader.buildSearchPoiRequest(
|
||||||
|
location, searchRadius, zoom, getSearchFilter(searchFilter), new ResultMatcher<Amenity>() {
|
||||||
|
@Override
|
||||||
|
public boolean publish(Amenity object) {
|
||||||
|
amenitiesList.add(new Pair<>(reader.getFile(), object));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private TravelArticle cacheTravelArticles(File file, Amenity amenity, String lang, boolean readPoints) {
|
private TravelArticle cacheTravelArticles(File file, Amenity amenity, String lang, boolean readPoints) {
|
||||||
TravelArticle article = null;
|
TravelArticle article = null;
|
||||||
Map<String, TravelArticle> articles = readArticles(file, amenity, false);
|
Map<String, TravelArticle> articles;
|
||||||
|
if (amenity.getSubType().equals(ROUTE_TRACK)) {
|
||||||
|
articles = readRoutePoint(file, amenity);
|
||||||
|
} else {
|
||||||
|
articles = readArticles(file, amenity, false);
|
||||||
|
}
|
||||||
if (!Algorithms.isEmpty(articles)) {
|
if (!Algorithms.isEmpty(articles)) {
|
||||||
TravelArticleIdentifier newArticleId = articles.values().iterator().next().generateIdentifier();
|
TravelArticleIdentifier newArticleId = articles.values().iterator().next().generateIdentifier();
|
||||||
cachedArticles.put(newArticleId, articles);
|
cachedArticles.put(newArticleId, articles);
|
||||||
|
@ -139,12 +165,38 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
return article;
|
return article;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
private Map<String, TravelArticle> readRoutePoint(File file, Amenity amenity) {
|
||||||
private SearchPoiTypeFilter getSearchFilter(final boolean articlePoints) {
|
Map<String, TravelArticle> articles = new HashMap<>();
|
||||||
return new SearchPoiTypeFilter() {
|
TravelGpx res = new TravelGpx();
|
||||||
|
String title = amenity.getName("en");
|
||||||
|
res.title = capitalizeFirstLetter(getGpxTitle(Algorithms.isEmpty(title) ? amenity.getName() : title));
|
||||||
|
res.routeId = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID));
|
||||||
|
try {
|
||||||
|
res.totalDistance = Float.parseFloat(Algorithms.emptyIfNull(amenity.getTagContent("distance")));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
LOG.debug(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
res.diffElevationUp = Double.parseDouble(Algorithms.emptyIfNull(amenity.getTagContent("diff_ele_up")));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
LOG.debug(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
res.diffElevationDown = Double.parseDouble(Algorithms.emptyIfNull(amenity.getTagContent("diff_ele_down")));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
LOG.debug(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
res.user = Algorithms.emptyIfNull(amenity.getTagContent("user"));
|
||||||
|
articles.put("en", res);
|
||||||
|
return articles;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private BinaryMapIndexReader.SearchPoiTypeFilter getSearchFilter(final String filterSubcategory) {
|
||||||
|
return new BinaryMapIndexReader.SearchPoiTypeFilter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(PoiCategory type, String subcategory) {
|
public boolean accept(PoiCategory type, String subcategory) {
|
||||||
return subcategory.equals(articlePoints ? ROUTE_ARTICLE_POINT : ROUTE_ARTICLE);
|
return subcategory.equals(filterSubcategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -175,9 +227,9 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
res.isParentOf = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IS_PARENT_OF, lang));
|
res.isParentOf = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IS_PARENT_OF, lang));
|
||||||
res.lat = amenity.getLocation().getLatitude();
|
res.lat = amenity.getLocation().getLatitude();
|
||||||
res.lon = amenity.getLocation().getLongitude();
|
res.lon = amenity.getLocation().getLongitude();
|
||||||
res.imageTitle = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IMAGE_TITLE, null));
|
res.imageTitle = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IMAGE_TITLE));
|
||||||
res.routeId = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID, null));
|
res.routeId = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID));
|
||||||
res.routeSource = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_SOURCE, null));
|
res.routeSource = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_SOURCE));
|
||||||
res.originalId = 0;
|
res.originalId = 0;
|
||||||
res.lang = lang;
|
res.lang = lang;
|
||||||
res.contentsJson = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.CONTENT_JSON, lang));
|
res.contentsJson = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.CONTENT_JSON, lang));
|
||||||
|
@ -214,14 +266,14 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
}
|
}
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(0, 0,
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(0, 0,
|
||||||
Algorithms.emptyIfNull(article.title), 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE,
|
Algorithms.emptyIfNull(article.title), 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE,
|
||||||
getSearchFilter(true), new ResultMatcher<Amenity>() {
|
getSearchFilter(ROUTE_ARTICLE_POINT), new ResultMatcher<Amenity>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean publish(Amenity amenity) {
|
public boolean publish(Amenity amenity) {
|
||||||
String amenityLang = amenity.getTagSuffix(Amenity.LANG_YES + ":");
|
String amenityLang = amenity.getTagSuffix(Amenity.LANG_YES + ":");
|
||||||
if (Algorithms.stringsEqual(lang, amenityLang)
|
if (Algorithms.stringsEqual(lang, amenityLang)
|
||||||
&& Algorithms.stringsEqual(article.routeId,
|
&& Algorithms.stringsEqual(article.routeId,
|
||||||
Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID, null)))) {
|
Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID)))) {
|
||||||
pointList.add(amenity);
|
pointList.add(amenity);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -263,7 +315,7 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
}
|
}
|
||||||
String category = amenity.getTagSuffix("category_");
|
String category = amenity.getTagSuffix("category_");
|
||||||
if (category != null) {
|
if (category != null) {
|
||||||
wptPt.category = Algorithms.capitalizeFirstLetter(category);
|
wptPt.category = capitalizeFirstLetter(category);
|
||||||
}
|
}
|
||||||
return wptPt;
|
return wptPt;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +335,7 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
for (BinaryMapIndexReader reader : getReaders()) {
|
for (BinaryMapIndexReader reader : getReaders()) {
|
||||||
try {
|
try {
|
||||||
SearchRequest<Amenity> searchRequest = BinaryMapIndexReader.buildSearchPoiRequest(0, 0, searchQuery,
|
SearchRequest<Amenity> searchRequest = BinaryMapIndexReader.buildSearchPoiRequest(0, 0, searchQuery,
|
||||||
0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, getSearchFilter(false), new ResultMatcher<Amenity>() {
|
0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, getSearchFilter(ROUTE_ARTICLE), new ResultMatcher<Amenity>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean publish(Amenity object) {
|
public boolean publish(Amenity object) {
|
||||||
List<String> otherNames = object.getAllNames(false);
|
List<String> otherNames = object.getAllNames(false);
|
||||||
|
@ -458,7 +510,7 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
for (BinaryMapIndexReader reader : getReaders()) {
|
for (BinaryMapIndexReader reader : getReaders()) {
|
||||||
try {
|
try {
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(
|
||||||
0, 0, title, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, getSearchFilter(false),
|
0, 0, title, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, getSearchFilter(ROUTE_ARTICLE),
|
||||||
new ResultMatcher<Amenity>() {
|
new ResultMatcher<Amenity>() {
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
|
|
||||||
|
@ -531,12 +583,13 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
}
|
}
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(0, 0,
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(0, 0,
|
||||||
Algorithms.emptyIfNull(articleId.title), 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE,
|
Algorithms.emptyIfNull(articleId.title), 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE,
|
||||||
getSearchFilter(false), new ResultMatcher<Amenity>() {
|
getSearchFilter(ROUTE_ARTICLE), new ResultMatcher<Amenity>() {
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean publish(Amenity amenity) {
|
public boolean publish(Amenity amenity) {
|
||||||
if (Algorithms.stringsEqual(articleId.routeId, Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID, null))) || isDbArticle) {
|
if (Algorithms.stringsEqual(articleId.routeId,
|
||||||
|
Algorithms.emptyIfNull(amenity.getTagContent(Amenity.ROUTE_ID))) || isDbArticle) {
|
||||||
amenities.add(amenity);
|
amenities.add(amenity);
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
@ -604,7 +657,7 @@ public class TravelObfHelper implements TravelHelper {
|
||||||
for (BinaryMapIndexReader reader : getReaders()) {
|
for (BinaryMapIndexReader reader : getReaders()) {
|
||||||
try {
|
try {
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(
|
||||||
x, y, title, left, right, top, bottom, getSearchFilter(false),
|
x, y, title, left, right, top, bottom, getSearchFilter(ROUTE_ARTICLE),
|
||||||
new ResultMatcher<Amenity>() {
|
new ResultMatcher<Amenity>() {
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
|
|
||||||
|
|
|
@ -181,7 +181,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv
|
||||||
List<TravelArticle> popularArticles = app.getTravelHelper().getPopularArticles();
|
List<TravelArticle> popularArticles = app.getTravelHelper().getPopularArticles();
|
||||||
for (TravelArticle article : popularArticles) {
|
for (TravelArticle article : popularArticles) {
|
||||||
if (article instanceof TravelGpx) {
|
if (article instanceof TravelGpx) {
|
||||||
items.add(new TravelGpxCard(app, nightMode, (TravelGpx) article, fm));
|
items.add(new TravelGpxCard(app, nightMode, (TravelGpx) article, activity.getSupportFragmentManager()));
|
||||||
} else {
|
} else {
|
||||||
items.add(new ArticleTravelCard(app, nightMode, article, activity.getSupportFragmentManager()));
|
items.add(new ArticleTravelCard(app, nightMode, article, activity.getSupportFragmentManager()));
|
||||||
}
|
}
|
||||||
|
@ -197,6 +197,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void removeRedundantCards() {
|
private void removeRedundantCards() {
|
||||||
if (mainIndexItem != null && mainIndexItem.isDownloaded() && !mainIndexItem.isOutdated()) {
|
if (mainIndexItem != null && mainIndexItem.isDownloaded() && !mainIndexItem.isOutdated()) {
|
||||||
|
|
|
@ -8,11 +8,11 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import net.osmand.AndroidUtils;
|
||||||
import net.osmand.plus.OsmAndFormatter;
|
import net.osmand.plus.OsmAndFormatter;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.wikipedia.WikiArticleHelper;
|
import net.osmand.plus.wikipedia.WikiArticleHelper;
|
||||||
import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment;
|
|
||||||
import net.osmand.plus.wikivoyage.data.TravelGpx;
|
import net.osmand.plus.wikivoyage.data.TravelGpx;
|
||||||
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
|
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
|
||||||
|
|
||||||
|
@ -38,7 +38,10 @@ public class TravelGpxCard extends BaseTravelCard {
|
||||||
if (viewHolder instanceof TravelGpxVH) {
|
if (viewHolder instanceof TravelGpxVH) {
|
||||||
final TravelGpxVH holder = (TravelGpxVH) viewHolder;
|
final TravelGpxVH holder = (TravelGpxVH) viewHolder;
|
||||||
holder.title.setText(article.getTitle());
|
holder.title.setText(article.getTitle());
|
||||||
holder.content.setText(WikiArticleHelper.getPartialContent(article.getContent()));
|
Drawable icon = getActiveIcon(R.drawable.ic_action_user_account_16);
|
||||||
|
holder.user.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
|
||||||
|
holder.user.setText(WikiArticleHelper.getPartialContent(article.user));
|
||||||
|
AndroidUtils.setBackground(app, holder.user, nightMode, R.drawable.btn_border_bg_light, R.drawable.btn_border_bg_dark);
|
||||||
holder.distance.setText(OsmAndFormatter.getFormattedDistance(article.totalDistance, app));
|
holder.distance.setText(OsmAndFormatter.getFormattedDistance(article.totalDistance, app));
|
||||||
holder.diffElevationUp.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationUp, app));
|
holder.diffElevationUp.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationUp, app));
|
||||||
holder.diffElevationDown.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationDown, app));
|
holder.diffElevationDown.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationDown, app));
|
||||||
|
@ -47,8 +50,9 @@ public class TravelGpxCard extends BaseTravelCard {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
if (fragmentManager != null) {
|
if (fragmentManager != null) {
|
||||||
WikivoyageArticleDialogFragment.showInstance(app, fragmentManager,
|
// WikivoyageArticleDialogFragment.showInstance(app, fragmentManager,
|
||||||
article.generateIdentifier(), article.getLang());
|
// article.generateIdentifier(), article.getLang());
|
||||||
|
app.getTravelHelper().createGpxFile(article);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -86,7 +90,7 @@ public class TravelGpxCard extends BaseTravelCard {
|
||||||
public static class TravelGpxVH extends RecyclerView.ViewHolder {
|
public static class TravelGpxVH extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
final TextView title;
|
final TextView title;
|
||||||
final TextView content;
|
final TextView user;
|
||||||
final TextView distance;
|
final TextView distance;
|
||||||
final TextView diffElevationUp;
|
final TextView diffElevationUp;
|
||||||
final TextView diffElevationDown;
|
final TextView diffElevationDown;
|
||||||
|
@ -98,7 +102,7 @@ public class TravelGpxCard extends BaseTravelCard {
|
||||||
public TravelGpxVH(final View itemView) {
|
public TravelGpxVH(final View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
title = itemView.findViewById(R.id.title);
|
title = itemView.findViewById(R.id.title);
|
||||||
content = itemView.findViewById(R.id.content);
|
user = itemView.findViewById(R.id.user_name);
|
||||||
distance = itemView.findViewById(R.id.distance);
|
distance = itemView.findViewById(R.id.distance);
|
||||||
diffElevationUp = itemView.findViewById(R.id.diff_ele_up);
|
diffElevationUp = itemView.findViewById(R.id.diff_ele_up);
|
||||||
diffElevationDown = itemView.findViewById(R.id.diff_ele_down);
|
diffElevationDown = itemView.findViewById(R.id.diff_ele_down);
|
||||||
|
|
Loading…
Reference in a new issue