Merge pull request #8833 from osmandapp/custom_download_fixes
Description download actions
This commit is contained in:
commit
72089a6ae1
11 changed files with 300 additions and 250 deletions
|
@ -16,7 +16,8 @@
|
|||
<net.osmand.plus.LockableViewPager
|
||||
android:id="@+id/images_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="132dp" />
|
||||
android:layout_height="@dimen/download_description_images_height"
|
||||
tools:visibility="gone" />
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/description"
|
||||
|
|
|
@ -22,47 +22,47 @@
|
|||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<include
|
||||
layout="@layout/free_version_banner"
|
||||
android:background="#F00" />
|
||||
|
||||
<include layout="@layout/progress_with_two_texts" />
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/activity_background_basic">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/activity_background_basic">
|
||||
android:scrollbars="none">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/description_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingBottom="@dimen/dialog_button_ex_height">
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/item_image"
|
||||
<net.osmand.plus.LockableViewPager
|
||||
android:id="@+id/images_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:adjustViewBounds="true"
|
||||
android:background="?attr/bg_color"
|
||||
android:maxHeight="132dp"
|
||||
android:scaleType="fitCenter"
|
||||
tools:src="@drawable/extension_stub" />
|
||||
android:layout_height="@dimen/download_description_images_height"
|
||||
tools:visibility="gone" />
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/item_description"
|
||||
android:id="@+id/description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/bg_color"
|
||||
android:background="?attr/list_background_color"
|
||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingTop="@dimen/list_header_settings_top_margin"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
app:typeface="@string/font_roboto_regular"
|
||||
tools:text="@string/lorem_ipsum" />
|
||||
tools:text="@string/plugin_disabled_descr" />
|
||||
|
||||
<include layout="@layout/card_bottom_divider" />
|
||||
|
||||
|
@ -71,14 +71,12 @@
|
|||
</ScrollView>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/buttons_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="?attr/list_background_color">
|
||||
|
||||
<include layout="@layout/bottom_buttons" />
|
||||
|
||||
</LinearLayout>
|
||||
android:background="?attr/list_background_color"
|
||||
android:orientation="vertical" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
|
|
@ -241,4 +241,5 @@
|
|||
<dimen name="settings_divider_margin_start">108dp</dimen>
|
||||
<dimen name="setting_list_item_large_height">108dp</dimen>
|
||||
|
||||
<dimen name="download_description_images_height">198dp</dimen>
|
||||
</resources>
|
|
@ -367,4 +367,6 @@
|
|||
<dimen name="mtrl_slider_track_side_padding">@dimen/slider_thumb_size</dimen>
|
||||
|
||||
<dimen name="list_item_move_header_min_height">65dp</dimen>
|
||||
|
||||
<dimen name="download_description_images_height">132dp</dimen>
|
||||
</resources>
|
|
@ -143,15 +143,15 @@ public class CustomRegion extends WorldRegion {
|
|||
long containerSize = itemJson.optLong("containerSize");
|
||||
|
||||
String indexType = itemJson.optString("type", type);
|
||||
String webUrl = itemJson.optString("weburl");
|
||||
String fileName = itemJson.optString("filename");
|
||||
String downloadUrl = itemJson.optString("downloadurl");
|
||||
String size = new DecimalFormat("#.#").format(containerSize / (1024f * 1024f));
|
||||
|
||||
List<String> descrImageUrl = JsonUtils.jsonArrayToList("image-description-url", itemJson);
|
||||
Map<String, String> indexNames = JsonUtils.getLocalizedMapFromJson("name", itemJson);
|
||||
Map<String, String> descriptions = JsonUtils.getLocalizedMapFromJson("description", itemJson);
|
||||
Map<String, String> webButtonText = JsonUtils.getLocalizedMapFromJson("web-button-text", itemJson);
|
||||
Map<String, String> firstSubNames = JsonUtils.getLocalizedMapFromJson("firstsubname", itemJson);
|
||||
Map<String, String> secondSubNames = JsonUtils.getLocalizedMapFromJson("secondsubname", itemJson);
|
||||
|
||||
DownloadDescriptionInfo descriptionInfo = DownloadDescriptionInfo.fromJson(itemJson.optJSONObject("description"));
|
||||
|
||||
DownloadActivityType type = DownloadActivityType.getIndexType(indexType);
|
||||
if (type != null) {
|
||||
|
@ -160,10 +160,9 @@ public class CustomRegion extends WorldRegion {
|
|||
.setSubfolder(subfolder)
|
||||
.setDownloadUrl(downloadUrl)
|
||||
.setNames(indexNames)
|
||||
.setDescriptions(descriptions)
|
||||
.setImageDescrUrl(descrImageUrl)
|
||||
.setWebUrl(webUrl)
|
||||
.setWebButtonText(webButtonText)
|
||||
.setFirstSubNames(firstSubNames)
|
||||
.setSecondSubNames(secondSubNames)
|
||||
.setDescriptionInfo(descriptionInfo)
|
||||
.setTimestamp(timestamp)
|
||||
.setSize(size)
|
||||
.setContentSize(contentSize)
|
||||
|
|
|
@ -7,44 +7,42 @@ import androidx.annotation.NonNull;
|
|||
import net.osmand.JsonUtils;
|
||||
import net.osmand.map.OsmandRegions;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.download.ui.DownloadDescriptionInfo;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class CustomIndexItem extends IndexItem {
|
||||
|
||||
private String subfolder;
|
||||
private String downloadUrl;
|
||||
private String webUrl;
|
||||
|
||||
private List<String> imageDescrUrl;
|
||||
private Map<String, String> names;
|
||||
private Map<String, String> descriptions;
|
||||
private Map<String, String> webButtonTexts;
|
||||
private Map<String, String> firstSubNames;
|
||||
private Map<String, String> secondSubNames;
|
||||
|
||||
private DownloadDescriptionInfo descriptionInfo;
|
||||
|
||||
public CustomIndexItem(String fileName,
|
||||
String subfolder,
|
||||
String downloadUrl,
|
||||
String webUrl,
|
||||
String size,
|
||||
long timestamp,
|
||||
long contentSize,
|
||||
long containerSize,
|
||||
List<String> imageDescrUrl,
|
||||
Map<String, String> names,
|
||||
Map<String, String> descriptions,
|
||||
Map<String, String> webButtonTexts,
|
||||
@NonNull DownloadActivityType type) {
|
||||
Map<String, String> firstSubNames,
|
||||
Map<String, String> secondSubNames,
|
||||
@NonNull DownloadActivityType type,
|
||||
DownloadDescriptionInfo descriptionInfo) {
|
||||
super(fileName, null, timestamp, size, contentSize, containerSize, type);
|
||||
this.names = names;
|
||||
this.firstSubNames = firstSubNames;
|
||||
this.secondSubNames = secondSubNames;
|
||||
this.subfolder = subfolder;
|
||||
this.downloadUrl = downloadUrl;
|
||||
this.webUrl = webUrl;
|
||||
this.imageDescrUrl = imageDescrUrl;
|
||||
this.names = names;
|
||||
this.descriptions = descriptions;
|
||||
this.webButtonTexts = webButtonTexts;
|
||||
this.descriptionInfo = descriptionInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -76,21 +74,26 @@ public class CustomIndexItem extends IndexItem {
|
|||
return JsonUtils.getLocalizedResFromMap(ctx, names, name);
|
||||
}
|
||||
|
||||
public List<String> getDescriptionImageUrl() {
|
||||
return imageDescrUrl;
|
||||
public String getSubName(Context ctx) {
|
||||
String subName = getFirstSubName(ctx);
|
||||
|
||||
String secondSubName = getSecondSubName(ctx);
|
||||
if (secondSubName != null) {
|
||||
subName = subName == null ? secondSubName : subName + " • " + secondSubName;
|
||||
}
|
||||
return subName;
|
||||
}
|
||||
|
||||
public String getLocalizedDescription(Context ctx) {
|
||||
String description = super.getDescription();
|
||||
return JsonUtils.getLocalizedResFromMap(ctx, descriptions, description);
|
||||
public String getFirstSubName(Context ctx) {
|
||||
return JsonUtils.getLocalizedResFromMap(ctx, firstSubNames, null);
|
||||
}
|
||||
|
||||
public String getWebUrl() {
|
||||
return webUrl;
|
||||
public String getSecondSubName(Context ctx) {
|
||||
return JsonUtils.getLocalizedResFromMap(ctx, secondSubNames, null);
|
||||
}
|
||||
|
||||
public String getWebButtonText(Context ctx) {
|
||||
return JsonUtils.getLocalizedResFromMap(ctx, webButtonTexts, null);
|
||||
public DownloadDescriptionInfo getDescriptionInfo() {
|
||||
return descriptionInfo;
|
||||
}
|
||||
|
||||
public static class CustomIndexItemBuilder {
|
||||
|
@ -98,19 +101,18 @@ public class CustomIndexItem extends IndexItem {
|
|||
private String fileName;
|
||||
private String subfolder;
|
||||
private String downloadUrl;
|
||||
private String webUrl;
|
||||
private String size;
|
||||
|
||||
private long timestamp;
|
||||
private long contentSize;
|
||||
private long containerSize;
|
||||
|
||||
private List<String> imageDescrUrl;
|
||||
private Map<String, String> names;
|
||||
private Map<String, String> descriptions;
|
||||
private Map<String, String> webButtonText;
|
||||
private Map<String, String> firstSubNames;
|
||||
private Map<String, String> secondSubNames;
|
||||
private DownloadActivityType type;
|
||||
|
||||
private DownloadDescriptionInfo descriptionInfo;
|
||||
|
||||
public CustomIndexItemBuilder setFileName(String fileName) {
|
||||
this.fileName = fileName;
|
||||
|
@ -127,11 +129,6 @@ public class CustomIndexItem extends IndexItem {
|
|||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setWebUrl(String webUrl) {
|
||||
this.webUrl = webUrl;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setSize(String size) {
|
||||
this.size = size;
|
||||
return this;
|
||||
|
@ -152,23 +149,23 @@ public class CustomIndexItem extends IndexItem {
|
|||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setImageDescrUrl(List<String> imageDescrUrl) {
|
||||
this.imageDescrUrl = imageDescrUrl;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setNames(Map<String, String> names) {
|
||||
this.names = names;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setDescriptions(Map<String, String> descriptions) {
|
||||
this.descriptions = descriptions;
|
||||
public CustomIndexItemBuilder setFirstSubNames(Map<String, String> firstSubNames) {
|
||||
this.firstSubNames = firstSubNames;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setWebButtonText(Map<String, String> webButtonText) {
|
||||
this.webButtonText = webButtonText;
|
||||
public CustomIndexItemBuilder setSecondSubNames(Map<String, String> secondSubNames) {
|
||||
this.secondSubNames = secondSubNames;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CustomIndexItemBuilder setDescriptionInfo(DownloadDescriptionInfo descriptionInfo) {
|
||||
this.descriptionInfo = descriptionInfo;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -181,16 +178,15 @@ public class CustomIndexItem extends IndexItem {
|
|||
return new CustomIndexItem(fileName,
|
||||
subfolder,
|
||||
downloadUrl,
|
||||
webUrl,
|
||||
size,
|
||||
timestamp,
|
||||
contentSize,
|
||||
containerSize,
|
||||
imageDescrUrl,
|
||||
names,
|
||||
descriptions,
|
||||
webButtonText,
|
||||
type);
|
||||
firstSubNames,
|
||||
secondSubNames,
|
||||
type,
|
||||
descriptionInfo);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -21,14 +21,14 @@ public class DownloadDescriptionInfo {
|
|||
|
||||
private JSONArray buttonsJson;
|
||||
private List<String> imageUrls;
|
||||
private Map<String, String> texts;
|
||||
private Map<String, String> localizedDescription;
|
||||
|
||||
public List<String> getImageUrls() {
|
||||
return imageUrls;
|
||||
}
|
||||
|
||||
public CharSequence getLocalizedDescription(Context ctx) {
|
||||
String description = JsonUtils.getLocalizedResFromMap(ctx, texts, null);
|
||||
String description = JsonUtils.getLocalizedResFromMap(ctx, localizedDescription, null);
|
||||
return description != null ? Html.fromHtml(description) : null;
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ public class DownloadDescriptionInfo {
|
|||
if (json != null) {
|
||||
DownloadDescriptionInfo downloadDescriptionInfo = new DownloadDescriptionInfo();
|
||||
try {
|
||||
downloadDescriptionInfo.texts = JsonUtils.getLocalizedMapFromJson("text", json);
|
||||
downloadDescriptionInfo.localizedDescription = JsonUtils.getLocalizedMapFromJson("text", json);
|
||||
downloadDescriptionInfo.imageUrls = JsonUtils.jsonArrayToList("image", json);
|
||||
downloadDescriptionInfo.buttonsJson = json.optJSONArray("button");
|
||||
} catch (JSONException e) {
|
||||
|
@ -77,7 +77,7 @@ public class DownloadDescriptionInfo {
|
|||
public JSONObject toJson() throws JSONException {
|
||||
JSONObject descrJson = new JSONObject();
|
||||
|
||||
JsonUtils.writeLocalizedMapToJson("text", descrJson, texts);
|
||||
JsonUtils.writeLocalizedMapToJson("text", descrJson, localizedDescription);
|
||||
JsonUtils.writeStringListToJson("image", descrJson, imageUrls);
|
||||
|
||||
descrJson.putOpt("button", buttonsJson);
|
||||
|
@ -87,6 +87,8 @@ public class DownloadDescriptionInfo {
|
|||
|
||||
public static class ActionButton {
|
||||
|
||||
public static final String DOWNLOAD_ACTION = "download";
|
||||
|
||||
private String actionType;
|
||||
private String name;
|
||||
private String url;
|
||||
|
|
|
@ -2,37 +2,43 @@ package net.osmand.plus.download.ui;
|
|||
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
import com.squareup.picasso.Callback;
|
||||
import com.squareup.picasso.Picasso;
|
||||
import com.squareup.picasso.RequestCreator;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.PicassoUtils;
|
||||
import net.osmand.map.WorldRegion;
|
||||
import net.osmand.plus.CustomRegion;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.download.CustomIndexItem;
|
||||
import net.osmand.plus.download.DownloadActivity;
|
||||
import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion;
|
||||
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
||||
import net.osmand.plus.download.DownloadResourceGroup;
|
||||
import net.osmand.plus.download.DownloadResources;
|
||||
import net.osmand.plus.download.IndexItem;
|
||||
import net.osmand.plus.download.ui.DownloadDescriptionInfo.ActionButton;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static net.osmand.plus.download.ui.DownloadResourceGroupFragment.REGION_ID_DLG_KEY;
|
||||
|
||||
public class DownloadItemFragment extends DialogFragment {
|
||||
public class DownloadItemFragment extends DialogFragment implements DownloadEvents {
|
||||
|
||||
public static final String ITEM_ID_DLG_KEY = "index_item_dialog_key";
|
||||
|
||||
|
@ -41,14 +47,14 @@ public class DownloadItemFragment extends DialogFragment {
|
|||
private String regionId = "";
|
||||
private int itemIndex = -1;
|
||||
|
||||
private BannerAndDownloadFreeVersion banner;
|
||||
private DownloadResourceGroup group;
|
||||
private CustomIndexItem indexItem;
|
||||
|
||||
private View view;
|
||||
private Toolbar toolbar;
|
||||
private ImageView image;
|
||||
private TextView description;
|
||||
private TextView buttonTextView;
|
||||
private ViewPager imagesPager;
|
||||
private View descriptionContainer;
|
||||
private ViewGroup buttonsContainer;
|
||||
|
||||
private boolean nightMode;
|
||||
|
||||
|
@ -58,12 +64,11 @@ public class DownloadItemFragment extends DialogFragment {
|
|||
nightMode = !getMyApplication().getSettings().isLightContent();
|
||||
int themeId = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
|
||||
setStyle(STYLE_NO_FRAME, themeId);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
view = inflater.inflate(R.layout.item_info_fragment, container, false);
|
||||
final View view = inflater.inflate(R.layout.item_info_fragment, container, false);
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
regionId = savedInstanceState.getString(REGION_ID_DLG_KEY);
|
||||
|
@ -85,77 +90,131 @@ public class DownloadItemFragment extends DialogFragment {
|
|||
}
|
||||
});
|
||||
|
||||
description = view.findViewById(R.id.item_description);
|
||||
image = view.findViewById(R.id.item_image);
|
||||
banner = new BannerAndDownloadFreeVersion(view, (DownloadActivity) getActivity(), false);
|
||||
|
||||
View dismissButton = view.findViewById(R.id.dismiss_button);
|
||||
dismissButton.setOnClickListener(new View.OnClickListener() {
|
||||
description = view.findViewById(R.id.description);
|
||||
imagesPager = view.findViewById(R.id.images_pager);
|
||||
buttonsContainer = view.findViewById(R.id.buttons_container);
|
||||
descriptionContainer = view.findViewById(R.id.description_container);
|
||||
|
||||
reloadData();
|
||||
|
||||
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (indexItem != null && !Algorithms.isEmpty(indexItem.getWebUrl())) {
|
||||
WikipediaDialogFragment.showFullArticle(v.getContext(), Uri.parse(indexItem.getWebUrl()), nightMode);
|
||||
public void onGlobalLayout() {
|
||||
ViewTreeObserver obs = view.getViewTreeObserver();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
obs.removeOnGlobalLayoutListener(this);
|
||||
} else {
|
||||
obs.removeGlobalOnLayoutListener(this);
|
||||
}
|
||||
descriptionContainer.setPadding(0, 0, 0, buttonsContainer.getHeight());
|
||||
}
|
||||
});
|
||||
UiUtilities.setupDialogButton(nightMode, dismissButton, UiUtilities.DialogButtonType.PRIMARY, "");
|
||||
buttonTextView = (TextView) dismissButton.findViewById(R.id.button_text);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
reloadData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putString(REGION_ID_DLG_KEY, regionId);
|
||||
outState.putInt(ITEM_ID_DLG_KEY, itemIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void newDownloadIndexes() {
|
||||
if (banner != null) {
|
||||
banner.updateBannerInProgress();
|
||||
}
|
||||
reloadData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadHasFinished() {
|
||||
if (banner != null) {
|
||||
banner.updateBannerInProgress();
|
||||
}
|
||||
reloadData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadInProgress() {
|
||||
if (banner != null) {
|
||||
banner.updateBannerInProgress();
|
||||
}
|
||||
}
|
||||
|
||||
private void reloadData() {
|
||||
DownloadActivity downloadActivity = getDownloadActivity();
|
||||
if (downloadActivity != null) {
|
||||
OsmandApplication app = downloadActivity.getMyApplication();
|
||||
DownloadResources indexes = getDownloadActivity().getDownloadThread().getIndexes();
|
||||
group = indexes.getGroupById(regionId);
|
||||
indexItem = (CustomIndexItem) group.getItemByIndex(itemIndex);
|
||||
if (indexItem != null) {
|
||||
toolbar.setTitle(indexItem.getVisibleName(app, app.getRegions()));
|
||||
WorldRegion region = group.getRegion();
|
||||
if (region instanceof CustomRegion) {
|
||||
CustomRegion customRegion = (CustomRegion) region;
|
||||
int color = customRegion.getHeaderColor();
|
||||
if (color != -1) {
|
||||
toolbar.setBackgroundColor(color);
|
||||
DownloadActivity activity = getDownloadActivity();
|
||||
OsmandApplication app = activity.getMyApplication();
|
||||
DownloadResources indexes = activity.getDownloadThread().getIndexes();
|
||||
group = indexes.getGroupById(regionId);
|
||||
CustomIndexItem indexItem = (CustomIndexItem) group.getItemByIndex(itemIndex);
|
||||
if (indexItem != null) {
|
||||
toolbar.setTitle(indexItem.getVisibleName(app, app.getRegions()));
|
||||
|
||||
DownloadDescriptionInfo descriptionInfo = indexItem.getDescriptionInfo();
|
||||
if (descriptionInfo != null) {
|
||||
updateDescription(app, descriptionInfo, description);
|
||||
updateImagesPager(app, descriptionInfo, imagesPager);
|
||||
updateActionButtons(activity, descriptionInfo, indexItem, buttonsContainer, R.layout.bottom_buttons, nightMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void updateActionButtons(final DownloadActivity ctx, DownloadDescriptionInfo descriptionInfo,
|
||||
@Nullable final IndexItem indexItem, ViewGroup buttonsContainer,
|
||||
@LayoutRes int layoutId, final boolean nightMode) {
|
||||
buttonsContainer.removeAllViews();
|
||||
|
||||
List<ActionButton> actionButtons = descriptionInfo.getActionButtons(ctx);
|
||||
if (Algorithms.isEmpty(actionButtons) && indexItem != null && !indexItem.isDownloaded()) {
|
||||
actionButtons.add(new ActionButton(ActionButton.DOWNLOAD_ACTION, ctx.getString(R.string.shared_string_download), null));
|
||||
}
|
||||
|
||||
for (final ActionButton actionButton : actionButtons) {
|
||||
View buttonView = UiUtilities.getInflater(ctx, nightMode).inflate(layoutId, buttonsContainer, false);
|
||||
View button = buttonView.findViewById(R.id.dismiss_button);
|
||||
if (button != null) {
|
||||
UiUtilities.setupDialogButton(nightMode, button, UiUtilities.DialogButtonType.PRIMARY, actionButton.getName());
|
||||
} else {
|
||||
TextView buttonText = buttonView.findViewById(R.id.button_text);
|
||||
buttonText.setText(actionButton.getName());
|
||||
}
|
||||
buttonView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (actionButton.getUrl() != null) {
|
||||
WikipediaDialogFragment.showFullArticle(ctx, Uri.parse(actionButton.getUrl()), nightMode);
|
||||
} else if (ActionButton.DOWNLOAD_ACTION.equalsIgnoreCase(actionButton.getActionType()) && indexItem != null) {
|
||||
boolean isDownloading = ctx.getDownloadThread().isDownloading(indexItem);
|
||||
if (!isDownloading) {
|
||||
ctx.startDownload(indexItem);
|
||||
}
|
||||
} else {
|
||||
String text = ctx.getString(R.string.download_unsupported_action, actionButton.getActionType());
|
||||
Toast.makeText(ctx, text, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
buttonsContainer.addView(buttonView);
|
||||
}
|
||||
}
|
||||
|
||||
description.setText(indexItem.getLocalizedDescription(app));
|
||||
buttonTextView.setText(indexItem.getWebButtonText(app));
|
||||
static void updateDescription(OsmandApplication app, DownloadDescriptionInfo descriptionInfo, TextView descriptionView) {
|
||||
CharSequence descr = descriptionInfo.getLocalizedDescription(app);
|
||||
descriptionView.setText(descr);
|
||||
AndroidUiHelper.updateVisibility(descriptionView, !Algorithms.isEmpty(descr));
|
||||
}
|
||||
|
||||
final PicassoUtils picassoUtils = PicassoUtils.getPicasso(app);
|
||||
Picasso picasso = Picasso.get();
|
||||
for (final String imageUrl : indexItem.getDescriptionImageUrl()) {
|
||||
RequestCreator rc = picasso.load(imageUrl);
|
||||
rc.into(image, new Callback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
image.setVisibility(View.VISIBLE);
|
||||
picassoUtils.setResultLoaded(imageUrl, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception e) {
|
||||
image.setVisibility(View.GONE);
|
||||
picassoUtils.setResultLoaded(imageUrl, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
static void updateImagesPager(OsmandApplication app, DownloadDescriptionInfo descriptionInfo, ViewPager viewPager) {
|
||||
if (!Algorithms.isEmpty(descriptionInfo.getImageUrls())) {
|
||||
ImagesPagerAdapter adapter = new ImagesPagerAdapter(app, descriptionInfo.getImageUrls());
|
||||
viewPager.setAdapter(adapter);
|
||||
viewPager.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewPager.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import android.app.ProgressDialog;
|
|||
import android.content.DialogInterface;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.util.TypedValue;
|
||||
|
@ -22,19 +21,13 @@ import android.widget.ExpandableListView.OnChildClickListener;
|
|||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.view.MenuItemCompat;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.viewpager.widget.PagerAdapter;
|
||||
|
||||
import com.squareup.picasso.Callback;
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import net.osmand.AndroidNetworkUtils;
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.PicassoUtils;
|
||||
import net.osmand.plus.CustomRegion;
|
||||
import net.osmand.plus.LockableViewPager;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
|
@ -51,12 +44,9 @@ import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
|
|||
import net.osmand.plus.download.DownloadResources;
|
||||
import net.osmand.plus.download.DownloadValidationManager;
|
||||
import net.osmand.plus.download.IndexItem;
|
||||
import net.osmand.plus.download.ui.DownloadDescriptionInfo.ActionButton;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseListener;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseTaskType;
|
||||
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import org.json.JSONException;
|
||||
|
@ -68,6 +58,10 @@ import java.util.HashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static net.osmand.plus.download.ui.DownloadItemFragment.updateActionButtons;
|
||||
import static net.osmand.plus.download.ui.DownloadItemFragment.updateDescription;
|
||||
import static net.osmand.plus.download.ui.DownloadItemFragment.updateImagesPager;
|
||||
|
||||
public class DownloadResourceGroupFragment extends DialogFragment implements DownloadEvents,
|
||||
InAppPurchaseListener, OnChildClickListener {
|
||||
public static final int RELOAD_ID = 0;
|
||||
|
@ -254,40 +248,17 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
|
|||
if (descriptionView != null) {
|
||||
if (group != null && group.getRegion() instanceof CustomRegion) {
|
||||
CustomRegion customRegion = (CustomRegion) group.getRegion();
|
||||
DownloadDescriptionInfo downloadDescriptionInfo = customRegion.getDescriptionInfo();
|
||||
if (downloadDescriptionInfo != null) {
|
||||
DownloadDescriptionInfo descriptionInfo = customRegion.getDescriptionInfo();
|
||||
if (descriptionInfo != null) {
|
||||
OsmandApplication app = activity.getMyApplication();
|
||||
TextView description = descriptionView.findViewById(R.id.description);
|
||||
CharSequence descr = downloadDescriptionInfo.getLocalizedDescription(activity);
|
||||
description.setText(descr);
|
||||
AndroidUiHelper.updateVisibility(description, !Algorithms.isEmpty(descr));
|
||||
updateDescription(app, descriptionInfo, description);
|
||||
|
||||
ViewGroup buttonsContainer = descriptionView.findViewById(R.id.buttons_container);
|
||||
buttonsContainer.removeAllViews();
|
||||
for (final ActionButton actionButton : downloadDescriptionInfo.getActionButtons(activity)) {
|
||||
String name = actionButton.getName();
|
||||
if (!Algorithms.isEmpty(name)) {
|
||||
TextView buttonText = (TextView) activity.getLayoutInflater().inflate(R.layout.download_description_button, buttonsContainer, false);
|
||||
buttonText.setText(name);
|
||||
buttonText.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (actionButton.getUrl() != null) {
|
||||
WikipediaDialogFragment.showFullArticle(activity, Uri.parse(actionButton.getUrl()), nightMode);
|
||||
} else {
|
||||
activity.getMyApplication().showShortToastMessage(R.string.download_unsupported_action, actionButton.getActionType());
|
||||
}
|
||||
}
|
||||
});
|
||||
buttonsContainer.addView(buttonText);
|
||||
}
|
||||
}
|
||||
updateActionButtons(activity, descriptionInfo, null, buttonsContainer, R.layout.download_description_button, nightMode);
|
||||
|
||||
LockableViewPager viewPager = descriptionView.findViewById(R.id.images_pager);
|
||||
if (!Algorithms.isEmpty(downloadDescriptionInfo.getImageUrls())) {
|
||||
ImagesPagerAdapter adapter = new ImagesPagerAdapter(downloadDescriptionInfo.getImageUrls());
|
||||
viewPager.setAdapter(adapter);
|
||||
} else {
|
||||
viewPager.setVisibility(View.GONE);
|
||||
}
|
||||
updateImagesPager(app, descriptionInfo, viewPager);
|
||||
|
||||
descriptionView.findViewById(R.id.container).setVisibility(View.VISIBLE);
|
||||
return;
|
||||
|
@ -798,60 +769,4 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
|
|||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private class ImagesPagerAdapter extends PagerAdapter {
|
||||
|
||||
private PicassoUtils picassoUtils;
|
||||
|
||||
private List<String> imageUrls;
|
||||
|
||||
public ImagesPagerAdapter(List<String> imageUrls) {
|
||||
this.imageUrls = imageUrls;
|
||||
picassoUtils = PicassoUtils.getPicasso(getMyApplication());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return imageUrls.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
View view = createImageView(position);
|
||||
container.addView(view, 0);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup collection, int position, @NonNull Object view) {
|
||||
collection.removeView((View) view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
|
||||
return view == object;
|
||||
}
|
||||
|
||||
private View createImageView(int position) {
|
||||
final ImageView imageView = new ImageView(getContext());
|
||||
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
|
||||
|
||||
final String imageUrl = imageUrls.get(position);
|
||||
Picasso.get().load(imageUrl).into(imageView, new Callback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
imageView.setVisibility(View.VISIBLE);
|
||||
picassoUtils.setResultLoaded(imageUrl, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception e) {
|
||||
imageView.setVisibility(View.INVISIBLE);
|
||||
picassoUtils.setResultLoaded(imageUrl, false);
|
||||
}
|
||||
});
|
||||
return imageView;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package net.osmand.plus.download.ui;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.viewpager.widget.PagerAdapter;
|
||||
|
||||
import com.squareup.picasso.Callback;
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import net.osmand.PicassoUtils;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ImagesPagerAdapter extends PagerAdapter {
|
||||
|
||||
private OsmandApplication app;
|
||||
private PicassoUtils picassoUtils;
|
||||
|
||||
private List<String> imageUrls;
|
||||
|
||||
public ImagesPagerAdapter(@NonNull OsmandApplication app, List<String> imageUrls) {
|
||||
this.app = app;
|
||||
this.imageUrls = imageUrls;
|
||||
picassoUtils = PicassoUtils.getPicasso(app);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return imageUrls.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
View view = createImageView(position);
|
||||
container.addView(view, 0);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup collection, int position, @NonNull Object view) {
|
||||
collection.removeView((View) view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
|
||||
return view == object;
|
||||
}
|
||||
|
||||
private View createImageView(int position) {
|
||||
final ImageView imageView = new ImageView(app);
|
||||
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
|
||||
|
||||
final String imageUrl = imageUrls.get(position);
|
||||
Picasso.get().load(imageUrl).into(imageView, new Callback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
imageView.setVisibility(View.VISIBLE);
|
||||
picassoUtils.setResultLoaded(imageUrl, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception e) {
|
||||
imageView.setVisibility(View.INVISIBLE);
|
||||
picassoUtils.setResultLoaded(imageUrl, false);
|
||||
}
|
||||
});
|
||||
return imageView;
|
||||
}
|
||||
}
|
|
@ -27,6 +27,7 @@ import net.osmand.plus.activities.LocalIndexHelper.LocalIndexType;
|
|||
import net.osmand.plus.activities.LocalIndexInfo;
|
||||
import net.osmand.plus.chooseplan.ChoosePlanDialogFragment;
|
||||
import net.osmand.plus.download.CityItem;
|
||||
import net.osmand.plus.download.CustomIndexItem;
|
||||
import net.osmand.plus.download.DownloadActivity;
|
||||
import net.osmand.plus.download.DownloadActivityType;
|
||||
import net.osmand.plus.download.DownloadResourceGroup;
|
||||
|
@ -179,22 +180,24 @@ public class ItemViewHolder {
|
|||
if (!isDownloading) {
|
||||
progressBar.setVisibility(View.GONE);
|
||||
descrTextView.setVisibility(View.VISIBLE);
|
||||
if (indexItem.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE && !depthContoursPurchased) {
|
||||
if (indexItem instanceof CustomIndexItem && (((CustomIndexItem) indexItem).getSubName(context) != null)) {
|
||||
descrTextView.setText(((CustomIndexItem) indexItem).getSubName(context));
|
||||
} else if (indexItem.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE && !depthContoursPurchased) {
|
||||
descrTextView.setText(context.getString(R.string.depth_contour_descr));
|
||||
} else if ((indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE
|
||||
|| indexItem.getType() == DownloadActivityType.HILLSHADE_FILE
|
||||
|| indexItem.getType() == DownloadActivityType.SLOPE_FILE) && srtmDisabled) {
|
||||
if(showTypeInName) {
|
||||
if (showTypeInName) {
|
||||
descrTextView.setText("");
|
||||
} else {
|
||||
descrTextView.setText(indexItem.getType().getString(context));
|
||||
}
|
||||
} else if (showTypeInDesc) {
|
||||
descrTextView.setText(indexItem.getType().getString(context) +
|
||||
descrTextView.setText(indexItem.getType().getString(context) +
|
||||
" • " + indexItem.getSizeDescription(context) +
|
||||
" • " + (showRemoteDate ? indexItem.getRemoteDate(dateFormat) : indexItem.getLocalDate(dateFormat)));
|
||||
} else {
|
||||
descrTextView.setText(indexItem.getSizeDescription(context) + " • " +
|
||||
descrTextView.setText(indexItem.getSizeDescription(context) + " • " +
|
||||
(showRemoteDate ? indexItem.getRemoteDate(dateFormat) : indexItem.getLocalDate(dateFormat)));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue