refactoring p.2

This commit is contained in:
nazar-kutz 2021-04-13 00:42:16 +03:00
parent e3c257b255
commit 1ec3189a86
8 changed files with 300 additions and 161 deletions

View file

@ -29,7 +29,6 @@ import java.util.Map;
import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT;
import static net.osmand.plus.activities.LocalIndexHelper.LocalIndexType.SRTM_DATA; import static net.osmand.plus.activities.LocalIndexHelper.LocalIndexType.SRTM_DATA;
import static net.osmand.plus.download.SelectIndexesUiHelper.getSRTMExt;
public class DownloadActivityType { public class DownloadActivityType {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.US); private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.US);
@ -231,7 +230,7 @@ public class DownloadActivityType {
} else if (FONT_FILE == this) { } else if (FONT_FILE == this) {
return IndexConstants.FONT_INDEX_EXT; return IndexConstants.FONT_INDEX_EXT;
} else if (SRTM_COUNTRY_FILE == this) { } else if (SRTM_COUNTRY_FILE == this) {
return getSRTMExt(indexItem); return SrtmDownloadItem.getExtension(indexItem);
} else if (WIKIPEDIA_FILE == this) { } else if (WIKIPEDIA_FILE == this) {
return IndexConstants.BINARY_WIKI_MAP_INDEX_EXT; return IndexConstants.BINARY_WIKI_MAP_INDEX_EXT;
} else if (WIKIVOYAGE_FILE == this) { } else if (WIKIVOYAGE_FILE == this) {
@ -427,7 +426,7 @@ public class DownloadActivityType {
} }
String baseNameWithoutVersion = fileName.substring(0, l); String baseNameWithoutVersion = fileName.substring(0, l);
if (this == SRTM_COUNTRY_FILE) { if (this == SRTM_COUNTRY_FILE) {
return baseNameWithoutVersion + getSRTMExt(item); return baseNameWithoutVersion + SrtmDownloadItem.getExtension(item);
} }
if (this == WIKIPEDIA_FILE) { if (this == WIKIPEDIA_FILE) {
return baseNameWithoutVersion + IndexConstants.BINARY_WIKI_MAP_INDEX_EXT; return baseNameWithoutVersion + IndexConstants.BINARY_WIKI_MAP_INDEX_EXT;
@ -505,14 +504,4 @@ public class DownloadActivityType {
return fileName; return fileName;
} }
public static boolean isSRTMItem(Object item) {
if (item instanceof IndexItem) {
return ((IndexItem) item).getType() == SRTM_COUNTRY_FILE;
} else if (item instanceof DownloadItem) {
return ((DownloadItem) item).getType() == SRTM_COUNTRY_FILE;
} else if (item instanceof LocalIndexInfo) {
return ((LocalIndexInfo) item).getType() == SRTM_DATA;
}
return false;
}
} }

View file

@ -471,14 +471,49 @@ public class DownloadResources extends DownloadResourceGroup {
addGroup(otherGroup); addGroup(otherGroup);
createHillshadeSRTMGroups(); createHillshadeSRTMGroups();
collectMultipleIndexesItems(); replaceIndividualSrtmWithGroups(region);
collectMultipleIndexesItems(region);
trimEmptyGroups(); trimEmptyGroups();
updateLoadedFiles(); updateLoadedFiles();
return true; return true;
} }
private void collectMultipleIndexesItems() { private void replaceIndividualSrtmWithGroups(@NonNull WorldRegion region) {
collectMultipleIndexesItems(region); DownloadResourceGroup group = getRegionMapsGroup(region);
if (group != null) {
boolean useMetersByDefault = SrtmDownloadItem.shouldUseMetersByDefault(app);
boolean listModified = false;
DownloadActivityType srtmType = DownloadActivityType.SRTM_COUNTRY_FILE;
List<IndexItem> indexesList = group.getIndividualResources();
List<DownloadItem> individualDownloadItems = group.getIndividualDownloadItems();
if (doesListContainIndexWithType(indexesList, srtmType)) {
IndexItem meters = null;
IndexItem feet = null;
for (IndexItem item : indexesList) {
if (item.getType() == srtmType) {
if (SrtmDownloadItem.isMetersItem(item)) {
meters = item;
} else {
feet = item;
}
}
}
individualDownloadItems.remove(meters);
individualDownloadItems.remove(feet);
group.addItem(new SrtmDownloadItem(meters, feet, useMetersByDefault));
listModified = true;
}
if (listModified) {
sortDownloadItems(individualDownloadItems);
}
}
List<WorldRegion> subRegions = region.getSubregions();
if (!Algorithms.isEmpty(subRegions)) {
for (WorldRegion subRegion : subRegions) {
replaceIndividualSrtmWithGroups(subRegion);
}
}
} }
private void collectMultipleIndexesItems(@NonNull WorldRegion region) { private void collectMultipleIndexesItems(@NonNull WorldRegion region) {

View file

@ -12,7 +12,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE;
import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMItem;
public class MultipleIndexItem extends DownloadItem { public class MultipleIndexItem extends DownloadItem {
@ -121,7 +120,8 @@ public class MultipleIndexItem extends DownloadItem {
if (this.type == SRTM_COUNTRY_FILE) { if (this.type == SRTM_COUNTRY_FILE) {
for (IndexItem item : items) { for (IndexItem item : items) {
if (item.hasActualDataToDownload()) { if (item.hasActualDataToDownload()) {
if (baseSRTM && isBaseSRTMItem(item) || !baseSRTM && !isBaseSRTMItem(item)) { boolean isBase = SrtmDownloadItem.isMetersItem(item);
if (baseSRTM && isBase || !baseSRTM && !isBase) {
totalSizeMb += item.getSizeToDownloadInMb(); totalSizeMb += item.getSizeToDownloadInMb();
} }
} }

View file

@ -6,11 +6,9 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import net.osmand.IndexConstants;
import net.osmand.map.OsmandRegions; import net.osmand.map.OsmandRegions;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.LocalIndexInfo;
import net.osmand.plus.base.SelectMultipleItemsBottomSheet; import net.osmand.plus.base.SelectMultipleItemsBottomSheet;
import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectionUpdateListener; import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectionUpdateListener;
import net.osmand.plus.base.SelectModeBottomSheet; import net.osmand.plus.base.SelectModeBottomSheet;
@ -19,7 +17,6 @@ import net.osmand.plus.base.SelectionBottomSheet;
import net.osmand.plus.base.SelectionBottomSheet.OnApplySelectionListener; import net.osmand.plus.base.SelectionBottomSheet.OnApplySelectionListener;
import net.osmand.plus.base.SelectionBottomSheet.OnUiInitializedListener; import net.osmand.plus.base.SelectionBottomSheet.OnUiInitializedListener;
import net.osmand.plus.base.SelectionBottomSheet.SelectableItem; import net.osmand.plus.base.SelectionBottomSheet.SelectableItem;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.widgets.MultiStateToggleButton.OnRadioItemClickListener; import net.osmand.plus.widgets.MultiStateToggleButton.OnRadioItemClickListener;
import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -29,35 +26,56 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT;
import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP;
import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE;
public class SelectIndexesUiHelper { public class SelectIndexesUiHelper {
public static void showDialog(@NonNull DownloadItem item, private OsmandApplication app;
private AppCompatActivity activity;
private DateFormat dateFormat;
private boolean showRemoteDate;
private DownloadItem downloadItem;
private SelectItemsToDownloadListener listener;
private SelectionBottomSheet dialog;
private SelectIndexesUiHelper(@NonNull DownloadItem item,
@NonNull AppCompatActivity activity, @NonNull AppCompatActivity activity,
@NonNull final OsmandApplication app,
@NonNull DateFormat dateFormat, @NonNull DateFormat dateFormat,
boolean showRemoteDate, boolean showRemoteDate,
@NonNull final SelectItemsToDownloadListener listener) { @NonNull SelectItemsToDownloadListener listener) {
if (item.getType() == SRTM_COUNTRY_FILE) { this.activity = activity;
if (item instanceof MultipleIndexItem) { this.app = (OsmandApplication) activity.getApplicationContext();
showMultipleSrtmDialog(item, activity, app, dateFormat, showRemoteDate, listener); this.downloadItem = item;
this.dateFormat = dateFormat;
this.showRemoteDate = showRemoteDate;
this.listener = listener;
}
public static void showDialog(@NonNull DownloadItem item,
@NonNull AppCompatActivity activity,
@NonNull DateFormat dateFormat,
boolean showRemoteDate,
@NonNull SelectItemsToDownloadListener listener) {
SelectIndexesUiHelper helper =
new SelectIndexesUiHelper(item, activity, dateFormat, showRemoteDate, listener);
helper.showDialogInternal();
}
private void showDialogInternal() {
if (downloadItem.getType() == SRTM_COUNTRY_FILE) {
if (downloadItem instanceof MultipleIndexItem) {
showMultipleSrtmDialog();
} else { } else {
showSingleSrtmDialog(item, activity, app, dateFormat, showRemoteDate, listener); showSingleSrtmDialog();
} }
} else if (item instanceof MultipleIndexItem) { } else if (downloadItem instanceof MultipleIndexItem) {
showBaseDialog((MultipleIndexItem) item, activity, app, dateFormat, showRemoteDate, listener); showBaseDialog();
} }
} }
public static void showBaseDialog(@NonNull MultipleIndexItem multipleIndexItem, private void showBaseDialog() {
@NonNull AppCompatActivity activity, MultipleIndexItem multipleIndexItem = (MultipleIndexItem) downloadItem;
@NonNull final OsmandApplication app,
@NonNull DateFormat dateFormat,
boolean showRemoteDate,
@NonNull final SelectItemsToDownloadListener listener) {
List<IndexItem> indexesToDownload = getIndexesToDownload(multipleIndexItem); List<IndexItem> indexesToDownload = getIndexesToDownload(multipleIndexItem);
List<SelectableItem> allItems = new ArrayList<>(); List<SelectableItem> allItems = new ArrayList<>();
List<SelectableItem> selectedItems = new ArrayList<>(); List<SelectableItem> selectedItems = new ArrayList<>();
@ -65,10 +83,12 @@ public class SelectIndexesUiHelper {
for (IndexItem indexItem : multipleIndexItem.getAllIndexes()) { for (IndexItem indexItem : multipleIndexItem.getAllIndexes()) {
SelectableItem selectableItem = new SelectableItem(); SelectableItem selectableItem = new SelectableItem();
selectableItem.setTitle(indexItem.getVisibleName(app, osmandRegions, false)); selectableItem.setTitle(indexItem.getVisibleName(app, osmandRegions, false));
String size = indexItem.getSizeDescription(app); String size = indexItem.getSizeDescription(app);
String date = indexItem.getDate(dateFormat, showRemoteDate); String date = indexItem.getDate(dateFormat, showRemoteDate);
String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date); String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date);
selectableItem.setDescription(description); selectableItem.setDescription(description);
selectableItem.setIconId(indexItem.getType().getIconResource()); selectableItem.setIconId(indexItem.getType().getIconResource());
selectableItem.setObject(indexItem); selectableItem.setObject(indexItem);
allItems.add(selectableItem); allItems.add(selectableItem);
@ -91,90 +111,37 @@ public class SelectIndexesUiHelper {
dialog.setSelectionUpdateListener(new SelectionUpdateListener() { dialog.setSelectionUpdateListener(new SelectionUpdateListener() {
@Override @Override
public void onSelectionUpdate() { public void onSelectionUpdate() {
updateSize(app, dialog, true); updateSize(dialog, true);
} }
}); });
dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener));
} }
public static void showSingleSrtmDialog(@NonNull final DownloadItem downloadItem, private void showSingleSrtmDialog() {
@NonNull AppCompatActivity activity, boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app);
@NonNull final OsmandApplication app, SrtmDownloadItem srtmItem = (SrtmDownloadItem) downloadItem;
@NonNull final DateFormat dateFormat,
final boolean showRemoteDate, SelectableItem meterItem = createSrtmSelectableItem(srtmItem.getMeterItem());
@NonNull final SelectItemsToDownloadListener listener) { SelectableItem feetItem = createSrtmSelectableItem(srtmItem.getFeetItem());
List<IndexItem> allIndexes = getIndexesToDownload(downloadItem);
boolean baseSRTM = isBaseSRTMMetricSystem(app);
List<RadioItem> radioItems = new ArrayList<>(); List<RadioItem> radioItems = new ArrayList<>();
final RadioItem meters = new RadioItem(Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_meters))); RadioItem meters = createRadioItem(meterItem, R.string.shared_string_meters);
RadioItem feet = new RadioItem(Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_feets))); RadioItem feet = createRadioItem(feetItem, R.string.shared_string_feets);
radioItems.add(meters); radioItems.add(meters);
radioItems.add(feet); radioItems.add(feet);
SelectableItem meterItem = null;
SelectableItem feetItem = null;
for (IndexItem indexItem : allIndexes) {
boolean baseItem = isBaseSRTMItem(indexItem);
SelectableItem selectableItem = new SelectableItem();
selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false));
String size = indexItem.getSizeDescription(app);
size += " (" + getSRTMAbbrev(app, baseItem) + ")";
String date = indexItem.getDate(dateFormat, showRemoteDate);
String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date);
selectableItem.setDescription(description);
selectableItem.setIconId(indexItem.getType().getIconResource());
selectableItem.setObject(indexItem);
if (baseItem) {
meterItem = selectableItem;
} else {
feetItem = selectableItem;
}
}
final SelectableItem initMeter = meterItem; dialog = SelectModeBottomSheet.showInstance(activity,
final SelectableItem initFeet = feetItem;
final SelectModeBottomSheet dialog = SelectModeBottomSheet.showInstance(activity,
baseSRTM ? meterItem : feetItem, radioItems, true); baseSRTM ? meterItem : feetItem, radioItems, true);
meters.setOnClickListener(new OnRadioItemClickListener() {
@Override
public boolean onRadioItemClick(RadioItem radioItem, View view) {
dialog.setPreviewItem(initMeter);
updateSize(app, dialog, false);
return true;
}
});
feet.setOnClickListener(new OnRadioItemClickListener() {
@Override
public boolean onRadioItemClick(RadioItem radioItem, View view) {
dialog.setPreviewItem(initFeet);
double sizeToDownload = getDownloadSizeInMb(Collections.singletonList(initFeet));
String size = DownloadItem.getFormattedMb(app, sizeToDownload);
String btnTitle = app.getString(R.string.shared_string_download);
if (sizeToDownload > 0) {
btnTitle = app.getString(R.string.ltr_or_rtl_combine_via_dash, btnTitle, size);
}
dialog.setApplyButtonTitle(btnTitle);
return true;
}
});
final RadioItem initRadio = baseSRTM ? meters : feet; final RadioItem initRadio = baseSRTM ? meters : feet;
final SelectableItem initItem = baseSRTM ? meterItem : feetItem;
dialog.setUiInitializedListener(new OnUiInitializedListener() { dialog.setUiInitializedListener(new OnUiInitializedListener() {
@Override @Override
public void onUiInitialized() { public void onUiInitialized() {
SelectModeBottomSheet dialog = (SelectModeBottomSheet) SelectIndexesUiHelper.this.dialog;
dialog.setTitle(app.getString(R.string.srtm_unit_format)); dialog.setTitle(app.getString(R.string.srtm_unit_format));
dialog.setDescription(app.getString(R.string.srtm_download_single_help_message)); dialog.setDescription(app.getString(R.string.srtm_download_single_help_message));
double sizeToDownload = getDownloadSizeInMb(Collections.singletonList(initFeet)); updateSize(dialog, false);
String size = DownloadItem.getFormattedMb(app, sizeToDownload);
String btnTitle = app.getString(R.string.shared_string_download);
if (sizeToDownload > 0) {
btnTitle = app.getString(R.string.ltr_or_rtl_combine_via_dash, btnTitle, size);
}
dialog.setApplyButtonTitle(btnTitle);
dialog.setSelectedMode(initRadio); dialog.setSelectedMode(initRadio);
} }
}); });
@ -182,17 +149,40 @@ public class SelectIndexesUiHelper {
dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener));
} }
public static void showMultipleSrtmDialog(@NonNull final DownloadItem downloadItem, private SelectableItem createSrtmSelectableItem(IndexItem indexItem) {
@NonNull AppCompatActivity activity, boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem);
@NonNull final OsmandApplication app, SelectableItem selectableItem = new SelectableItem();
@NonNull final DateFormat dateFormat, selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false));
final boolean showRemoteDate, String size = indexItem.getSizeDescription(app);
@NonNull final SelectItemsToDownloadListener listener) { size += " (" + SrtmDownloadItem.getAbbreviation(app, baseItem) + ")";
String date = indexItem.getDate(dateFormat, showRemoteDate);
String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date);
selectableItem.setDescription(description);
selectableItem.setIconId(indexItem.getType().getIconResource());
selectableItem.setObject(indexItem);
return selectableItem;
}
private RadioItem createRadioItem(final SelectableItem selectableItem, int titleId) {
String title = Algorithms.capitalizeFirstLetter(app.getString(titleId));
RadioItem radioItem = new RadioItem(title);
radioItem.setOnClickListener(new OnRadioItemClickListener() {
@Override
public boolean onRadioItemClick(RadioItem radioItem, View view) {
((SelectModeBottomSheet)dialog).setPreviewItem(selectableItem);
updateSize(dialog, false);
return true;
}
});
return radioItem;
}
private void showMultipleSrtmDialog() {
List<SelectableItem> selectedItems = new ArrayList<>(); List<SelectableItem> selectedItems = new ArrayList<>();
final List<SelectableItem> meterItems = new ArrayList<>(); final List<SelectableItem> meterItems = new ArrayList<>();
final List<SelectableItem> feetItems = new ArrayList<>(); final List<SelectableItem> feetItems = new ArrayList<>();
List<IndexItem> indexesToDownload = getIndexesToDownload(downloadItem); List<IndexItem> indexesToDownload = getIndexesToDownload(downloadItem);
boolean baseSRTM = isBaseSRTMMetricSystem(app); boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app);
List<IndexItem> allIndexes = new ArrayList<>(); List<IndexItem> allIndexes = new ArrayList<>();
if (downloadItem instanceof MultipleIndexItem) { if (downloadItem instanceof MultipleIndexItem) {
@ -206,11 +196,11 @@ public class SelectIndexesUiHelper {
} }
for (IndexItem indexItem : allIndexes) { for (IndexItem indexItem : allIndexes) {
boolean baseItem = isBaseSRTMItem(indexItem); boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem);
SelectableItem selectableItem = new SelectableItem(); SelectableItem selectableItem = new SelectableItem();
selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false));
String size = indexItem.getSizeDescription(app); String size = indexItem.getSizeDescription(app);
size += " (" + getSRTMAbbrev(app, baseItem) + ")"; size += " (" + SrtmDownloadItem.getAbbreviation(app, baseItem) + ")";
String date = indexItem.getDate(dateFormat, showRemoteDate); String date = indexItem.getDate(dateFormat, showRemoteDate);
String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date); String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date);
selectableItem.setDescription(description); selectableItem.setDescription(description);
@ -232,7 +222,7 @@ public class SelectIndexesUiHelper {
List<RadioItem> radioItems = new ArrayList<>(); List<RadioItem> radioItems = new ArrayList<>();
RadioItem meters = new RadioItem(Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_meters))); RadioItem meters = new RadioItem(Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_meters)));
RadioItem feet = new RadioItem(Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_feets))); RadioItem feet = new RadioItem(Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_feets)));
final RadioItem selectedMode = isBaseSRTMItem(downloadItem) ? meters : feet; final RadioItem selectedMode = SrtmDownloadItem.isMetersItem(downloadItem) ? meters : feet;
radioItems.add(meters); radioItems.add(meters);
radioItems.add(feet); radioItems.add(feet);
@ -267,13 +257,13 @@ public class SelectIndexesUiHelper {
dialog.setSelectionUpdateListener(new SelectionUpdateListener() { dialog.setSelectionUpdateListener(new SelectionUpdateListener() {
@Override @Override
public void onSelectionUpdate() { public void onSelectionUpdate() {
updateSize(app, dialog, true); updateSize(dialog, true);
} }
}); });
dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener));
} }
private static OnApplySelectionListener getOnApplySelectionListener(final SelectItemsToDownloadListener listener) { private OnApplySelectionListener getOnApplySelectionListener(final SelectItemsToDownloadListener listener) {
return new OnApplySelectionListener() { return new OnApplySelectionListener() {
@Override @Override
public void onSelectionApplied(List<SelectableItem> selectedItems) { public void onSelectionApplied(List<SelectableItem> selectedItems) {
@ -289,9 +279,8 @@ public class SelectIndexesUiHelper {
}; };
} }
private static void updateSize(OsmandApplication app, private void updateSize(SelectionBottomSheet dialog,
SelectionBottomSheet dialog, boolean updateDescription) {
boolean updateDescription) {
double sizeToDownload = getDownloadSizeInMb(dialog.getSelection()); double sizeToDownload = getDownloadSizeInMb(dialog.getSelection());
String size = DownloadItem.getFormattedMb(app, sizeToDownload); String size = DownloadItem.getFormattedMb(app, sizeToDownload);
if (updateDescription) { if (updateDescription) {
@ -306,28 +295,6 @@ public class SelectIndexesUiHelper {
dialog.setApplyButtonTitle(btnTitle); dialog.setApplyButtonTitle(btnTitle);
} }
public static String getSRTMAbbrev(Context context, boolean base) {
return context.getString(base ? R.string.m : R.string.foot);
}
public static String getSRTMExt(IndexItem indexItem) {
return isBaseSRTMItem(indexItem)
? IndexConstants.BINARY_SRTM_MAP_INDEX_EXT : IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT;
}
public static boolean isBaseSRTMItem(Object item) {
if (item instanceof IndexItem) {
return ((IndexItem) item).getFileName().endsWith(BINARY_SRTM_MAP_INDEX_EXT_ZIP);
} else if (item instanceof LocalIndexInfo) {
return ((LocalIndexInfo) item).getFileName().endsWith(BINARY_SRTM_MAP_INDEX_EXT);
}
return false;
}
public static boolean isBaseSRTMMetricSystem(OsmandApplication app) {
return app.getSettings().METRIC_SYSTEM.get() != MetricsConstants.MILES_AND_FEET;
}
private static List<IndexItem> getIndexesToDownload(DownloadItem downloadItem) { private static List<IndexItem> getIndexesToDownload(DownloadItem downloadItem) {
if (downloadItem instanceof MultipleIndexItem) { if (downloadItem instanceof MultipleIndexItem) {
if (downloadItem.hasActualDataToDownload()) { if (downloadItem.hasActualDataToDownload()) {

View file

@ -0,0 +1,137 @@
package net.osmand.plus.download;
import android.content.Context;
import androidx.annotation.NonNull;
import net.osmand.IndexConstants;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.LocalIndexInfo;
import net.osmand.plus.helpers.enums.MetricsConstants;
import java.io.File;
import java.text.DateFormat;
import java.util.List;
import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT;
import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP;
import static net.osmand.plus.activities.LocalIndexHelper.LocalIndexType.SRTM_DATA;
import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE;
public class SrtmDownloadItem extends DownloadItem {
private IndexItem meterItem;
private IndexItem feetItem;
private boolean useMetersByDefault;
public SrtmDownloadItem(IndexItem meterItem,
IndexItem feetItem,
boolean useMetersByDefault) {
super(SRTM_COUNTRY_FILE);
this.meterItem = meterItem;
this.feetItem = feetItem;
this.useMetersByDefault = useMetersByDefault;
}
public boolean isUseMetersByDefault() {
return useMetersByDefault;
}
public void setUseMetersByDefault(boolean useMetersByDefault) {
this.useMetersByDefault = useMetersByDefault;
}
public IndexItem getIndexItem() {
return useMetersByDefault ? getMeterItem() : getFeetItem();
}
public IndexItem getMeterItem() {
return meterItem;
}
public IndexItem getFeetItem() {
return feetItem;
}
@Override
protected double getSizeToDownloadInMb() {
return getIndexItem().getSizeToDownloadInMb();
}
@Override
public double getArchiveSizeMB() {
return getIndexItem().getArchiveSizeMB();
}
@Override
public boolean isDownloaded() {
return getIndexItem().isDownloaded();
}
@Override
public boolean isOutdated() {
return getIndexItem().isOutdated();
}
@Override
public boolean hasActualDataToDownload() {
return getIndexItem().hasActualDataToDownload();
}
@Override
public boolean isDownloading(@NonNull DownloadIndexesThread thread) {
return getMeterItem().isDownloading(thread) || getFeetItem().isDownloading(thread);
}
@Override
public String getFileName() {
return getIndexItem().getFileName();
}
@NonNull
@Override
public List<File> getDownloadedFiles(@NonNull OsmandApplication app) {
return getIndexItem().getDownloadedFiles(app);
}
public String getDate(@NonNull DateFormat dateFormat, boolean remote) {
return getIndexItem().getDate(dateFormat, remote);
}
public static boolean shouldUseMetersByDefault(@NonNull OsmandApplication app) {
return app.getSettings().METRIC_SYSTEM.get() != MetricsConstants.MILES_AND_FEET;
}
public static String getAbbreviation(Context context, boolean base) {
return context.getString(base ? R.string.m : R.string.foot);
}
public static String getExtension(IndexItem indexItem) {
return isMetersItem(indexItem) ?
IndexConstants.BINARY_SRTM_MAP_INDEX_EXT :
IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT;
}
public static boolean isMetersItem(Object item) {
if (item instanceof IndexItem) {
return ((IndexItem) item).getFileName().endsWith(BINARY_SRTM_MAP_INDEX_EXT_ZIP);
} else if (item instanceof LocalIndexInfo) {
return ((LocalIndexInfo) item).getFileName().endsWith(BINARY_SRTM_MAP_INDEX_EXT);
}
return false;
}
public static boolean isSRTMItem(Object item) {
if (item instanceof IndexItem) {
return ((IndexItem) item).getType() == SRTM_COUNTRY_FILE;
} else if (item instanceof DownloadItem) {
return ((DownloadItem) item).getType() == SRTM_COUNTRY_FILE;
} else if (item instanceof LocalIndexInfo) {
return ((LocalIndexInfo) item).getType() == SRTM_DATA;
}
return false;
}
}

View file

@ -44,6 +44,7 @@ import net.osmand.plus.download.IndexItem;
import net.osmand.plus.download.SelectIndexesUiHelper; import net.osmand.plus.download.SelectIndexesUiHelper;
import net.osmand.plus.download.SelectIndexesUiHelper.SelectItemsToDownloadListener; import net.osmand.plus.download.SelectIndexesUiHelper.SelectItemsToDownloadListener;
import net.osmand.plus.download.MultipleIndexItem; import net.osmand.plus.download.MultipleIndexItem;
import net.osmand.plus.download.SrtmDownloadItem;
import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask; import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask;
import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.inapp.InAppPurchaseHelper;
@ -55,10 +56,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE;
import static net.osmand.plus.download.DownloadActivityType.isSRTMItem;
import static net.osmand.plus.download.SelectIndexesUiHelper.getSRTMAbbrev;
import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMItem;
import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMMetricSystem;
public class ItemViewHolder { public class ItemViewHolder {
@ -196,8 +193,8 @@ public class ItemViewHolder {
} }
descrTextView.setTextColor(textColorSecondary); descrTextView.setTextColor(textColorSecondary);
if (!isDownloading) { if (!isDownloading) {
boolean srtmItem = isSRTMItem(downloadItem); boolean srtmItem = SrtmDownloadItem.isSRTMItem(downloadItem);
boolean baseMetricSystem = isBaseSRTMMetricSystem(context.getMyApplication()); boolean baseMetricSystem = SrtmDownloadItem.shouldUseMetersByDefault(context.getMyApplication());
progressBar.setVisibility(View.GONE); progressBar.setVisibility(View.GONE);
descrTextView.setVisibility(View.VISIBLE); descrTextView.setVisibility(View.VISIBLE);
if (downloadItem instanceof CustomIndexItem && (((CustomIndexItem) downloadItem).getSubName(context) != null)) { if (downloadItem instanceof CustomIndexItem && (((CustomIndexItem) downloadItem).getSubName(context) != null)) {
@ -218,10 +215,10 @@ public class ItemViewHolder {
String regionsHeader = context.getString(R.string.regions); String regionsHeader = context.getString(R.string.regions);
String allRegionsCount; String allRegionsCount;
String leftToDownloadCount; String leftToDownloadCount;
if (isSRTMItem(item)) { if (SrtmDownloadItem.isSRTMItem(item)) {
List<IndexItem> items = new ArrayList<>(); List<IndexItem> items = new ArrayList<>();
for (IndexItem indexItem : item.getAllIndexes()) { for (IndexItem indexItem : item.getAllIndexes()) {
boolean baseItem = isBaseSRTMItem(indexItem); boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem);
if (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem) { if (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem) {
items.add(indexItem); items.add(indexItem);
} }
@ -229,7 +226,7 @@ public class ItemViewHolder {
allRegionsCount = String.valueOf(items.size()); allRegionsCount = String.valueOf(items.size());
items.clear(); items.clear();
for (IndexItem indexItem : item.getIndexesToDownload()) { for (IndexItem indexItem : item.getIndexesToDownload()) {
boolean baseItem = isBaseSRTMItem(indexItem); boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem);
if (!indexItem.isDownloaded() if (!indexItem.isDownloaded()
&& (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem)) { && (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem)) {
items.add(indexItem); items.add(indexItem);
@ -259,7 +256,7 @@ public class ItemViewHolder {
} }
String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count); String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count);
if (srtmItem) { if (srtmItem) {
fullDescription += " (" + getSRTMAbbrev(context, baseMetricSystem) + ")"; fullDescription += " (" + SrtmDownloadItem.getAbbreviation(context, baseMetricSystem) + ")";
} }
if (item.hasActualDataToDownload()) { if (item.hasActualDataToDownload()) {
fullDescription = context.getString( fullDescription = context.getString(
@ -267,14 +264,23 @@ public class ItemViewHolder {
? item.getSizeDescription(context, baseMetricSystem) : item.getSizeDescription(context)); ? item.getSizeDescription(context, baseMetricSystem) : item.getSizeDescription(context));
} }
descrTextView.setText(fullDescription); descrTextView.setText(fullDescription);
} else if (downloadItem instanceof SrtmDownloadItem) {
SrtmDownloadItem item = (SrtmDownloadItem) downloadItem;
String pattern = context.getString(R.string.ltr_or_rtl_combine_via_bold_point);
String type = item.getType().getString(context);
String size = item.getSizeDescription(context)
+ " (" + SrtmDownloadItem.getAbbreviation(context, SrtmDownloadItem.isMetersItem(item)) + ")";
String date = item.getDate(dateFormat, showRemoteDate);
String fullDescription = String.format(pattern, size, date);
if (showTypeInDesc) {
fullDescription = String.format(pattern, type, fullDescription);
}
descrTextView.setText(fullDescription);
} else { } else {
IndexItem item = (IndexItem) downloadItem; IndexItem item = (IndexItem) downloadItem;
String pattern = context.getString(R.string.ltr_or_rtl_combine_via_bold_point); String pattern = context.getString(R.string.ltr_or_rtl_combine_via_bold_point);
String type = item.getType().getString(context); String type = item.getType().getString(context);
String size = item.getSizeDescription(context); String size = item.getSizeDescription(context);
if (srtmItem) {
size += " (" + getSRTMAbbrev(context, isBaseSRTMItem(item)) + ")";
}
String date = item.getDate(dateFormat, showRemoteDate); String date = item.getDate(dateFormat, showRemoteDate);
String fullDescription = String.format(pattern, size, date); String fullDescription = String.format(pattern, size, date);
if (showTypeInDesc) { if (showTypeInDesc) {
@ -522,8 +528,7 @@ public class ItemViewHolder {
} }
private void selectIndexesToDownload(DownloadItem item) { private void selectIndexesToDownload(DownloadItem item) {
OsmandApplication app = context.getMyApplication(); SelectIndexesUiHelper.showDialog(item, context, dateFormat, showRemoteDate,
SelectIndexesUiHelper.showDialog(item, context, app, dateFormat, showRemoteDate,
new SelectItemsToDownloadListener() { new SelectItemsToDownloadListener() {
@Override @Override
public void onItemsToDownloadSelected(List<IndexItem> indexes) { public void onItemsToDownloadSelected(List<IndexItem> indexes) {

View file

@ -55,6 +55,7 @@ import net.osmand.plus.dialogs.DirectionsDialogs;
import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents; import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
import net.osmand.plus.download.IndexItem; import net.osmand.plus.download.IndexItem;
import net.osmand.plus.download.SrtmDownloadItem;
import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.mapsource.EditMapSourceDialogFragment.OnMapSourceUpdateListener; import net.osmand.plus.mapsource.EditMapSourceDialogFragment.OnMapSourceUpdateListener;
@ -74,9 +75,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import static net.osmand.plus.download.DownloadActivityType.isSRTMItem;
import static net.osmand.plus.download.SelectIndexesUiHelper.getSRTMAbbrev;
import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMItem;
public class LocalIndexesFragment extends OsmandExpandableListFragment implements DownloadEvents, public class LocalIndexesFragment extends OsmandExpandableListFragment implements DownloadEvents,
OnMapSourceUpdateListener, RenameCallback { OnMapSourceUpdateListener, RenameCallback {
@ -1034,8 +1032,8 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
builder.append(AndroidUtils.formatSize(ctx, child.getSize() * 1024l)); builder.append(AndroidUtils.formatSize(ctx, child.getSize() * 1024l));
} }
if (isSRTMItem(child)) { if (SrtmDownloadItem.isSRTMItem(child)) {
builder.append(" (").append(getSRTMAbbrev(ctx, isBaseSRTMItem(child))).append(")"); builder.append(" (").append(SrtmDownloadItem.getAbbreviation(ctx, SrtmDownloadItem.isMetersItem(child))).append(")");
} }
if (!Algorithms.isEmpty(child.getDescription())) { if (!Algorithms.isEmpty(child.getDescription())) {

View file

@ -18,6 +18,7 @@ import net.osmand.plus.UiUtilities;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.List; import java.util.List;
public class MultiStateToggleButton { public class MultiStateToggleButton {
@ -37,6 +38,13 @@ public class MultiStateToggleButton {
this.nightMode = nightMode; this.nightMode = nightMode;
} }
public void setItems(Collection<RadioItem> radioItems) {
if (radioItems == null || radioItems.size() < 2) return;
items.clear();
items.addAll(radioItems);
initView();
}
public void setItems(RadioItem firstBtn, RadioItem secondBtn, RadioItem... other) { public void setItems(RadioItem firstBtn, RadioItem secondBtn, RadioItem... other) {
items.clear(); items.clear();
items.add(firstBtn); items.add(firstBtn);