From 9368b7383a5647e285748c63a9db65bdd8d04b5f Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Mon, 12 Apr 2021 20:14:27 +0300 Subject: [PATCH 1/9] Refactoring SRTMf download ui, part 1 --- .../plus/base/SelectModeBottomSheet.java | 96 ++++ .../base/SelectMultipleItemsBottomSheet.java | 445 ++++-------------- .../SelectMultipleWithModeBottomSheet.java | 51 ++ .../plus/base/SelectionBottomSheet.java | 201 ++++++++ .../plus/download/DownloadActivityType.java | 2 +- .../plus/download/MultipleIndexItem.java | 2 +- ...Helper.java => SelectIndexesUiHelper.java} | 222 ++++++--- .../plus/download/ui/ItemViewHolder.java | 12 +- .../download/ui/LocalIndexesFragment.java | 4 +- 9 files changed, 600 insertions(+), 435 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java create mode 100644 OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java create mode 100644 OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java rename OsmAnd/src/net/osmand/plus/download/{MultipleIndexesUiHelper.java => SelectIndexesUiHelper.java} (52%) diff --git a/OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java new file mode 100644 index 0000000000..f1ecf92743 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java @@ -0,0 +1,96 @@ +package net.osmand.plus.base; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentManager; + +import net.osmand.AndroidUtils; +import net.osmand.plus.R; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; + +import java.util.Collections; +import java.util.List; + +public class SelectModeBottomSheet extends SelectionBottomSheet { + + public static final String TAG = SelectModeBottomSheet.class.getSimpleName(); + + private BottomSheetItemWithDescription previewUi; + + private List modes; + private SelectableItem previewItem; + + @Override + protected void initHeaderUi() { + radioGroup.setItems(modes); + + AndroidUiHelper.setVisibility(View.VISIBLE, secondaryDescription, toggleContainer); + + AndroidUiHelper.setVisibility(View.GONE, checkBox, checkBoxTitle, + primaryDescription, selectedSize, selectAllButton); + } + + @Override + protected void createSelectionUi() { + previewUi = (BottomSheetItemWithDescription) new BottomSheetItemWithDescription.Builder() + .setDescription(previewItem.getDescription()) + .setDescriptionColorId(AndroidUtils.getSecondaryTextColorId(nightMode)) + .setTitle(previewItem.getTitle()) + .setIcon(uiUtilities.getIcon(previewItem.getIconId(), activeColorRes)) + .setTag(previewItem) + .setLayoutId(R.layout.bottom_sheet_item_with_descr_56dp) + .create(); + items.add(previewUi); + } + + private void updatePreviewUi() { + previewUi.setTitle(previewItem.getTitle()); + previewUi.setIcon(uiUtilities.getIcon(previewItem.getIconId(), activeColorRes)); + previewUi.setDescription(previewItem.getDescription()); + previewUi.setTag(previewItem); + } + + private void setModes(@NonNull List modes) { + this.modes = modes; + } + + public void setSelectedMode(@NonNull RadioItem mode) { + radioGroup.setSelectedItem(mode); + } + + public void setPreviewItem(@NonNull SelectableItem preview) { + this.previewItem = preview; + if (previewUi != null) { + updatePreviewUi(); + } + } + + @Override + public void setDescription(@NonNull String description) { + secondaryDescription.setText(description); + } + + @NonNull + @Override + public List getSelection() { + return Collections.singletonList(previewItem); + } + + public static SelectModeBottomSheet showInstance(@NonNull AppCompatActivity activity, + @NonNull SelectableItem previewItem, + @NonNull List radioItems, + boolean usedOnMap) { + SelectModeBottomSheet fragment = new SelectModeBottomSheet(); + fragment.setUsedOnMap(usedOnMap); + fragment.setModes(radioItems); + fragment.setPreviewItem(previewItem); + FragmentManager fm = activity.getSupportFragmentManager(); + fragment.show(fm, TAG); + return fragment; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java index 7629f80169..ab8ae1f3e9 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java @@ -1,12 +1,7 @@ package net.osmand.plus.base; import android.content.res.ColorStateList; -import android.os.Bundle; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -16,22 +11,11 @@ import androidx.core.widget.CompoundButtonCompat; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; -import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.UiUtilities; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton.Builder; -import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; -import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; -import net.osmand.plus.base.bottomsheetmenu.simpleitems.SimpleDividerItem; -import net.osmand.plus.download.MultipleIndexesUiHelper.SelectedItemsListener; -import net.osmand.plus.helpers.AndroidUiHelper; -import net.osmand.plus.widgets.MultiStateToggleButton; -import net.osmand.plus.widgets.MultiStateToggleButton.OnRadioItemClickListener; -import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; import net.osmand.util.Algorithms; -import net.osmand.view.ThreeStateCheckbox; import java.util.ArrayList; import java.util.List; @@ -40,180 +24,68 @@ import static net.osmand.view.ThreeStateCheckbox.State.CHECKED; import static net.osmand.view.ThreeStateCheckbox.State.MISC; import static net.osmand.view.ThreeStateCheckbox.State.UNCHECKED; -public class SelectMultipleItemsBottomSheet extends MenuBottomSheetDialogFragment { +public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { public static final String TAG = SelectMultipleItemsBottomSheet.class.getSimpleName(); - private OsmandApplication app; - private UiUtilities uiUtilities; - - private TextView title; - private TextView description; - private TextView applyButtonTitle; - private TextView checkBoxTitle; - private TextView selectedSize; - private ThreeStateCheckbox checkBox; - - private int sizeAboveList = 0; - private int activeColorRes; - private int secondaryColorRes; - private String addDescriptionText; - private String leftRadioButtonText; - private String rightRadioButtonText; - private boolean customOptionsVisible; - private boolean leftButtonSelected; - private final List allItems = new ArrayList<>(); private final List selectedItems = new ArrayList<>(); private SelectionUpdateListener selectionUpdateListener; - private OnApplySelectionListener onApplySelectionListener; - private OnRadioButtonSelectListener onRadioButtonSelectListener; - private SelectedItemsListener selectedItemsListener; - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { - View mainView = super.onCreateView(inflater, parent, savedInstanceState); - onSelectedItemsChanged(); - return mainView; - } @Override - public void createMenuItems(Bundle savedInstanceState) { - app = requiredMyApplication(); - uiUtilities = app.getUIUtilities(); - activeColorRes = nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light; - secondaryColorRes = nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light; - - items.add(createTitleItem()); - items.add(new SimpleDividerItem(app)); - sizeAboveList = items.size(); - createListItems(); - } - - @Override - public void onPause() { - super.onPause(); - if (requireActivity().isChangingConfigurations()) { - dismiss(); - } - } - - private BaseBottomSheetItem createTitleItem() { - LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode); - View view = themedInflater.inflate(R.layout.settings_group_title, null); - - checkBox = view.findViewById(R.id.check_box); - checkBoxTitle = view.findViewById(R.id.check_box_title); - description = view.findViewById(R.id.description); - selectedSize = view.findViewById(R.id.selected_size); - title = view.findViewById(R.id.title); - View selectAllButton = view.findViewById(R.id.select_all_button); - TextView addDescription = view.findViewById(R.id.additional_description); - LinearLayout customRadioButtons = view.findViewById(R.id.custom_radio_buttons); - - if (!isMultipleItem()) { - AndroidUiHelper.setVisibility(View.GONE, description, selectedSize, selectAllButton); - } else { - selectAllButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - checkBox.performClick(); - boolean checked = checkBox.getState() == CHECKED; - if (checked) { - selectedItems.addAll(allItems); - } else { - selectedItems.clear(); - } - onSelectedItemsChanged(); - updateItems(checked); + protected void initHeaderUi() { + selectAllButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + checkBox.performClick(); + boolean checked = checkBox.getState() == CHECKED; + if (checked) { + selectedItems.addAll(allItems); + } else { + selectedItems.clear(); } - }); - } - - if (!Algorithms.isEmpty(addDescriptionText)) { - addDescription.setText(addDescriptionText); - AndroidUiHelper.setVisibility(View.VISIBLE, addDescription); - } - - if (customOptionsVisible) { - AndroidUiHelper.setVisibility(View.VISIBLE, customRadioButtons); - RadioItem leftRadioButton = new RadioItem(leftRadioButtonText); - RadioItem rightRadioButton = new RadioItem(rightRadioButtonText); - MultiStateToggleButton toggleButtons = - new MultiStateToggleButton(app, customRadioButtons, nightMode); - toggleButtons.setItems(leftRadioButton, rightRadioButton); - toggleButtons.updateView(true); - leftRadioButton.setOnClickListener(new OnRadioItemClickListener() { - @Override - public boolean onRadioItemClick(RadioItem radioItem, View view) { - onRadioButtonSelectListener.onSelect(leftButtonSelected = true); - updateSelectedSizeView(); - updateSelectAllButton(); - updateApplyButtonEnable(); - return true; - } - }); - rightRadioButton.setOnClickListener(new OnRadioItemClickListener() { - @Override - public boolean onRadioItemClick(RadioItem radioItem, View view) { - onRadioButtonSelectListener.onSelect(leftButtonSelected = false); - updateSelectedSizeView(); - updateSelectAllButton(); - updateApplyButtonEnable(); - return true; - } - }); - toggleButtons.setSelectedItem(leftButtonSelected ? leftRadioButton : rightRadioButton); - } - - return new SimpleBottomSheetItem.Builder().setCustomView(view).create(); - } - - private void createListItems() { - if (isMultipleItem()) { - for (int i = 0; i < allItems.size(); i++) { - final SelectableItem item = allItems.get(i); - boolean checked = selectedItems.contains(item); - final int finalI = i; - items.add(new Builder() - .setChecked(checked) - .setButtonTintList(AndroidUtils.createCheckedColorStateList(app, secondaryColorRes, activeColorRes)) - .setDescription(item.description) - .setIcon(uiUtilities.getIcon(item.iconId, activeColorRes)) - .setTitle(item.title) - .setLayoutId(R.layout.bottom_sheet_item_with_descr_and_checkbox_56dp) - .setTag(item) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BottomSheetItemWithCompoundButton item = (BottomSheetItemWithCompoundButton) items.get(finalI + sizeAboveList); - boolean checked = item.isChecked(); - item.setChecked(!checked); - SelectableItem tag = (SelectableItem) item.getTag(); - if (!checked) { - selectedItems.add(tag); - } else { - selectedItems.remove(tag); - } - onSelectedItemsChanged(); - } - }) - .create()); + onSelectedItemsChanged(); + updateItems(checked); } - } else if (allItems.size() == 1) { - final SelectableItem item = allItems.get(0); - items.add(new Builder() - .setDescription(item.description) - .setDescriptionColorId(AndroidUtils.getSecondaryTextColorId(nightMode)) - .setIcon(uiUtilities.getIcon(item.iconId, activeColorRes)) - .setTitle(item.title) - .setLayoutId(R.layout.bottom_sheet_item_with_descr_56dp) - .setTag(item) - .create()); + }); + } + + @Override + protected void createSelectionUi() { + for (final SelectableItem item : allItems) { + boolean checked = selectedItems.contains(item); + final BottomSheetItemWithCompoundButton[] uiItem = new BottomSheetItemWithCompoundButton[1]; + final Builder builder = (BottomSheetItemWithCompoundButton.Builder) new Builder(); + builder.setChecked(checked) + .setButtonTintList(AndroidUtils.createCheckedColorStateList(app, secondaryColorRes, activeColorRes)) + .setLayoutId(R.layout.bottom_sheet_item_with_descr_and_checkbox_56dp) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean checked = !uiItem[0].isChecked(); + uiItem[0].setChecked(checked); + SelectableItem tag = (SelectableItem) uiItem[0].getTag(); + if (checked) { + selectedItems.add(tag); + } else { + selectedItems.remove(tag); + } + onSelectedItemsChanged(); + } + }) + .setTag(item); + setupListItem(builder, item); + uiItem[0] = builder.create(); + items.add(uiItem[0]); } } + @Override + protected void notifyUiInitialized() { + onSelectedItemsChanged(); + super.notifyUiInitialized(); + } + private void onSelectedItemsChanged() { updateSelectAllButton(); updateSelectedSizeView(); @@ -223,32 +95,38 @@ public class SelectMultipleItemsBottomSheet extends MenuBottomSheetDialogFragmen } } + private void setupListItem(Builder builder, SelectableItem item) { + builder.setTitle(item.getTitle()); + builder.setDescription(item.getDescription()); + builder.setIcon(uiUtilities.getIcon(item.getIconId(), activeColorRes)); + } + private void updateSelectAllButton() { - if (isMultipleItem()) { - String checkBoxTitle; - if (Algorithms.isEmpty(selectedItems)) { - checkBox.setState(UNCHECKED); - checkBoxTitle = getString(R.string.shared_string_select_all); - } else { - checkBox.setState(selectedItems.containsAll(allItems) ? CHECKED : MISC); - checkBoxTitle = getString(R.string.shared_string_deselect_all); - } - int checkBoxColor = checkBox.getState() == UNCHECKED ? secondaryColorRes : activeColorRes; - CompoundButtonCompat.setButtonTintList(checkBox, ColorStateList.valueOf(ContextCompat.getColor(app, checkBoxColor))); - this.checkBoxTitle.setText(checkBoxTitle); + String checkBoxTitle; + if (Algorithms.isEmpty(selectedItems)) { + checkBox.setState(UNCHECKED); + checkBoxTitle = getString(R.string.shared_string_select_all); + } else { + checkBox.setState(selectedItems.containsAll(allItems) ? CHECKED : MISC); + checkBoxTitle = getString(R.string.shared_string_deselect_all); } + int checkBoxColor = checkBox.getState() == UNCHECKED ? secondaryColorRes : activeColorRes; + CompoundButtonCompat.setButtonTintList(checkBox, ColorStateList.valueOf(ContextCompat.getColor(app, checkBoxColor))); + this.checkBoxTitle.setText(checkBoxTitle); } private void updateSelectedSizeView() { - if (isMultipleItem()) { - String selected = String.valueOf(selectedItems.size()); - String all = String.valueOf(allItems.size()); - selectedSize.setText(getString(R.string.ltr_or_rtl_combine_via_slash, selected, all)); - } + String selected = String.valueOf(selectedItems.size()); + String all = String.valueOf(allItems.size()); + selectedSize.setText(getString(R.string.ltr_or_rtl_combine_via_slash, selected, all)); } private void updateApplyButtonEnable() { - rightButton.setEnabled(!Algorithms.isEmpty(selectedItems)); + if (Algorithms.isEmpty(selectedItems)) { + rightButton.setEnabled(false); + } else { + rightButton.setEnabled(true); + } } private void updateItems(boolean checked) { @@ -259,127 +137,30 @@ public class SelectMultipleItemsBottomSheet extends MenuBottomSheetDialogFragmen } } - public void setItems(List allItems) { - this.allItems.clear(); + protected void setItems(List allItems) { if (!Algorithms.isEmpty(allItems)) { + this.allItems.clear(); this.allItems.addAll(allItems); } } - private void setSelectedItems(List selected) { - this.selectedItems.clear(); + protected void setSelectedItems(List selected) { if (!Algorithms.isEmpty(selected)) { - /*List prevDownloadItems = new ArrayList<>(this.selectedItems); - for (SelectableItem prevDownloadItem : selected) { - Object object = prevDownloadItem.getObject(); - if (object instanceof IndexItem && ((IndexItem) object).isDownloaded()) { - prevDownloadItems.add(prevDownloadItem); - } - } - selected.removeAll(prevDownloadItems);*/ - this.selectedItems.addAll(selected); + selectedItems.clear(); + selectedItems.addAll(selected); } } - public void recreateList(List allItems) { - setItems(allItems); - if (selectedItemsListener != null) { - setSelectedItems(selectedItemsListener.createSelectedItems(this.allItems, leftButtonSelected)); - } - if (items.size() > sizeAboveList) { - for (int i = 0; i < this.allItems.size(); i++) { - SelectableItem item = this.allItems.get(i); - BottomSheetItemWithDescription button = (BottomSheetItemWithDescription) items.get(i + sizeAboveList); - button.setDescription(item.description); - button.setTitle(item.title); - button.setTag(item); - if (isMultipleItem()) { - ((BottomSheetItemWithCompoundButton) button).setChecked(selectedItems.contains(item)); - } - } - } - } - - public boolean isMultipleItem() { - return allItems.size() > 1; - } - - public List getSelectedItems() { + @NonNull + @Override + public List getSelection() { return selectedItems; } - public void setConfirmButtonTitle(@NonNull String confirmButtonTitle) { - applyButtonTitle.setText(confirmButtonTitle); - } - - public void setTitle(@NonNull String title) { - this.title.setText(title); - } - - public void setDescription(@NonNull String description) { - this.description.setText(description); - } - - public void setAddDescriptionText(String addDescriptionText) { - this.addDescriptionText = addDescriptionText; - } - - public void setLeftRadioButtonText(String leftRadioButtonText) { - this.leftRadioButtonText = leftRadioButtonText; - } - - public void setRightRadioButtonText(String rightRadioButtonText) { - this.rightRadioButtonText = rightRadioButtonText; - } - - public void setCustomOptionsVisible(boolean customOptionsVisible) { - this.customOptionsVisible = customOptionsVisible; - } - - public void setLeftButtonSelected(boolean leftButtonSelected) { - this.leftButtonSelected = leftButtonSelected; - } - public void setSelectionUpdateListener(SelectionUpdateListener selectionUpdateListener) { this.selectionUpdateListener = selectionUpdateListener; } - public void setOnApplySelectionListener(OnApplySelectionListener onApplySelectionListener) { - this.onApplySelectionListener = onApplySelectionListener; - } - - public void setOnRadioButtonSelectListener(OnRadioButtonSelectListener onRadioButtonSelectListener) { - this.onRadioButtonSelectListener = onRadioButtonSelectListener; - } - - public void setSelectedItemsListener(SelectedItemsListener selectedItemsListener) { - this.selectedItemsListener = selectedItemsListener; - } - - @Override - protected void setupRightButton() { - super.setupRightButton(); - applyButtonTitle = rightButton.findViewById(R.id.button_text); - } - - @Override - protected void onRightBottomButtonClick() { - if (onApplySelectionListener != null) { - onApplySelectionListener.onSelectionApplied(selectedItems); - } - dismiss(); - } - - @Override - protected int getRightBottomButtonTextId() { - return R.string.shared_string_apply; - } - - @Override - protected boolean useVerticalButtons() { - return true; - } - public static SelectMultipleItemsBottomSheet showInstance(@NonNull AppCompatActivity activity, @NonNull List items, @Nullable List selected, @@ -393,70 +174,8 @@ public class SelectMultipleItemsBottomSheet extends MenuBottomSheetDialogFragmen return fragment; } - public static SelectMultipleItemsBottomSheet showInstance(@NonNull AppCompatActivity activity, - @NonNull List items, - @Nullable List selected, - boolean usedOnMap, - String addDescription, - boolean customOptionsVisible, - boolean leftButtonSelected, - String leftRadioButtonText, - String rightRadioButtonText) { - SelectMultipleItemsBottomSheet fragment = new SelectMultipleItemsBottomSheet(); - fragment.setUsedOnMap(usedOnMap); - fragment.setItems(items); - fragment.setSelectedItems(selected); - fragment.setAddDescriptionText(addDescription); - fragment.setCustomOptionsVisible(customOptionsVisible); - fragment.setLeftButtonSelected(leftButtonSelected); - fragment.setLeftRadioButtonText(leftRadioButtonText); - fragment.setRightRadioButtonText(rightRadioButtonText); - FragmentManager fm = activity.getSupportFragmentManager(); - fragment.show(fm, TAG); - return fragment; - } - public interface SelectionUpdateListener { void onSelectionUpdate(); } - public interface OnApplySelectionListener { - void onSelectionApplied(List selectedItems); - } - - public interface OnRadioButtonSelectListener { - void onSelect(boolean leftButton); - } - - public static class SelectableItem { - private String title; - private String description; - private int iconId; - private Object object; - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public void setIconId(int iconId) { - this.iconId = iconId; - } - - public void setObject(Object object) { - this.object = object; - } - - public Object getObject() { - return object; - } - } - -} +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java new file mode 100644 index 0000000000..5aee912d0d --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java @@ -0,0 +1,51 @@ +package net.osmand.plus.base; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentManager; + +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; + +import java.util.List; + +public class SelectMultipleWithModeBottomSheet extends SelectMultipleItemsBottomSheet { + + private List modes; + + @Override + protected void initHeaderUi() { + super.initHeaderUi(); + radioGroup.setItems(modes); + + AndroidUiHelper.setVisibility(View.VISIBLE, secondaryDescription, toggleContainer, + checkBox, checkBoxTitle, primaryDescription, selectedSize, selectAllButton); + } + + private void setModes(@NonNull List modes) { + this.modes = modes; + } + + public void setSelectedMode(@NonNull RadioItem mode) { + radioGroup.setSelectedItem(mode); + } + + public static SelectMultipleWithModeBottomSheet showInstance(@NonNull AppCompatActivity activity, + @NonNull List items, + @Nullable List selected, + @NonNull List modes, + boolean usedOnMap) { + SelectMultipleWithModeBottomSheet fragment = new SelectMultipleWithModeBottomSheet(); + fragment.setUsedOnMap(usedOnMap); + fragment.setItems(items); + fragment.setSelectedItems(selected); + fragment.setModes(modes); + FragmentManager fm = activity.getSupportFragmentManager(); + fragment.show(fm, TAG); + return fragment; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java new file mode 100644 index 0000000000..978f649083 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java @@ -0,0 +1,201 @@ +package net.osmand.plus.base; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.SimpleDividerItem; +import net.osmand.plus.widgets.MultiStateToggleButton; +import net.osmand.view.ThreeStateCheckbox; + +import java.util.List; + +public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment { + + protected OsmandApplication app; + protected UiUtilities uiUtilities; + + protected TextView title; + protected TextView primaryDescription; + protected TextView secondaryDescription; + protected TextView selectedSize; + protected LinearLayout toggleContainer; + protected MultiStateToggleButton radioGroup; + protected View selectAllButton; + protected TextView checkBoxTitle; + protected ThreeStateCheckbox checkBox; + protected LinearLayout selectionListView; + protected TextView applyButtonTitle; + + protected int activeColorRes; + protected int secondaryColorRes; + + private OnUiInitializedListener uiInitializedListener; + private OnApplySelectionListener applySelectionListener; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { + View mainView = super.onCreateView(inflater, parent, savedInstanceState); + notifyUiInitialized(); + return mainView; + } + + @Override + public void createMenuItems(Bundle savedInstanceState) { + app = requiredMyApplication(); + uiUtilities = app.getUIUtilities(); + activeColorRes = nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light; + secondaryColorRes = nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light; + + items.add(createHeaderUi()); + items.add(new SimpleDividerItem(app)); + createSelectionUi(); + } + + @Override + public void onPause() { + super.onPause(); + if (requireActivity().isChangingConfigurations()) { + dismiss(); + } + } + + private BaseBottomSheetItem createHeaderUi() { + LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode); + View view = themedInflater.inflate(R.layout.settings_group_title, null); + + title = view.findViewById(R.id.title); + primaryDescription = view.findViewById(R.id.description); + secondaryDescription = view.findViewById(R.id.additional_description); + selectedSize = view.findViewById(R.id.selected_size); + toggleContainer = view.findViewById(R.id.custom_radio_buttons); + radioGroup = new MultiStateToggleButton(app, toggleContainer, nightMode); + selectAllButton = view.findViewById(R.id.select_all_button); + checkBoxTitle = view.findViewById(R.id.check_box_title); + checkBox = view.findViewById(R.id.check_box); + + initHeaderUi(); + return new SimpleBottomSheetItem.Builder().setCustomView(view).create(); + } + + protected abstract void createSelectionUi(); + + protected abstract void initHeaderUi(); + + @Override + protected void setupRightButton() { + super.setupRightButton(); + applyButtonTitle = rightButton.findViewById(R.id.button_text); + } + + public void setTitle(@NonNull String title) { + this.title.setText(title); + } + + public void setDescription(@NonNull String description) { + this.primaryDescription.setText(description); + } + + public void setSecondaryDescription(@NonNull String description) { + this.secondaryDescription.setText(description); + } + + public void setApplyButtonTitle(@NonNull String title) { + applyButtonTitle.setText(title); + } + + @Override + protected void onRightBottomButtonClick() { + if (applySelectionListener != null) { + applySelectionListener.onSelectionApplied(getSelection()); + } + dismiss(); + } + + @NonNull + public abstract List getSelection(); + + @Override + protected int getRightBottomButtonTextId() { + return R.string.shared_string_apply; + } + + public void setUiInitializedListener(OnUiInitializedListener uiInitializedListener) { + this.uiInitializedListener = uiInitializedListener; + } + + public void setOnApplySelectionListener(OnApplySelectionListener onApplySelectionListener) { + this.applySelectionListener = onApplySelectionListener; + } + + protected void notifyUiInitialized() { + if (uiInitializedListener != null) { + uiInitializedListener.onUiInitialized(); + } + } + + @Override + protected boolean useVerticalButtons() { + return true; + } + + public interface OnUiInitializedListener { + void onUiInitialized(); + } + + public interface OnApplySelectionListener { + void onSelectionApplied(List selectedItems); + } + + public static class SelectableItem { + private String title; + private String description; + private int iconId; + private Object object; + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public int getIconId() { + return iconId; + } + + public Object getObject() { + return object; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setIconId(int iconId) { + this.iconId = iconId; + } + + public void setObject(Object object) { + this.object = object; + } + } + +} diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index 5c84250d07..715d2f02f5 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -29,7 +29,7 @@ import java.util.Map; import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; import static net.osmand.plus.activities.LocalIndexHelper.LocalIndexType.SRTM_DATA; -import static net.osmand.plus.download.MultipleIndexesUiHelper.getSRTMExt; +import static net.osmand.plus.download.SelectIndexesUiHelper.getSRTMExt; public class DownloadActivityType { private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.US); diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java index a6a0a46686..caf47d71f5 100644 --- a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; -import static net.osmand.plus.download.MultipleIndexesUiHelper.isBaseSRTMItem; +import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMItem; public class MultipleIndexItem extends DownloadItem { diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleIndexesUiHelper.java b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java similarity index 52% rename from OsmAnd/src/net/osmand/plus/download/MultipleIndexesUiHelper.java rename to OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java index 509609bd94..ff0401215d 100644 --- a/OsmAnd/src/net/osmand/plus/download/MultipleIndexesUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java @@ -1,6 +1,7 @@ package net.osmand.plus.download; import android.content.Context; +import android.view.View; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; @@ -11,22 +12,28 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.base.SelectMultipleItemsBottomSheet; -import net.osmand.plus.base.SelectMultipleItemsBottomSheet.OnApplySelectionListener; -import net.osmand.plus.base.SelectMultipleItemsBottomSheet.OnRadioButtonSelectListener; -import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectableItem; import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectionUpdateListener; +import net.osmand.plus.base.SelectModeBottomSheet; +import net.osmand.plus.base.SelectMultipleWithModeBottomSheet; +import net.osmand.plus.base.SelectionBottomSheet; +import net.osmand.plus.base.SelectionBottomSheet.OnApplySelectionListener; +import net.osmand.plus.base.SelectionBottomSheet.OnUiInitializedListener; +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.RadioItem; import net.osmand.util.Algorithms; import java.text.DateFormat; import java.util.ArrayList; +import java.util.Collections; 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; -public class MultipleIndexesUiHelper { +public class SelectIndexesUiHelper { public static void showDialog(@NonNull DownloadItem item, @NonNull AppCompatActivity activity, @@ -35,7 +42,11 @@ public class MultipleIndexesUiHelper { boolean showRemoteDate, @NonNull final SelectItemsToDownloadListener listener) { if (item.getType() == SRTM_COUNTRY_FILE) { - showSRTMDialog(item, activity, app, dateFormat, showRemoteDate, listener); + if (item instanceof MultipleIndexItem) { + showMultipleSrtmDialog(item, activity, app, dateFormat, showRemoteDate, listener); + } else { + showSingleSrtmDialog(item, activity, app, dateFormat, showRemoteDate, listener); + } } else if (item instanceof MultipleIndexItem) { showBaseDialog((MultipleIndexItem) item, activity, app, dateFormat, showRemoteDate, listener); } @@ -70,24 +81,116 @@ public class MultipleIndexesUiHelper { final SelectMultipleItemsBottomSheet dialog = SelectMultipleItemsBottomSheet.showInstance(activity, allItems, selectedItems, true); + dialog.setUiInitializedListener(new OnUiInitializedListener() { + @Override + public void onUiInitialized() { + dialog.setTitle(app.getString(R.string.welmode_download_maps)); + } + }); + dialog.setSelectionUpdateListener(new SelectionUpdateListener() { @Override public void onSelectionUpdate() { - updateSize(app, dialog); + updateSize(app, dialog, true); } }); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - public static void showSRTMDialog(@NonNull final DownloadItem downloadItem, - @NonNull AppCompatActivity activity, - @NonNull final OsmandApplication app, - @NonNull final DateFormat dateFormat, - final boolean showRemoteDate, - @NonNull final SelectItemsToDownloadListener listener) { + public static void showSingleSrtmDialog(@NonNull final DownloadItem downloadItem, + @NonNull AppCompatActivity activity, + @NonNull final OsmandApplication app, + @NonNull final DateFormat dateFormat, + final boolean showRemoteDate, + @NonNull final SelectItemsToDownloadListener listener) { + List allIndexes = getIndexesToDownload(downloadItem); + boolean baseSRTM = isBaseSRTMMetricSystem(app); + + List radioItems = new ArrayList<>(); + final 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))); + radioItems.add(meters); + 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; + final SelectableItem initFeet = feetItem; + + final SelectModeBottomSheet dialog = SelectModeBottomSheet.showInstance(activity, + 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; + dialog.setUiInitializedListener(new OnUiInitializedListener() { + @Override + public void onUiInitialized() { + dialog.setTitle(app.getString(R.string.srtm_unit_format)); + dialog.setDescription(app.getString(R.string.srtm_download_single_help_message)); + 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); + dialog.setSelectedMode(initRadio); + } + }); + + dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); + } + + public static void showMultipleSrtmDialog(@NonNull final DownloadItem downloadItem, + @NonNull AppCompatActivity activity, + @NonNull final OsmandApplication app, + @NonNull final DateFormat dateFormat, + final boolean showRemoteDate, + @NonNull final SelectItemsToDownloadListener listener) { List selectedItems = new ArrayList<>(); - final List leftItems = new ArrayList<>(); - final List rightItems = new ArrayList<>(); + final List meterItems = new ArrayList<>(); + final List feetItems = new ArrayList<>(); List indexesToDownload = getIndexesToDownload(downloadItem); boolean baseSRTM = isBaseSRTMMetricSystem(app); @@ -115,9 +218,9 @@ public class MultipleIndexesUiHelper { selectableItem.setObject(indexItem); if (baseItem) { - leftItems.add(selectableItem); + meterItems.add(selectableItem); } else { - rightItems.add(selectableItem); + feetItems.add(selectableItem); } if (indexesToDownload.contains(indexItem) @@ -126,45 +229,48 @@ public class MultipleIndexesUiHelper { } } - String addDescription = app.getString(isListDialog(app, leftItems, rightItems) - ? R.string.srtm_download_list_help_message : R.string.srtm_download_single_help_message); - final SelectMultipleItemsBottomSheet dialog = SelectMultipleItemsBottomSheet.showInstance( - activity, baseSRTM ? leftItems : rightItems, selectedItems, true, - addDescription, true, baseSRTM, - Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_meters)), - Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_feets))); + List radioItems = new ArrayList<>(); + 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))); + final RadioItem selectedMode = isBaseSRTMItem(downloadItem) ? meters : feet; + radioItems.add(meters); + radioItems.add(feet); + + final SelectMultipleWithModeBottomSheet dialog = SelectMultipleWithModeBottomSheet.showInstance( + activity, baseSRTM ? meterItems : feetItems, selectedItems, radioItems, true); + + meters.setOnClickListener(new OnRadioItemClickListener() { + @Override + public boolean onRadioItemClick(RadioItem radioItem, View view) { +// dialog.recreateList(meterItems); + return true; + } + }); + + feet.setOnClickListener(new OnRadioItemClickListener() { + @Override + public boolean onRadioItemClick(RadioItem radioItem, View view) { +// dialog.recreateList(feetItems); + return true; + } + }); + + dialog.setUiInitializedListener(new OnUiInitializedListener() { + @Override + public void onUiInitialized() { + dialog.setTitle(app.getString(R.string.welmode_download_maps)); + dialog.setSelectedMode(selectedMode); + dialog.setSecondaryDescription(app.getString(R.string.srtm_download_list_help_message)); + } + }); dialog.setSelectionUpdateListener(new SelectionUpdateListener() { @Override public void onSelectionUpdate() { - updateSize(app, dialog); + updateSize(app, dialog, true); } }); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); - dialog.setOnRadioButtonSelectListener(new OnRadioButtonSelectListener() { - @Override - public void onSelect(boolean leftButton) { - dialog.recreateList(leftButton ? leftItems : rightItems); - updateSize(app, dialog); - } - }); - dialog.setSelectedItemsListener(new SelectedItemsListener() { - @Override - public List createSelectedItems(List currentAllItems, boolean baseSRTM) { - List indexesToDownload = getIndexesToDownload(downloadItem); - List selectedItems = new ArrayList<>(); - - for (SelectableItem currentItem : currentAllItems) { - IndexItem indexItem = (IndexItem) currentItem.getObject(); - boolean baseItem = isBaseSRTMItem(indexItem); - if (indexesToDownload.contains(indexItem) - && (baseSRTM && baseItem || !baseSRTM && !baseItem)) { - selectedItems.add(currentItem); - } - } - return selectedItems; - } - }); } private static OnApplySelectionListener getOnApplySelectionListener(final SelectItemsToDownloadListener listener) { @@ -183,12 +289,12 @@ public class MultipleIndexesUiHelper { }; } - private static void updateSize(OsmandApplication app, SelectMultipleItemsBottomSheet dialog) { - boolean isListDialog = dialog.isMultipleItem(); - dialog.setTitle(app.getString(isListDialog ? R.string.welmode_download_maps : R.string.srtm_unit_format)); - double sizeToDownload = getDownloadSizeInMb(dialog.getSelectedItems()); + private static void updateSize(OsmandApplication app, + SelectionBottomSheet dialog, + boolean updateDescription) { + double sizeToDownload = getDownloadSizeInMb(dialog.getSelection()); String size = DownloadItem.getFormattedMb(app, sizeToDownload); - if (isListDialog) { + if (updateDescription) { String total = app.getString(R.string.shared_string_total); String description = app.getString(R.string.ltr_or_rtl_combine_via_colon, total, size); dialog.setDescription(description); @@ -197,12 +303,7 @@ public class MultipleIndexesUiHelper { if (sizeToDownload > 0) { btnTitle = app.getString(R.string.ltr_or_rtl_combine_via_dash, btnTitle, size); } - dialog.setConfirmButtonTitle(btnTitle); - } - - private static boolean isListDialog(OsmandApplication app, - List leftItems, List rightItems) { - return (isBaseSRTMMetricSystem(app) ? leftItems : rightItems).size() > 1; + dialog.setApplyButtonTitle(btnTitle); } public static String getSRTMAbbrev(Context context, boolean base) { @@ -266,7 +367,4 @@ public class MultipleIndexesUiHelper { void onItemsToDownloadSelected(List items); } - public interface SelectedItemsListener { - List createSelectedItems(List currentAllItems, boolean base); - } } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 07aab7de88..498b122547 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -41,8 +41,8 @@ import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.download.DownloadResourceGroup; import net.osmand.plus.download.DownloadResources; import net.osmand.plus.download.IndexItem; -import net.osmand.plus.download.MultipleIndexesUiHelper; -import net.osmand.plus.download.MultipleIndexesUiHelper.SelectItemsToDownloadListener; +import net.osmand.plus.download.SelectIndexesUiHelper; +import net.osmand.plus.download.SelectIndexesUiHelper.SelectItemsToDownloadListener; import net.osmand.plus.download.MultipleIndexItem; import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask; import net.osmand.plus.helpers.FileNameTranslationHelper; @@ -56,9 +56,9 @@ import java.util.List; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; import static net.osmand.plus.download.DownloadActivityType.isSRTMItem; -import static net.osmand.plus.download.MultipleIndexesUiHelper.getSRTMAbbrev; -import static net.osmand.plus.download.MultipleIndexesUiHelper.isBaseSRTMItem; -import static net.osmand.plus.download.MultipleIndexesUiHelper.isBaseSRTMMetricSystem; +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 { @@ -523,7 +523,7 @@ public class ItemViewHolder { private void selectIndexesToDownload(DownloadItem item) { OsmandApplication app = context.getMyApplication(); - MultipleIndexesUiHelper.showDialog(item, context, app, dateFormat, showRemoteDate, + SelectIndexesUiHelper.showDialog(item, context, app, dateFormat, showRemoteDate, new SelectItemsToDownloadListener() { @Override public void onItemsToDownloadSelected(List indexes) { diff --git a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java index 91b1aabc76..d56420c29c 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java @@ -75,8 +75,8 @@ import java.util.Map; import java.util.Set; import static net.osmand.plus.download.DownloadActivityType.isSRTMItem; -import static net.osmand.plus.download.MultipleIndexesUiHelper.getSRTMAbbrev; -import static net.osmand.plus.download.MultipleIndexesUiHelper.isBaseSRTMItem; +import static net.osmand.plus.download.SelectIndexesUiHelper.getSRTMAbbrev; +import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMItem; public class LocalIndexesFragment extends OsmandExpandableListFragment implements DownloadEvents, OnMapSourceUpdateListener, RenameCallback { From e3c257b255cc85a28cb77543e191849a94a7e570 Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Mon, 12 Apr 2021 20:16:16 +0300 Subject: [PATCH 2/9] small fix --- .../net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java index 5aee912d0d..2c0680d690 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java @@ -14,6 +14,8 @@ import java.util.List; public class SelectMultipleWithModeBottomSheet extends SelectMultipleItemsBottomSheet { + public static final String TAG = SelectMultipleWithModeBottomSheet.class.getSimpleName(); + private List modes; @Override From 1ec3189a86ed1b5e0467b832558453d9c5b272c6 Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Tue, 13 Apr 2021 00:42:16 +0300 Subject: [PATCH 3/9] refactoring p.2 --- .../plus/download/DownloadActivityType.java | 15 +- .../plus/download/DownloadResources.java | 41 +++- .../plus/download/MultipleIndexItem.java | 4 +- .../plus/download/SelectIndexesUiHelper.java | 213 ++++++++---------- .../plus/download/SrtmDownloadItem.java | 137 +++++++++++ .../plus/download/ui/ItemViewHolder.java | 35 +-- .../download/ui/LocalIndexesFragment.java | 8 +- .../plus/widgets/MultiStateToggleButton.java | 8 + 8 files changed, 300 insertions(+), 161 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index 715d2f02f5..8024709969 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -29,7 +29,6 @@ import java.util.Map; import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; import static net.osmand.plus.activities.LocalIndexHelper.LocalIndexType.SRTM_DATA; -import static net.osmand.plus.download.SelectIndexesUiHelper.getSRTMExt; public class DownloadActivityType { private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.US); @@ -231,7 +230,7 @@ public class DownloadActivityType { } else if (FONT_FILE == this) { return IndexConstants.FONT_INDEX_EXT; } else if (SRTM_COUNTRY_FILE == this) { - return getSRTMExt(indexItem); + return SrtmDownloadItem.getExtension(indexItem); } else if (WIKIPEDIA_FILE == this) { return IndexConstants.BINARY_WIKI_MAP_INDEX_EXT; } else if (WIKIVOYAGE_FILE == this) { @@ -427,7 +426,7 @@ public class DownloadActivityType { } String baseNameWithoutVersion = fileName.substring(0, l); if (this == SRTM_COUNTRY_FILE) { - return baseNameWithoutVersion + getSRTMExt(item); + return baseNameWithoutVersion + SrtmDownloadItem.getExtension(item); } if (this == WIKIPEDIA_FILE) { return baseNameWithoutVersion + IndexConstants.BINARY_WIKI_MAP_INDEX_EXT; @@ -505,14 +504,4 @@ public class DownloadActivityType { 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; - } } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java index fc4ddc2a01..cc8647804b 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -471,14 +471,49 @@ public class DownloadResources extends DownloadResourceGroup { addGroup(otherGroup); createHillshadeSRTMGroups(); - collectMultipleIndexesItems(); + replaceIndividualSrtmWithGroups(region); + collectMultipleIndexesItems(region); trimEmptyGroups(); updateLoadedFiles(); return true; } - private void collectMultipleIndexesItems() { - collectMultipleIndexesItems(region); + private void replaceIndividualSrtmWithGroups(@NonNull WorldRegion region) { + DownloadResourceGroup group = getRegionMapsGroup(region); + if (group != null) { + boolean useMetersByDefault = SrtmDownloadItem.shouldUseMetersByDefault(app); + boolean listModified = false; + DownloadActivityType srtmType = DownloadActivityType.SRTM_COUNTRY_FILE; + List indexesList = group.getIndividualResources(); + List 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 subRegions = region.getSubregions(); + if (!Algorithms.isEmpty(subRegions)) { + for (WorldRegion subRegion : subRegions) { + replaceIndividualSrtmWithGroups(subRegion); + } + } } private void collectMultipleIndexesItems(@NonNull WorldRegion region) { diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java index caf47d71f5..c9530cb9e0 100644 --- a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.List; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; -import static net.osmand.plus.download.SelectIndexesUiHelper.isBaseSRTMItem; public class MultipleIndexItem extends DownloadItem { @@ -121,7 +120,8 @@ public class MultipleIndexItem extends DownloadItem { if (this.type == SRTM_COUNTRY_FILE) { for (IndexItem item : items) { if (item.hasActualDataToDownload()) { - if (baseSRTM && isBaseSRTMItem(item) || !baseSRTM && !isBaseSRTMItem(item)) { + boolean isBase = SrtmDownloadItem.isMetersItem(item); + if (baseSRTM && isBase || !baseSRTM && !isBase) { totalSizeMb += item.getSizeToDownloadInMb(); } } diff --git a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java index ff0401215d..357eb4f377 100644 --- a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java @@ -6,11 +6,9 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import net.osmand.IndexConstants; import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.base.SelectMultipleItemsBottomSheet; import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectionUpdateListener; 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.OnUiInitializedListener; 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.RadioItem; import net.osmand.util.Algorithms; @@ -29,35 +26,56 @@ import java.util.ArrayList; import java.util.Collections; 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; 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 final OsmandApplication app, @NonNull DateFormat dateFormat, boolean showRemoteDate, - @NonNull final SelectItemsToDownloadListener listener) { - if (item.getType() == SRTM_COUNTRY_FILE) { - if (item instanceof MultipleIndexItem) { - showMultipleSrtmDialog(item, activity, app, dateFormat, showRemoteDate, listener); + @NonNull SelectItemsToDownloadListener listener) { + this.activity = activity; + this.app = (OsmandApplication) activity.getApplicationContext(); + 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 { - showSingleSrtmDialog(item, activity, app, dateFormat, showRemoteDate, listener); + showSingleSrtmDialog(); } - } else if (item instanceof MultipleIndexItem) { - showBaseDialog((MultipleIndexItem) item, activity, app, dateFormat, showRemoteDate, listener); + } else if (downloadItem instanceof MultipleIndexItem) { + showBaseDialog(); } } - public static void showBaseDialog(@NonNull MultipleIndexItem multipleIndexItem, - @NonNull AppCompatActivity activity, - @NonNull final OsmandApplication app, - @NonNull DateFormat dateFormat, - boolean showRemoteDate, - @NonNull final SelectItemsToDownloadListener listener) { + private void showBaseDialog() { + MultipleIndexItem multipleIndexItem = (MultipleIndexItem) downloadItem; List indexesToDownload = getIndexesToDownload(multipleIndexItem); List allItems = new ArrayList<>(); List selectedItems = new ArrayList<>(); @@ -65,10 +83,12 @@ public class SelectIndexesUiHelper { for (IndexItem indexItem : multipleIndexItem.getAllIndexes()) { SelectableItem selectableItem = new SelectableItem(); selectableItem.setTitle(indexItem.getVisibleName(app, osmandRegions, false)); + String size = indexItem.getSizeDescription(app); 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); allItems.add(selectableItem); @@ -91,90 +111,37 @@ public class SelectIndexesUiHelper { dialog.setSelectionUpdateListener(new SelectionUpdateListener() { @Override public void onSelectionUpdate() { - updateSize(app, dialog, true); + updateSize(dialog, true); } }); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - public static void showSingleSrtmDialog(@NonNull final DownloadItem downloadItem, - @NonNull AppCompatActivity activity, - @NonNull final OsmandApplication app, - @NonNull final DateFormat dateFormat, - final boolean showRemoteDate, - @NonNull final SelectItemsToDownloadListener listener) { - List allIndexes = getIndexesToDownload(downloadItem); - boolean baseSRTM = isBaseSRTMMetricSystem(app); + private void showSingleSrtmDialog() { + boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app); + SrtmDownloadItem srtmItem = (SrtmDownloadItem) downloadItem; + + SelectableItem meterItem = createSrtmSelectableItem(srtmItem.getMeterItem()); + SelectableItem feetItem = createSrtmSelectableItem(srtmItem.getFeetItem()); List radioItems = new ArrayList<>(); - final 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 meters = createRadioItem(meterItem, R.string.shared_string_meters); + RadioItem feet = createRadioItem(feetItem, R.string.shared_string_feets); radioItems.add(meters); 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; - final SelectableItem initFeet = feetItem; - - final SelectModeBottomSheet dialog = SelectModeBottomSheet.showInstance(activity, + dialog = SelectModeBottomSheet.showInstance(activity, 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 SelectableItem initItem = baseSRTM ? meterItem : feetItem; dialog.setUiInitializedListener(new OnUiInitializedListener() { @Override public void onUiInitialized() { + SelectModeBottomSheet dialog = (SelectModeBottomSheet) SelectIndexesUiHelper.this.dialog; dialog.setTitle(app.getString(R.string.srtm_unit_format)); dialog.setDescription(app.getString(R.string.srtm_download_single_help_message)); - 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); + updateSize(dialog, false); dialog.setSelectedMode(initRadio); } }); @@ -182,17 +149,40 @@ public class SelectIndexesUiHelper { dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - public static void showMultipleSrtmDialog(@NonNull final DownloadItem downloadItem, - @NonNull AppCompatActivity activity, - @NonNull final OsmandApplication app, - @NonNull final DateFormat dateFormat, - final boolean showRemoteDate, - @NonNull final SelectItemsToDownloadListener listener) { + private SelectableItem createSrtmSelectableItem(IndexItem indexItem) { + boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); + SelectableItem selectableItem = new SelectableItem(); + selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); + String size = indexItem.getSizeDescription(app); + 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 selectedItems = new ArrayList<>(); final List meterItems = new ArrayList<>(); final List feetItems = new ArrayList<>(); List indexesToDownload = getIndexesToDownload(downloadItem); - boolean baseSRTM = isBaseSRTMMetricSystem(app); + boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app); List allIndexes = new ArrayList<>(); if (downloadItem instanceof MultipleIndexItem) { @@ -206,11 +196,11 @@ public class SelectIndexesUiHelper { } for (IndexItem indexItem : allIndexes) { - boolean baseItem = isBaseSRTMItem(indexItem); + boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); SelectableItem selectableItem = new SelectableItem(); selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); String size = indexItem.getSizeDescription(app); - size += " (" + getSRTMAbbrev(app, baseItem) + ")"; + 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); @@ -232,7 +222,7 @@ public class SelectIndexesUiHelper { List radioItems = new ArrayList<>(); 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))); - final RadioItem selectedMode = isBaseSRTMItem(downloadItem) ? meters : feet; + final RadioItem selectedMode = SrtmDownloadItem.isMetersItem(downloadItem) ? meters : feet; radioItems.add(meters); radioItems.add(feet); @@ -267,13 +257,13 @@ public class SelectIndexesUiHelper { dialog.setSelectionUpdateListener(new SelectionUpdateListener() { @Override public void onSelectionUpdate() { - updateSize(app, dialog, true); + updateSize(dialog, true); } }); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - private static OnApplySelectionListener getOnApplySelectionListener(final SelectItemsToDownloadListener listener) { + private OnApplySelectionListener getOnApplySelectionListener(final SelectItemsToDownloadListener listener) { return new OnApplySelectionListener() { @Override public void onSelectionApplied(List selectedItems) { @@ -289,9 +279,8 @@ public class SelectIndexesUiHelper { }; } - private static void updateSize(OsmandApplication app, - SelectionBottomSheet dialog, - boolean updateDescription) { + private void updateSize(SelectionBottomSheet dialog, + boolean updateDescription) { double sizeToDownload = getDownloadSizeInMb(dialog.getSelection()); String size = DownloadItem.getFormattedMb(app, sizeToDownload); if (updateDescription) { @@ -306,28 +295,6 @@ public class SelectIndexesUiHelper { 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 getIndexesToDownload(DownloadItem downloadItem) { if (downloadItem instanceof MultipleIndexItem) { if (downloadItem.hasActualDataToDownload()) { diff --git a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java new file mode 100644 index 0000000000..2f528423d1 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java @@ -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 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; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 498b122547..872234795d 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -44,6 +44,7 @@ import net.osmand.plus.download.IndexItem; import net.osmand.plus.download.SelectIndexesUiHelper; import net.osmand.plus.download.SelectIndexesUiHelper.SelectItemsToDownloadListener; import net.osmand.plus.download.MultipleIndexItem; +import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.inapp.InAppPurchaseHelper; @@ -55,10 +56,6 @@ import java.util.ArrayList; import java.util.List; 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 { @@ -196,8 +193,8 @@ public class ItemViewHolder { } descrTextView.setTextColor(textColorSecondary); if (!isDownloading) { - boolean srtmItem = isSRTMItem(downloadItem); - boolean baseMetricSystem = isBaseSRTMMetricSystem(context.getMyApplication()); + boolean srtmItem = SrtmDownloadItem.isSRTMItem(downloadItem); + boolean baseMetricSystem = SrtmDownloadItem.shouldUseMetersByDefault(context.getMyApplication()); progressBar.setVisibility(View.GONE); descrTextView.setVisibility(View.VISIBLE); if (downloadItem instanceof CustomIndexItem && (((CustomIndexItem) downloadItem).getSubName(context) != null)) { @@ -218,10 +215,10 @@ public class ItemViewHolder { String regionsHeader = context.getString(R.string.regions); String allRegionsCount; String leftToDownloadCount; - if (isSRTMItem(item)) { + if (SrtmDownloadItem.isSRTMItem(item)) { List items = new ArrayList<>(); for (IndexItem indexItem : item.getAllIndexes()) { - boolean baseItem = isBaseSRTMItem(indexItem); + boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); if (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem) { items.add(indexItem); } @@ -229,7 +226,7 @@ public class ItemViewHolder { allRegionsCount = String.valueOf(items.size()); items.clear(); for (IndexItem indexItem : item.getIndexesToDownload()) { - boolean baseItem = isBaseSRTMItem(indexItem); + boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); if (!indexItem.isDownloaded() && (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem)) { items.add(indexItem); @@ -259,7 +256,7 @@ public class ItemViewHolder { } String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count); if (srtmItem) { - fullDescription += " (" + getSRTMAbbrev(context, baseMetricSystem) + ")"; + fullDescription += " (" + SrtmDownloadItem.getAbbreviation(context, baseMetricSystem) + ")"; } if (item.hasActualDataToDownload()) { fullDescription = context.getString( @@ -267,14 +264,23 @@ public class ItemViewHolder { ? item.getSizeDescription(context, baseMetricSystem) : item.getSizeDescription(context)); } 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 { IndexItem item = (IndexItem) 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); - if (srtmItem) { - size += " (" + getSRTMAbbrev(context, isBaseSRTMItem(item)) + ")"; - } String date = item.getDate(dateFormat, showRemoteDate); String fullDescription = String.format(pattern, size, date); if (showTypeInDesc) { @@ -522,8 +528,7 @@ public class ItemViewHolder { } private void selectIndexesToDownload(DownloadItem item) { - OsmandApplication app = context.getMyApplication(); - SelectIndexesUiHelper.showDialog(item, context, app, dateFormat, showRemoteDate, + SelectIndexesUiHelper.showDialog(item, context, dateFormat, showRemoteDate, new SelectItemsToDownloadListener() { @Override public void onItemsToDownloadSelected(List indexes) { diff --git a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java index d56420c29c..2c695cd1e6 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java @@ -55,6 +55,7 @@ import net.osmand.plus.dialogs.DirectionsDialogs; import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents; import net.osmand.plus.download.IndexItem; +import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.mapsource.EditMapSourceDialogFragment.OnMapSourceUpdateListener; @@ -74,9 +75,6 @@ import java.util.List; import java.util.Map; 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, OnMapSourceUpdateListener, RenameCallback { @@ -1034,8 +1032,8 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement builder.append(AndroidUtils.formatSize(ctx, child.getSize() * 1024l)); } - if (isSRTMItem(child)) { - builder.append(" (").append(getSRTMAbbrev(ctx, isBaseSRTMItem(child))).append(")"); + if (SrtmDownloadItem.isSRTMItem(child)) { + builder.append(" (").append(SrtmDownloadItem.getAbbreviation(ctx, SrtmDownloadItem.isMetersItem(child))).append(")"); } if (!Algorithms.isEmpty(child.getDescription())) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java b/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java index 605584f5b8..75ac8410d5 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java +++ b/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java @@ -18,6 +18,7 @@ import net.osmand.plus.UiUtilities; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; public class MultiStateToggleButton { @@ -37,6 +38,13 @@ public class MultiStateToggleButton { this.nightMode = nightMode; } + public void setItems(Collection radioItems) { + if (radioItems == null || radioItems.size() < 2) return; + items.clear(); + items.addAll(radioItems); + initView(); + } + public void setItems(RadioItem firstBtn, RadioItem secondBtn, RadioItem... other) { items.clear(); items.add(firstBtn); From 4a6ab0c6bbf0531fe6874b06bb6e17164a50f7db Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Thu, 15 Apr 2021 21:55:52 +0300 Subject: [PATCH 4/9] refactoring p.3 --- OsmAnd/res/layout/settings_group_title.xml | 22 ++++- .../plus/activities/LocalIndexHelper.java | 4 +- .../plus/base/SelectModeBottomSheet.java | 14 ++-- .../base/SelectMultipleItemsBottomSheet.java | 7 +- .../SelectMultipleWithModeBottomSheet.java | 2 +- .../plus/base/SelectionBottomSheet.java | 26 ++++-- .../plus/download/DownloadActivityType.java | 4 + .../plus/download/DownloadResources.java | 15 ++-- .../plus/download/SelectIndexesUiHelper.java | 20 +++-- .../plus/download/SrtmDownloadItem.java | 81 +++++++++++++------ .../ui/ActiveDownloadsDialogFragment.java | 2 +- .../ui/DownloadResourceGroupAdapter.java | 2 +- .../plus/download/ui/ItemViewHolder.java | 18 ++--- .../download/ui/LocalIndexesFragment.java | 5 +- .../download/ui/SearchDialogFragment.java | 6 +- .../download/ui/UpdatesIndexFragment.java | 2 +- .../resources/IncrementalChangesManager.java | 4 +- .../plus/resources/ResourceManager.java | 4 +- .../backend/backup/FileSettingsItem.java | 4 +- .../fragments/ExportItemsBottomSheet.java | 4 +- 20 files changed, 151 insertions(+), 95 deletions(-) diff --git a/OsmAnd/res/layout/settings_group_title.xml b/OsmAnd/res/layout/settings_group_title.xml index 4ac7fbfe05..6c2c220b4e 100644 --- a/OsmAnd/res/layout/settings_group_title.xml +++ b/OsmAnd/res/layout/settings_group_title.xml @@ -31,7 +31,7 @@ tools:text="Some title" /> + + getSelection() { return Collections.singletonList(previewItem); } + @Override + protected boolean shouldShowDivider() { + return false; + } + public static SelectModeBottomSheet showInstance(@NonNull AppCompatActivity activity, @NonNull SelectableItem previewItem, @NonNull List radioItems, diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java index ab8ae1f3e9..d9a6204e2c 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java @@ -122,11 +122,8 @@ public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { } private void updateApplyButtonEnable() { - if (Algorithms.isEmpty(selectedItems)) { - rightButton.setEnabled(false); - } else { - rightButton.setEnabled(true); - } + boolean noEmptySelection = !Algorithms.isEmpty(selectedItems); + rightButton.setEnabled(noEmptySelection); } private void updateItems(boolean checked) { diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java index 2c0680d690..4318d9c3c7 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java @@ -24,7 +24,7 @@ public class SelectMultipleWithModeBottomSheet extends SelectMultipleItemsBottom radioGroup.setItems(modes); AndroidUiHelper.setVisibility(View.VISIBLE, secondaryDescription, toggleContainer, - checkBox, checkBoxTitle, primaryDescription, selectedSize, selectAllButton); + checkBox, checkBoxTitle, titleDescription, selectedSize, selectAllButton); } private void setModes(@NonNull List modes) { diff --git a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java index 978f649083..6f788a9be2 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java @@ -27,6 +27,7 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment protected UiUtilities uiUtilities; protected TextView title; + protected TextView titleDescription; protected TextView primaryDescription; protected TextView secondaryDescription; protected TextView selectedSize; @@ -35,7 +36,7 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment protected View selectAllButton; protected TextView checkBoxTitle; protected ThreeStateCheckbox checkBox; - protected LinearLayout selectionListView; + protected LinearLayout listContainer; protected TextView applyButtonTitle; protected int activeColorRes; @@ -60,7 +61,9 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment secondaryColorRes = nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light; items.add(createHeaderUi()); - items.add(new SimpleDividerItem(app)); + if (shouldShowDivider()) { + items.add(new SimpleDividerItem(app)); + } createSelectionUi(); } @@ -77,8 +80,9 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment View view = themedInflater.inflate(R.layout.settings_group_title, null); title = view.findViewById(R.id.title); - primaryDescription = view.findViewById(R.id.description); - secondaryDescription = view.findViewById(R.id.additional_description); + titleDescription = view.findViewById(R.id.title_description); + primaryDescription = view.findViewById(R.id.primary_description); + secondaryDescription = view.findViewById(R.id.secondary_description); selectedSize = view.findViewById(R.id.selected_size); toggleContainer = view.findViewById(R.id.custom_radio_buttons); radioGroup = new MultiStateToggleButton(app, toggleContainer, nightMode); @@ -94,6 +98,10 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment protected abstract void initHeaderUi(); + protected boolean shouldShowDivider() { + return true; + } + @Override protected void setupRightButton() { super.setupRightButton(); @@ -104,12 +112,16 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment this.title.setText(title); } - public void setDescription(@NonNull String description) { - this.primaryDescription.setText(description); + public void setTitleDescription(@NonNull String description) { + titleDescription.setText(description); + } + + public void setPrimaryDescription(@NonNull String description) { + primaryDescription.setText(description); } public void setSecondaryDescription(@NonNull String description) { - this.secondaryDescription.setText(description); + secondaryDescription.setText(description); } public void setApplyButtonTitle(@NonNull String title) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index 8024709969..e00e59fc53 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -210,6 +210,10 @@ public class DownloadActivityType { return this == VOICE_FILE && indexItem.fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP); } + public boolean mayProvideSeveralIndexes() { + return this == SRTM_COUNTRY_FILE; + } + public String getUnzipExtension(OsmandApplication ctx, IndexItem indexItem) { if (NORMAL_FILE == this) { if (indexItem.fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java index cc8647804b..6b13be8d29 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -487,20 +487,14 @@ public class DownloadResources extends DownloadResourceGroup { List indexesList = group.getIndividualResources(); List individualDownloadItems = group.getIndividualDownloadItems(); if (doesListContainIndexWithType(indexesList, srtmType)) { - IndexItem meters = null; - IndexItem feet = null; + List srtmIndexes = new ArrayList<>(); for (IndexItem item : indexesList) { if (item.getType() == srtmType) { - if (SrtmDownloadItem.isMetersItem(item)) { - meters = item; - } else { - feet = item; - } + srtmIndexes.add(item); } } - individualDownloadItems.remove(meters); - individualDownloadItems.remove(feet); - group.addItem(new SrtmDownloadItem(meters, feet, useMetersByDefault)); + individualDownloadItems.removeAll(srtmIndexes); + group.addItem(new SrtmDownloadItem(srtmIndexes, useMetersByDefault)); listModified = true; } if (listModified) { @@ -563,6 +557,7 @@ public class DownloadResources extends DownloadResourceGroup { if (index.getType() == type) { found = true; collectedIndexes.add(index); + if (!type.mayProvideSeveralIndexes()) break; } } } diff --git a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java index 357eb4f377..23e1462576 100644 --- a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java @@ -1,6 +1,5 @@ package net.osmand.plus.download; -import android.content.Context; import android.view.View; import androidx.annotation.NonNull; @@ -23,7 +22,6 @@ import net.osmand.util.Algorithms; import java.text.DateFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; @@ -36,14 +34,14 @@ public class SelectIndexesUiHelper { private DateFormat dateFormat; private boolean showRemoteDate; private DownloadItem downloadItem; - private SelectItemsToDownloadListener listener; + private ItemsToDownloadSelectedListener listener; private SelectionBottomSheet dialog; private SelectIndexesUiHelper(@NonNull DownloadItem item, @NonNull AppCompatActivity activity, @NonNull DateFormat dateFormat, boolean showRemoteDate, - @NonNull SelectItemsToDownloadListener listener) { + @NonNull ItemsToDownloadSelectedListener listener) { this.activity = activity; this.app = (OsmandApplication) activity.getApplicationContext(); this.downloadItem = item; @@ -56,7 +54,7 @@ public class SelectIndexesUiHelper { @NonNull AppCompatActivity activity, @NonNull DateFormat dateFormat, boolean showRemoteDate, - @NonNull SelectItemsToDownloadListener listener) { + @NonNull ItemsToDownloadSelectedListener listener) { SelectIndexesUiHelper helper = new SelectIndexesUiHelper(item, activity, dateFormat, showRemoteDate, listener); helper.showDialogInternal(); @@ -140,7 +138,7 @@ public class SelectIndexesUiHelper { public void onUiInitialized() { SelectModeBottomSheet dialog = (SelectModeBottomSheet) SelectIndexesUiHelper.this.dialog; dialog.setTitle(app.getString(R.string.srtm_unit_format)); - dialog.setDescription(app.getString(R.string.srtm_download_single_help_message)); + dialog.setPrimaryDescription(app.getString(R.string.srtm_download_single_help_message)); updateSize(dialog, false); dialog.setSelectedMode(initRadio); } @@ -154,7 +152,7 @@ public class SelectIndexesUiHelper { SelectableItem selectableItem = new SelectableItem(); selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); String size = indexItem.getSizeDescription(app); - size += " (" + SrtmDownloadItem.getAbbreviation(app, baseItem) + ")"; + size += " " + SrtmDownloadItem.getAbbreviationInScopes(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); @@ -200,7 +198,7 @@ public class SelectIndexesUiHelper { SelectableItem selectableItem = new SelectableItem(); selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); String size = indexItem.getSizeDescription(app); - size += " (" + SrtmDownloadItem.getAbbreviation(app, baseItem) + ")"; + size += " " + SrtmDownloadItem.getAbbreviationInScopes(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); @@ -263,7 +261,7 @@ public class SelectIndexesUiHelper { dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - private OnApplySelectionListener getOnApplySelectionListener(final SelectItemsToDownloadListener listener) { + private OnApplySelectionListener getOnApplySelectionListener(final ItemsToDownloadSelectedListener listener) { return new OnApplySelectionListener() { @Override public void onSelectionApplied(List selectedItems) { @@ -286,7 +284,7 @@ public class SelectIndexesUiHelper { if (updateDescription) { String total = app.getString(R.string.shared_string_total); String description = app.getString(R.string.ltr_or_rtl_combine_via_colon, total, size); - dialog.setDescription(description); + dialog.setTitleDescription(description); } String btnTitle = app.getString(R.string.shared_string_download); if (sizeToDownload > 0) { @@ -330,7 +328,7 @@ public class SelectIndexesUiHelper { return totalSizeMb; } - public interface SelectItemsToDownloadListener { + public interface ItemsToDownloadSelectedListener { void onItemsToDownloadSelected(List items); } diff --git a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java index 2f528423d1..d060a196a0 100644 --- a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java +++ b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java @@ -3,6 +3,7 @@ package net.osmand.plus.download; import android.content.Context; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import net.osmand.IndexConstants; import net.osmand.plus.OsmandApplication; @@ -21,38 +22,53 @@ import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; public class SrtmDownloadItem extends DownloadItem { - private IndexItem meterItem; - private IndexItem feetItem; + private List indexes; + private IndexItem meter; + private IndexItem feet; - private boolean useMetersByDefault; + private boolean shouldUseMeters; - public SrtmDownloadItem(IndexItem meterItem, - IndexItem feetItem, - boolean useMetersByDefault) { + public SrtmDownloadItem(List indexes, + boolean shouldUseMeters) { super(SRTM_COUNTRY_FILE); - this.meterItem = meterItem; - this.feetItem = feetItem; - this.useMetersByDefault = useMetersByDefault; + this.indexes = indexes; + this.shouldUseMeters = shouldUseMeters; } - public boolean isUseMetersByDefault() { - return useMetersByDefault; + public boolean isShouldUseMeters() { + return shouldUseMeters; } - public void setUseMetersByDefault(boolean useMetersByDefault) { - this.useMetersByDefault = useMetersByDefault; + public void setShouldUseMeters(boolean shouldUseMeters) { + this.shouldUseMeters = shouldUseMeters; } public IndexItem getIndexItem() { - return useMetersByDefault ? getMeterItem() : getFeetItem(); + return shouldUseMeters ? getMeterItem() : getFeetItem(); } + @Nullable public IndexItem getMeterItem() { - return meterItem; + if (meter == null && indexes != null) { + for (IndexItem index : indexes) { + if (isMetersItem(index)) { + meter = index; + } + } + } + return meter; } + @Nullable public IndexItem getFeetItem() { - return feetItem; + if (feet == null && indexes != null) { + for (IndexItem index : indexes) { + if (!isMetersItem(index)) { + feet = index; + } + } + } + return feet; } @Override @@ -67,12 +83,12 @@ public class SrtmDownloadItem extends DownloadItem { @Override public boolean isDownloaded() { - return getIndexItem().isDownloaded(); + return meter.isDownloaded() || feet.isDownloaded(); } @Override public boolean isOutdated() { - return getIndexItem().isOutdated(); + return meter.isOutdated() || feet.isOutdated(); } @Override @@ -104,14 +120,14 @@ public class SrtmDownloadItem extends DownloadItem { 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); + @NonNull + public static String getAbbreviationInScopes(Context ctx, boolean base) { + return "(" + getAbbreviation(ctx, base) + ")"; } - public static String getExtension(IndexItem indexItem) { - return isMetersItem(indexItem) ? - IndexConstants.BINARY_SRTM_MAP_INDEX_EXT : - IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT; + @NonNull + public static String getAbbreviation(Context context, boolean base) { + return context.getString(base ? R.string.m : R.string.foot); } public static boolean isMetersItem(Object item) { @@ -123,6 +139,23 @@ public class SrtmDownloadItem extends DownloadItem { return false; } + public static boolean containsSrtmExtension(@NonNull String fileName) { + return fileName.contains(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) + || fileName.contains(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT); + } + + public static boolean isSrtmFile(@NonNull String fileName) { + return fileName.endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) + || fileName.endsWith(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT); + } + + @NonNull + 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 isSRTMItem(Object item) { if (item instanceof IndexItem) { return ((IndexItem) item).getType() == SRTM_COUNTRY_FILE; diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ActiveDownloadsDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/ActiveDownloadsDialogFragment.java index 1b8667685c..31a0205f0e 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ActiveDownloadsDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ActiveDownloadsDialogFragment.java @@ -87,7 +87,7 @@ public class ActiveDownloadsDialogFragment extends DialogFragment implements Dow } ItemViewHolder viewHolder = (ItemViewHolder) convertView.getTag(); IndexItem item = getItem(position); - viewHolder.bindIndexItem(item); + viewHolder.bindDownloadItem(item); return convertView; } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java index d2e281bbfc..168888434d 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java @@ -78,7 +78,7 @@ public class DownloadResourceGroupAdapter extends OsmandBaseExpandableListAdapte } else { viewHolder.setShowTypeInDesc(true); } - viewHolder.bindIndexItem(item); + viewHolder.bindDownloadItem(item); } else { DownloadResourceGroup group = (DownloadResourceGroup) child; DownloadGroupViewHolder viewHolder; diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 872234795d..99d1dc1024 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -42,7 +42,7 @@ import net.osmand.plus.download.DownloadResourceGroup; import net.osmand.plus.download.DownloadResources; import net.osmand.plus.download.IndexItem; import net.osmand.plus.download.SelectIndexesUiHelper; -import net.osmand.plus.download.SelectIndexesUiHelper.SelectItemsToDownloadListener; +import net.osmand.plus.download.SelectIndexesUiHelper.ItemsToDownloadSelectedListener; import net.osmand.plus.download.MultipleIndexItem; import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask; @@ -150,11 +150,11 @@ public class ItemViewHolder { depthContoursPurchased = InAppPurchaseHelper.isDepthContoursPurchased(context.getMyApplication()); } - public void bindIndexItem(final DownloadItem downloadItem) { - bindIndexItem(downloadItem, null); + public void bindDownloadItem(final DownloadItem downloadItem) { + bindDownloadItem(downloadItem, null); } - public void bindIndexItem(final DownloadItem downloadItem, final String cityName) { + public void bindDownloadItem(final DownloadItem downloadItem, final String cityName) { initAppStatusVariables(); boolean isDownloading = downloadItem.isDownloading(context.getDownloadThread()); int progress = -1; @@ -256,7 +256,7 @@ public class ItemViewHolder { } String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count); if (srtmItem) { - fullDescription += " (" + SrtmDownloadItem.getAbbreviation(context, baseMetricSystem) + ")"; + fullDescription += " " + SrtmDownloadItem.getAbbreviationInScopes(context, baseMetricSystem); } if (item.hasActualDataToDownload()) { fullDescription = context.getString( @@ -269,7 +269,7 @@ public class ItemViewHolder { 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)) + ")"; + + " " + SrtmDownloadItem.getAbbreviationInScopes(context, SrtmDownloadItem.isMetersItem(item)); String date = item.getDate(dateFormat, showRemoteDate); String fullDescription = String.format(pattern, size, date); if (showTypeInDesc) { @@ -316,9 +316,9 @@ public class ItemViewHolder { } } - public void bindIndexItem(final CityItem cityItem) { + public void bindDownloadItem(final CityItem cityItem) { if (cityItem.getIndexItem() != null) { - bindIndexItem(cityItem.getIndexItem(), cityItem.getName()); + bindDownloadItem(cityItem.getIndexItem(), cityItem.getName()); } else { nameTextView.setText(cityItem.getName()); nameTextView.setTextColor(textColorPrimary); @@ -529,7 +529,7 @@ public class ItemViewHolder { private void selectIndexesToDownload(DownloadItem item) { SelectIndexesUiHelper.showDialog(item, context, dateFormat, showRemoteDate, - new SelectItemsToDownloadListener() { + new ItemsToDownloadSelectedListener() { @Override public void onItemsToDownloadSelected(List indexes) { IndexItem[] indexesArray = new IndexItem[indexes.size()]; diff --git a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java index 2c695cd1e6..b4e11d6bf7 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java @@ -965,8 +965,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement return ctx.getString(R.string.download_roads_only_item); } else if (child.isBackupedData() && child.getFileName().endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)) { return ctx.getString(R.string.download_wikipedia_maps); - } else if (child.isBackupedData() && (child.getFileName().endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) - || child.getFileName().endsWith(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT))) { + } else if (child.isBackupedData() && (SrtmDownloadItem.isSrtmFile(child.getFileName()))) { return ctx.getString(R.string.download_srtm_maps); } return ""; @@ -1033,7 +1032,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement } if (SrtmDownloadItem.isSRTMItem(child)) { - builder.append(" (").append(SrtmDownloadItem.getAbbreviation(ctx, SrtmDownloadItem.isMetersItem(child))).append(")"); + builder.append(" ").append(SrtmDownloadItem.getAbbreviationInScopes(ctx, SrtmDownloadItem.isMetersItem(child))); } if (!Algorithms.isEmpty(child.getDescription())) { diff --git a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java index ac9a87b32e..e6e3508ade 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java @@ -382,10 +382,10 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven if (obj instanceof IndexItem) { IndexItem item = (IndexItem) obj; viewHolder.setShowTypeInDesc(true); - viewHolder.bindIndexItem(item); + viewHolder.bindDownloadItem(item); } else { CityItem item = (CityItem) obj; - viewHolder.bindIndexItem(item); + viewHolder.bindDownloadItem(item); if (item.getIndexItem() == null) { new IndexItemResolverTask(viewHolder, item).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -461,7 +461,7 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven if (viewHolder != null) { if (indexItem != null) { cityItem.setIndexItem(indexItem); - viewHolder.bindIndexItem(indexItem, cityItem.getName()); + viewHolder.bindDownloadItem(indexItem, cityItem.getName()); } } } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java index ae0ab9b560..2cf1555428 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java @@ -410,7 +410,7 @@ public class UpdatesIndexFragment extends OsmAndListFragment implements Download holder.setShowRemoteDate(true); holder.setShowTypeInDesc(true); holder.setShowParentRegionName(true); - holder.bindIndexItem(getItem(position)); + holder.bindDownloadItem(getItem(position)); } return view; } diff --git a/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java b/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java index efcb487fd4..565d300e47 100644 --- a/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java @@ -5,6 +5,7 @@ import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.R; +import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -45,8 +46,7 @@ public class IncrementalChangesManager { Set existingFiles = new HashSet(); for (File f : files) { if (!f.getName().endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT) && - !f.getName().endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) && - !f.getName().endsWith(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT)) { + !SrtmDownloadItem.isSrtmFile(f.getName())) { existingFiles.add(Algorithms.getFileNameWithoutExtension(f)); } } diff --git a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java index 9271a3b1c2..7263eab1d8 100644 --- a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java @@ -41,6 +41,7 @@ import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.download.DownloadOsmandIndexesHelper; import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetEntry; +import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.render.MapRenderRepositories; import net.osmand.plus.render.NativeOsmandLibrary; @@ -701,8 +702,7 @@ public class ResourceManager { log.error(String.format("File %s could not be read", f.getName()), e); } boolean wikiMap = (f.getName().contains("_wiki") || f.getName().contains(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)); - boolean srtmMap = f.getName().contains(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) - || f.getName().contains(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT); + boolean srtmMap = SrtmDownloadItem.containsSrtmExtension(f.getName()); if (mapReader == null || (!Version.isPaidVersion(context) && wikiMap && !f.getName().equals(DEFAULT_WIKIVOYAGE_TRAVEL_OBF))) { warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$ } else { diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/backup/FileSettingsItem.java b/OsmAnd/src/net/osmand/plus/settings/backend/backup/FileSettingsItem.java index e549c74406..53b6ec0500 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/backup/FileSettingsItem.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/backup/FileSettingsItem.java @@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import net.osmand.IndexConstants; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; +import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.util.Algorithms; import org.json.JSONException; @@ -92,8 +93,7 @@ public class FileSettingsItem extends StreamSettingsItem { case OTHER: break; case SRTM_MAP: - if (name.endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) - || name.endsWith(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT)) { + if (SrtmDownloadItem.isSrtmFile(name)) { return subtype; } break; diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java index b78a4bd0aa..5e4b4f0449 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java @@ -36,6 +36,7 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton.Bu import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.SimpleDividerItem; +import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.helpers.GpxUiHelper; @@ -530,8 +531,7 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment { return getString(R.string.download_roads_only_item); } else if (file.getName().endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)) { return getString(R.string.download_wikipedia_maps); - } else if (file.getName().endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT) - || file.getName().endsWith(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT)) { + } else if (SrtmDownloadItem.isSrtmFile(file.getName())) { return getString(R.string.download_srtm_maps); } else if (file.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) { return getString(R.string.download_regular_maps); From 45be6b1919d2b8894db70ab0673bc4f87a6e6c33 Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Fri, 16 Apr 2021 12:04:19 +0300 Subject: [PATCH 5/9] refactoring p.4: save SrtmDownloadItem elements in MultipleDownloadItem --- .../main/java/net/osmand/map/WorldRegion.java | 21 +++ .../plus/download/DownloadActivityType.java | 4 - .../plus/download/DownloadIndexesThread.java | 6 +- .../plus/download/DownloadResources.java | 99 ++++++------ ...dexItem.java => MultipleDownloadItem.java} | 69 ++++----- .../plus/download/SelectIndexesUiHelper.java | 142 ++++++++---------- .../plus/download/SrtmDownloadItem.java | 109 ++++++++------ .../plus/download/ui/ItemViewHolder.java | 52 ++----- .../download/ui/LocalIndexesFragment.java | 2 +- 9 files changed, 237 insertions(+), 267 deletions(-) rename OsmAnd/src/net/osmand/plus/download/{MultipleIndexItem.java => MultipleDownloadItem.java} (67%) diff --git a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java index e3b2aa2a69..d54e4eb92c 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java @@ -5,8 +5,11 @@ import net.osmand.data.QuadRect; import net.osmand.util.Algorithms; import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; public class WorldRegion implements Serializable { @@ -212,4 +215,22 @@ public class WorldRegion implements Serializable { } return false; } + + public static List removeDuplicates(List regions) { + List copy = new ArrayList<>(regions); + Set duplicates = new HashSet<>(); + for (int i = 0; i < copy.size() - 1; i++) { + WorldRegion r1 = copy.get(i); + for (int j = i + 1; j < copy.size(); j++) { + WorldRegion r2 = copy.get(j); + if (r1.containsRegion(r2)) { + duplicates.add(r2); + } else if (r2.containsRegion(r1)) { + duplicates.add(r1); + } + } + } + copy.removeAll(duplicates); + return copy; + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index e00e59fc53..8024709969 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -210,10 +210,6 @@ public class DownloadActivityType { return this == VOICE_FILE && indexItem.fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP); } - public boolean mayProvideSeveralIndexes() { - return this == SRTM_COUNTRY_FILE; - } - public String getUnzipExtension(OsmandApplication ctx, IndexItem indexItem) { if (NORMAL_FILE == this) { if (indexItem.fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 8b16e48d84..ab45abe6d0 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -240,9 +240,9 @@ public class DownloadIndexesThread { } public void cancelDownload(DownloadItem item) { - if (item instanceof MultipleIndexItem) { - MultipleIndexItem multipleIndexItem = (MultipleIndexItem) item; - cancelDownload(multipleIndexItem.getAllIndexes()); + if (item instanceof MultipleDownloadItem) { + MultipleDownloadItem multipleDownloadItem = (MultipleDownloadItem) item; + cancelDownload(multipleDownloadItem.getAllIndexes()); } else if (item instanceof IndexItem) { IndexItem indexItem = (IndexItem) item; cancelDownload(indexItem); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java index 6b13be8d29..e59e5f9de9 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -25,12 +25,10 @@ import java.io.InputStream; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Set; import static net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType.REGION_MAPS; @@ -117,6 +115,16 @@ public class DownloadResources extends DownloadResourceGroup { return res; } + @NonNull + public List getDownloadItems(WorldRegion region) { + DownloadResourceGroup group = getRegionMapsGroup(region); + if (group != null) { + return group.getIndividualDownloadItems(); + } + return new LinkedList<>(); + } + + @NonNull public List getIndexItems(WorldRegion region) { if (groupByRegion != null) { List res = groupByRegion.get(region); @@ -472,7 +480,7 @@ public class DownloadResources extends DownloadResourceGroup { createHillshadeSRTMGroups(); replaceIndividualSrtmWithGroups(region); - collectMultipleIndexesItems(region); + createMultipleDownloadItems(region); trimEmptyGroups(); updateLoadedFiles(); return true; @@ -484,21 +492,22 @@ public class DownloadResources extends DownloadResourceGroup { boolean useMetersByDefault = SrtmDownloadItem.shouldUseMetersByDefault(app); boolean listModified = false; DownloadActivityType srtmType = DownloadActivityType.SRTM_COUNTRY_FILE; - List indexesList = group.getIndividualResources(); - List individualDownloadItems = group.getIndividualDownloadItems(); - if (doesListContainIndexWithType(indexesList, srtmType)) { + List individualItems = group.getIndividualDownloadItems(); + if (isListContainsType(individualItems, srtmType)) { List srtmIndexes = new ArrayList<>(); - for (IndexItem item : indexesList) { - if (item.getType() == srtmType) { - srtmIndexes.add(item); + for (DownloadItem item : individualItems) { + if (item.getType() == srtmType && item instanceof IndexItem) { + srtmIndexes.add((IndexItem) item); } } - individualDownloadItems.removeAll(srtmIndexes); - group.addItem(new SrtmDownloadItem(srtmIndexes, useMetersByDefault)); + if (srtmIndexes.size() == 2) { + individualItems.removeAll(srtmIndexes); + group.addItem(new SrtmDownloadItem(srtmIndexes, useMetersByDefault)); + } listModified = true; } if (listModified) { - sortDownloadItems(individualDownloadItems); + sortDownloadItems(individualItems); } } @@ -510,20 +519,20 @@ public class DownloadResources extends DownloadResourceGroup { } } - private void collectMultipleIndexesItems(@NonNull WorldRegion region) { + private void createMultipleDownloadItems(@NonNull WorldRegion region) { List subRegions = region.getSubregions(); if (Algorithms.isEmpty(subRegions)) return; DownloadResourceGroup group = getRegionMapsGroup(region); if (group != null) { boolean listModified = false; - List indexesList = group.getIndividualResources(); - List regionsToCollect = removeDuplicateRegions(subRegions); + List downloadItems = group.getIndividualDownloadItems(); + List uniqueSubRegions = WorldRegion.removeDuplicates(subRegions); for (DownloadActivityType type : DownloadActivityType.values()) { - if (!doesListContainIndexWithType(indexesList, type)) { - List indexesFromSubRegions = collectIndexesOfType(regionsToCollect, type); - if (indexesFromSubRegions != null) { - group.addItem(new MultipleIndexItem(region, indexesFromSubRegions, type)); + if (!isListContainsType(downloadItems, type)) { + List itemsFromSubRegions = collectItemsOfType(uniqueSubRegions, type); + if (itemsFromSubRegions != null) { + group.addItem(new MultipleDownloadItem(region, itemsFromSubRegions, type)); listModified = true; } } @@ -533,7 +542,7 @@ public class DownloadResources extends DownloadResourceGroup { } } for (WorldRegion subRegion : subRegions) { - collectMultipleIndexesItems(subRegion); + createMultipleDownloadItems(subRegion); } } @@ -546,43 +555,21 @@ public class DownloadResources extends DownloadResourceGroup { } @Nullable - private List collectIndexesOfType(@NonNull List regions, - @NonNull DownloadActivityType type) { - List collectedIndexes = new ArrayList<>(); + private List collectItemsOfType(@NonNull List regions, + @NonNull DownloadActivityType type) { + List collectedItems = new ArrayList<>(); for (WorldRegion region : regions) { - List regionIndexes = getIndexItems(region); boolean found = false; - if (regionIndexes != null) { - for (IndexItem index : regionIndexes) { - if (index.getType() == type) { - found = true; - collectedIndexes.add(index); - if (!type.mayProvideSeveralIndexes()) break; - } + for (DownloadItem item : getDownloadItems(region)) { + if (item.getType() == type) { + found = true; + collectedItems.add(item); + break; } } if (!found) return null; } - return collectedIndexes; - } - - private List removeDuplicateRegions(List regions) { - Set duplicates = new HashSet<>(); - for (int i = 0; i < regions.size() - 1; i++) { - WorldRegion r1 = regions.get(i); - for (int j = i + 1; j < regions.size(); j++) { - WorldRegion r2 = regions.get(j); - if (r1.containsRegion(r2)) { - duplicates.add(r2); - } else if (r2.containsRegion(r1)) { - duplicates.add(r1); - } - } - } - for (WorldRegion region : duplicates) { - regions.remove(region); - } - return regions; + return collectedItems; } private void buildRegionsGroups(WorldRegion region, DownloadResourceGroup group) { @@ -709,11 +696,11 @@ public class DownloadResources extends DownloadResourceGroup { && isIndexItemDownloaded(downloadThread, type, downloadRegion.getSuperregion(), res); } - private boolean doesListContainIndexWithType(List indexItems, - DownloadActivityType type) { - if (indexItems != null) { - for (IndexItem indexItem : indexItems) { - if (indexItem.getType() == type) { + private boolean isListContainsType(List items, + DownloadActivityType type) { + if (items != null) { + for (DownloadItem item : items) { + if (item.getType() == type) { return true; } } diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java b/OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java similarity index 67% rename from OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java rename to OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java index c9530cb9e0..394a116241 100644 --- a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java @@ -1,8 +1,7 @@ package net.osmand.plus.download; -import android.content.Context; - import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import net.osmand.map.WorldRegion; import net.osmand.plus.OsmandApplication; @@ -11,26 +10,35 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; +public class MultipleDownloadItem extends DownloadItem { -public class MultipleIndexItem extends DownloadItem { + private final List items; - private final List items; - - public MultipleIndexItem(@NonNull WorldRegion region, - @NonNull List items, - @NonNull DownloadActivityType type) { + public MultipleDownloadItem(@NonNull WorldRegion region, + @NonNull List items, + @NonNull DownloadActivityType type) { super(type); this.items = items; } public List getAllIndexes() { + List indexes = new ArrayList<>(); + for (DownloadItem item : items) { + IndexItem index = getIndexItem(item); + if (index != null) { + indexes.add(index); + } + } + return indexes; + } + + public List getItems() { return items; } @Override public boolean isOutdated() { - for (IndexItem item : items) { + for (DownloadItem item : items) { if (item.isOutdated()) { return true; } @@ -40,7 +48,7 @@ public class MultipleIndexItem extends DownloadItem { @Override public boolean isDownloaded() { - for (IndexItem item : items) { + for (DownloadItem item : items) { if (item.isDownloaded()) { return true; } @@ -50,8 +58,8 @@ public class MultipleIndexItem extends DownloadItem { @Override public boolean isDownloading(@NonNull DownloadIndexesThread thread) { - for (IndexItem item : items) { - if (thread.isDownloading(item)) { + for (DownloadItem item : items) { + if (item.isDownloading(thread)) { return true; } } @@ -82,7 +90,7 @@ public class MultipleIndexItem extends DownloadItem { @Override public List getDownloadedFiles(@NonNull OsmandApplication app) { List result = new ArrayList<>(); - for (IndexItem item : items) { + for (DownloadItem item : items) { result.addAll(item.getDownloadedFiles(app)); } return result; @@ -90,7 +98,7 @@ public class MultipleIndexItem extends DownloadItem { public List getIndexesToDownload() { List indexesToDownload = new ArrayList<>(); - for (IndexItem item : items) { + for (IndexItem item : getAllIndexes()) { if (item.hasActualDataToDownload()) { indexesToDownload.add(item); } @@ -106,7 +114,7 @@ public class MultipleIndexItem extends DownloadItem { @Override public double getSizeToDownloadInMb() { double totalSizeMb = 0.0d; - for (IndexItem item : items) { + for (DownloadItem item : items) { if (item.hasActualDataToDownload()) { totalSizeMb += item.getSizeToDownloadInMb(); } @@ -114,30 +122,23 @@ public class MultipleIndexItem extends DownloadItem { return totalSizeMb; } - @NonNull - public String getSizeDescription(Context ctx, boolean baseSRTM) { - double totalSizeMb = 0.0d; - if (this.type == SRTM_COUNTRY_FILE) { - for (IndexItem item : items) { - if (item.hasActualDataToDownload()) { - boolean isBase = SrtmDownloadItem.isMetersItem(item); - if (baseSRTM && isBase || !baseSRTM && !isBase) { - totalSizeMb += item.getSizeToDownloadInMb(); - } - } - } - return getFormattedMb(ctx, totalSizeMb); - } - return getFormattedMb(ctx, getSizeToDownloadInMb()); - } - @Override public double getArchiveSizeMB() { double result = 0.0d; - for (IndexItem item : items) { + for (DownloadItem item : items) { result += item.getArchiveSizeMB(); } return result; } + @Nullable + public static IndexItem getIndexItem(@NonNull DownloadItem obj) { + if (obj instanceof IndexItem) { + return (IndexItem) obj; + } else if (obj instanceof SrtmDownloadItem) { + return ((SrtmDownloadItem) obj).getIndexItem(); + } + return null; + } + } diff --git a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java index 23e1462576..7933b4eeff 100644 --- a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java @@ -25,60 +25,60 @@ import java.util.ArrayList; import java.util.List; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; +import static net.osmand.plus.download.MultipleDownloadItem.getIndexItem; public class SelectIndexesUiHelper { - private OsmandApplication app; - private AppCompatActivity activity; + private final OsmandApplication app; + private final AppCompatActivity activity; + + private final ItemsToDownloadSelectedListener listener; + private final DateFormat dateFormat; + private final boolean showRemoteDate; + private final DownloadItem downloadItem; - private DateFormat dateFormat; - private boolean showRemoteDate; - private DownloadItem downloadItem; - private ItemsToDownloadSelectedListener listener; private SelectionBottomSheet dialog; - private SelectIndexesUiHelper(@NonNull DownloadItem item, + private SelectIndexesUiHelper(@NonNull DownloadItem downloadItem, @NonNull AppCompatActivity activity, @NonNull DateFormat dateFormat, boolean showRemoteDate, @NonNull ItemsToDownloadSelectedListener listener) { - this.activity = activity; this.app = (OsmandApplication) activity.getApplicationContext(); - this.downloadItem = item; + this.activity = activity; + this.downloadItem = downloadItem; this.dateFormat = dateFormat; this.showRemoteDate = showRemoteDate; this.listener = listener; } - public static void showDialog(@NonNull DownloadItem item, - @NonNull AppCompatActivity activity, - @NonNull DateFormat dateFormat, + public static void showDialog(@NonNull DownloadItem i, + @NonNull AppCompatActivity a, + @NonNull DateFormat df, boolean showRemoteDate, - @NonNull ItemsToDownloadSelectedListener listener) { - SelectIndexesUiHelper helper = - new SelectIndexesUiHelper(item, activity, dateFormat, showRemoteDate, listener); - helper.showDialogInternal(); + @NonNull ItemsToDownloadSelectedListener l) { + new SelectIndexesUiHelper(i, a, df, showRemoteDate, l).showDialogInternal(); } private void showDialogInternal() { if (downloadItem.getType() == SRTM_COUNTRY_FILE) { - if (downloadItem instanceof MultipleIndexItem) { + if (downloadItem instanceof MultipleDownloadItem) { showMultipleSrtmDialog(); } else { showSingleSrtmDialog(); } - } else if (downloadItem instanceof MultipleIndexItem) { + } else if (downloadItem instanceof MultipleDownloadItem) { showBaseDialog(); } } private void showBaseDialog() { - MultipleIndexItem multipleIndexItem = (MultipleIndexItem) downloadItem; - List indexesToDownload = getIndexesToDownload(multipleIndexItem); + MultipleDownloadItem multipleDownloadItem = (MultipleDownloadItem) downloadItem; + List indexesToDownload = getIndexesToDownload(multipleDownloadItem); List allItems = new ArrayList<>(); List selectedItems = new ArrayList<>(); OsmandRegions osmandRegions = app.getRegions(); - for (IndexItem indexItem : multipleIndexItem.getAllIndexes()) { + for (IndexItem indexItem : multipleDownloadItem.getAllIndexes()) { SelectableItem selectableItem = new SelectableItem(); selectableItem.setTitle(indexItem.getVisibleName(app, osmandRegions, false)); @@ -119,8 +119,11 @@ public class SelectIndexesUiHelper { boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app); SrtmDownloadItem srtmItem = (SrtmDownloadItem) downloadItem; - SelectableItem meterItem = createSrtmSelectableItem(srtmItem.getMeterItem()); - SelectableItem feetItem = createSrtmSelectableItem(srtmItem.getFeetItem()); + srtmItem.setUseMeters(true); + SelectableItem meterItem = createSrtmSelectableItem(srtmItem.getIndexItem()); + srtmItem.setUseMeters(false); + SelectableItem feetItem = createSrtmSelectableItem(srtmItem.getIndexItem()); + srtmItem.setUseMeters(baseSRTM); List radioItems = new ArrayList<>(); RadioItem meters = createRadioItem(meterItem, R.string.shared_string_meters); @@ -148,11 +151,10 @@ public class SelectIndexesUiHelper { } private SelectableItem createSrtmSelectableItem(IndexItem indexItem) { - boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); SelectableItem selectableItem = new SelectableItem(); selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); String size = indexItem.getSizeDescription(app); - size += " " + SrtmDownloadItem.getAbbreviationInScopes(app, baseItem); + size += " " + SrtmDownloadItem.getAbbreviationInScopes(app, indexItem); String date = indexItem.getDate(dateFormat, showRemoteDate); String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date); selectableItem.setDescription(description); @@ -177,42 +179,26 @@ public class SelectIndexesUiHelper { private void showMultipleSrtmDialog() { List selectedItems = new ArrayList<>(); - final List meterItems = new ArrayList<>(); - final List feetItems = new ArrayList<>(); - List indexesToDownload = getIndexesToDownload(downloadItem); - boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app); + List indexesToDownload = getIndexesToDownload((MultipleDownloadItem) downloadItem); - List allIndexes = new ArrayList<>(); - if (downloadItem instanceof MultipleIndexItem) { - allIndexes.addAll(((MultipleIndexItem) downloadItem).getAllIndexes()); - } else { - for (IndexItem indexItem : downloadItem.getRelatedGroup().getIndividualResources()) { - if (indexItem.getType() == SRTM_COUNTRY_FILE) { - allIndexes.add(indexItem); - } - } - } + List allItems = new ArrayList<>(((MultipleDownloadItem) downloadItem).getItems()); + List itemsList = new ArrayList<>(); - for (IndexItem indexItem : allIndexes) { - boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); + for (DownloadItem downloadItem : allItems) { + SrtmDownloadItem srtmItem = (SrtmDownloadItem) downloadItem; SelectableItem selectableItem = new SelectableItem(); - selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); - String size = indexItem.getSizeDescription(app); - size += " " + SrtmDownloadItem.getAbbreviationInScopes(app, baseItem); - String date = indexItem.getDate(dateFormat, showRemoteDate); + selectableItem.setTitle(downloadItem.getVisibleName(app, app.getRegions(), false)); + String size = downloadItem.getSizeDescription(app); + size += " " + SrtmDownloadItem.getAbbreviationInScopes(app, srtmItem); + String date = srtmItem.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); + selectableItem.setIconId(downloadItem.getType().getIconResource()); + selectableItem.setObject(downloadItem); - if (baseItem) { - meterItems.add(selectableItem); - } else { - feetItems.add(selectableItem); - } + itemsList.add(selectableItem); - if (indexesToDownload.contains(indexItem) - && (baseSRTM && baseItem || !baseSRTM && !baseItem)) { + if (indexesToDownload.contains(downloadItem)) { selectedItems.add(selectableItem); } } @@ -225,7 +211,7 @@ public class SelectIndexesUiHelper { radioItems.add(feet); final SelectMultipleWithModeBottomSheet dialog = SelectMultipleWithModeBottomSheet.showInstance( - activity, baseSRTM ? meterItems : feetItems, selectedItems, radioItems, true); + activity, itemsList, selectedItems, radioItems, true); meters.setOnClickListener(new OnRadioItemClickListener() { @Override @@ -267,9 +253,9 @@ public class SelectIndexesUiHelper { public void onSelectionApplied(List selectedItems) { List indexItems = new ArrayList<>(); for (SelectableItem item : selectedItems) { - Object obj = item.getObject(); - if (obj instanceof IndexItem) { - indexItems.add((IndexItem) obj); + IndexItem index = getIndexItem((DownloadItem) item.getObject()); + if (index != null) { + indexItems.add(index); } } listener.onItemsToDownloadSelected(indexItems); @@ -293,41 +279,31 @@ public class SelectIndexesUiHelper { dialog.setApplyButtonTitle(btnTitle); } - private static List getIndexesToDownload(DownloadItem downloadItem) { - if (downloadItem instanceof MultipleIndexItem) { - if (downloadItem.hasActualDataToDownload()) { - // download left regions - return ((MultipleIndexItem) downloadItem).getIndexesToDownload(); - } else { - // download all regions again - return ((MultipleIndexItem) downloadItem).getAllIndexes(); - } - } else { - List indexesToDownload = new ArrayList<>(); - for (IndexItem indexItem : downloadItem.getRelatedGroup().getIndividualResources()) { - if (indexItem.getType() == SRTM_COUNTRY_FILE && indexItem.hasActualDataToDownload()) { - indexesToDownload.add(indexItem); - } - } - return indexesToDownload; - } - } - - private static double getDownloadSizeInMb(@NonNull List selectableItems) { - List indexItems = new ArrayList<>(); + private double getDownloadSizeInMb(@NonNull List selectableItems) { + List downloadItems = new ArrayList<>(); for (SelectableItem i : selectableItems) { Object obj = i.getObject(); - if (obj instanceof IndexItem) { - indexItems.add((IndexItem) obj); + if (obj instanceof DownloadItem) { + downloadItems.add((DownloadItem) obj); } } double totalSizeMb = 0.0d; - for (IndexItem item : indexItems) { + for (DownloadItem item : downloadItems) { totalSizeMb += item.getSizeToDownloadInMb(); } return totalSizeMb; } + private static List getIndexesToDownload(MultipleDownloadItem multipleDownloadItem) { + if (multipleDownloadItem.hasActualDataToDownload()) { + // download left regions + return multipleDownloadItem.getIndexesToDownload(); + } else { + // download all regions again + return multipleDownloadItem.getAllIndexes(); + } + } + public interface ItemsToDownloadSelectedListener { void onItemsToDownloadSelected(List items); } diff --git a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java index d060a196a0..c89194910e 100644 --- a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java +++ b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java @@ -10,9 +10,11 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.helpers.enums.MetricsConstants; +import net.osmand.util.Algorithms; import java.io.File; import java.text.DateFormat; +import java.util.Collections; import java.util.List; import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; @@ -22,53 +24,28 @@ import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; public class SrtmDownloadItem extends DownloadItem { - private List indexes; - private IndexItem meter; - private IndexItem feet; - - private boolean shouldUseMeters; + private final List indexes; + private boolean useMeters; public SrtmDownloadItem(List indexes, - boolean shouldUseMeters) { + boolean useMeters) { super(SRTM_COUNTRY_FILE); this.indexes = indexes; - this.shouldUseMeters = shouldUseMeters; + this.useMeters = useMeters; } - public boolean isShouldUseMeters() { - return shouldUseMeters; - } - - public void setShouldUseMeters(boolean shouldUseMeters) { - this.shouldUseMeters = shouldUseMeters; + public void setUseMeters(boolean useMeters) { + this.useMeters = useMeters; } + @Nullable public IndexItem getIndexItem() { - return shouldUseMeters ? getMeterItem() : getFeetItem(); - } - - @Nullable - public IndexItem getMeterItem() { - if (meter == null && indexes != null) { - for (IndexItem index : indexes) { - if (isMetersItem(index)) { - meter = index; - } + for (IndexItem index : indexes) { + if (useMeters && isMetersItem(index) || !useMeters && !isMetersItem(index)) { + return index; } } - return meter; - } - - @Nullable - public IndexItem getFeetItem() { - if (feet == null && indexes != null) { - for (IndexItem index : indexes) { - if (!isMetersItem(index)) { - feet = index; - } - } - } - return feet; + return null; } @Override @@ -82,52 +59,84 @@ public class SrtmDownloadItem extends DownloadItem { } @Override - public boolean isDownloaded() { - return meter.isDownloaded() || feet.isDownloaded(); + public boolean isOutdated() { + for (DownloadItem item : indexes) { + if (item.isOutdated()) { + return true; + } + } + return false; } @Override - public boolean isOutdated() { - return meter.isOutdated() || feet.isOutdated(); + public boolean isDownloaded() { + for (DownloadItem item : indexes) { + if (item.isDownloaded()) { + return true; + } + } + return false; } @Override public boolean hasActualDataToDownload() { - return getIndexItem().hasActualDataToDownload(); + // may be check only downloaded items if any downloaded + for (IndexItem item : indexes) { + if (item.hasActualDataToDownload()) { + return true; + } + } + return false; } @Override public boolean isDownloading(@NonNull DownloadIndexesThread thread) { - return getMeterItem().isDownloading(thread) || getFeetItem().isDownloading(thread); + for (IndexItem item : indexes) { + if (thread.isDownloading(item)) { + return true; + } + } + return false; } @Override public String getFileName() { + // may be check only downloaded items if any downloaded return getIndexItem().getFileName(); } @NonNull @Override public List getDownloadedFiles(@NonNull OsmandApplication app) { - return getIndexItem().getDownloadedFiles(app); + // may be check both indexes files + List result; + for (IndexItem index : indexes) { + result = index.getDownloadedFiles(app); + if (!Algorithms.isEmpty(result)) { + return result; + } + } + return Collections.emptyList(); } public String getDate(@NonNull DateFormat dateFormat, boolean remote) { + // may be check only downloaded items if any downloaded return getIndexItem().getDate(dateFormat, remote); } public static boolean shouldUseMetersByDefault(@NonNull OsmandApplication app) { - return app.getSettings().METRIC_SYSTEM.get() != MetricsConstants.MILES_AND_FEET; + MetricsConstants metricSystem = app.getSettings().METRIC_SYSTEM.get(); + return metricSystem != MetricsConstants.MILES_AND_FEET; } @NonNull - public static String getAbbreviationInScopes(Context ctx, boolean base) { - return "(" + getAbbreviation(ctx, base) + ")"; + public static String getAbbreviationInScopes(Context ctx, Object obj) { + return "(" + getAbbreviation(ctx, obj) + ")"; } @NonNull - public static String getAbbreviation(Context context, boolean base) { - return context.getString(base ? R.string.m : R.string.foot); + public static String getAbbreviation(Context context, Object obj) { + return context.getString(isMetersItem(obj) ? R.string.m : R.string.foot); } public static boolean isMetersItem(Object item) { @@ -135,6 +144,10 @@ public class SrtmDownloadItem extends DownloadItem { 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); + } else if (item instanceof SrtmDownloadItem) { + return ((SrtmDownloadItem) item).useMeters; + } else if (item instanceof MultipleDownloadItem) { + return isMetersItem(((MultipleDownloadItem) item).getItems().get(0)); } return false; } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 99d1dc1024..31d228f50e 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -43,7 +43,7 @@ import net.osmand.plus.download.DownloadResources; import net.osmand.plus.download.IndexItem; import net.osmand.plus.download.SelectIndexesUiHelper; import net.osmand.plus.download.SelectIndexesUiHelper.ItemsToDownloadSelectedListener; -import net.osmand.plus.download.MultipleIndexItem; +import net.osmand.plus.download.MultipleDownloadItem; import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask; import net.osmand.plus.helpers.FileNameTranslationHelper; @@ -193,8 +193,6 @@ public class ItemViewHolder { } descrTextView.setTextColor(textColorSecondary); if (!isDownloading) { - boolean srtmItem = SrtmDownloadItem.isSRTMItem(downloadItem); - boolean baseMetricSystem = SrtmDownloadItem.shouldUseMetersByDefault(context.getMyApplication()); progressBar.setVisibility(View.GONE); descrTextView.setVisibility(View.VISIBLE); if (downloadItem instanceof CustomIndexItem && (((CustomIndexItem) downloadItem).getSubName(context) != null)) { @@ -209,34 +207,12 @@ public class ItemViewHolder { } else { descrTextView.setText(downloadItem.getType().getString(context)); } - } else if (downloadItem instanceof MultipleIndexItem) { - MultipleIndexItem item = (MultipleIndexItem) downloadItem; + } else if (downloadItem instanceof MultipleDownloadItem) { + MultipleDownloadItem item = (MultipleDownloadItem) downloadItem; String allRegionsHeader = context.getString(R.string.shared_strings_all_regions); String regionsHeader = context.getString(R.string.regions); - String allRegionsCount; - String leftToDownloadCount; - if (SrtmDownloadItem.isSRTMItem(item)) { - List items = new ArrayList<>(); - for (IndexItem indexItem : item.getAllIndexes()) { - boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); - if (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem) { - items.add(indexItem); - } - } - allRegionsCount = String.valueOf(items.size()); - items.clear(); - for (IndexItem indexItem : item.getIndexesToDownload()) { - boolean baseItem = SrtmDownloadItem.isMetersItem(indexItem); - if (!indexItem.isDownloaded() - && (baseMetricSystem && baseItem || !baseMetricSystem && !baseItem)) { - items.add(indexItem); - } - } - leftToDownloadCount = String.valueOf(items.size()); - } else { - allRegionsCount = String.valueOf(item.getAllIndexes().size()); - leftToDownloadCount = String.valueOf(item.getIndexesToDownload().size()); - } + String allRegionsCount = String.valueOf(item.getItems().size()); + String leftToDownloadCount = String.valueOf(item.getIndexesToDownload().size()); String header; String count; if (item.hasActualDataToDownload()) { @@ -255,13 +231,13 @@ public class ItemViewHolder { count = allRegionsCount; } String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count); - if (srtmItem) { - fullDescription += " " + SrtmDownloadItem.getAbbreviationInScopes(context, baseMetricSystem); + if (SrtmDownloadItem.isSRTMItem(downloadItem)) { + fullDescription += " " + SrtmDownloadItem.getAbbreviationInScopes(context, item); } if (item.hasActualDataToDownload()) { fullDescription = context.getString( - R.string.ltr_or_rtl_combine_via_bold_point, fullDescription, srtmItem - ? item.getSizeDescription(context, baseMetricSystem) : item.getSizeDescription(context)); + R.string.ltr_or_rtl_combine_via_bold_point, fullDescription, + item.getSizeDescription(context)); } descrTextView.setText(fullDescription); } else if (downloadItem instanceof SrtmDownloadItem) { @@ -269,7 +245,7 @@ public class ItemViewHolder { 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.getAbbreviationInScopes(context, SrtmDownloadItem.isMetersItem(item)); + + " " + SrtmDownloadItem.getAbbreviationInScopes(context, item); String date = item.getDate(dateFormat, showRemoteDate); String fullDescription = String.format(pattern, size, date); if (showTypeInDesc) { @@ -358,7 +334,7 @@ public class ItemViewHolder { } private int getDownloadActionIconId(@NonNull DownloadItem item) { - return item instanceof MultipleIndexItem ? + return item instanceof MultipleDownloadItem ? R.drawable.ic_action_multi_download : R.drawable.ic_action_gsave_dark; } @@ -519,11 +495,11 @@ public class ItemViewHolder { } private void startDownload(DownloadItem item) { - if (item instanceof MultipleIndexItem || item.getType() == SRTM_COUNTRY_FILE) { - selectIndexesToDownload(item); - } else if (item instanceof IndexItem) { + if (item instanceof IndexItem) { IndexItem indexItem = (IndexItem) item; context.startDownload(indexItem); + } else { + selectIndexesToDownload(item); } } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java index b4e11d6bf7..2c691a78de 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java @@ -1032,7 +1032,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement } if (SrtmDownloadItem.isSRTMItem(child)) { - builder.append(" ").append(SrtmDownloadItem.getAbbreviationInScopes(ctx, SrtmDownloadItem.isMetersItem(child))); + builder.append(" ").append(SrtmDownloadItem.getAbbreviationInScopes(ctx, child)); } if (!Algorithms.isEmpty(child.getDescription())) { From ae2eef75f301f70ef26d4149a4051baa046191d4 Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Fri, 16 Apr 2021 18:28:21 +0300 Subject: [PATCH 6/9] refactoring p.5: optimize bottom sheets dialogs --- .../plus/base/ModeSelectionBottomSheet.java | 80 ++++++++++ ...java => MultipleSelectionBottomSheet.java} | 118 +++++++------- .../base/MultipleWithModeBottomSheet.java | 40 +++++ .../plus/base/SelectModeBottomSheet.java | 96 ------------ .../SelectMultipleWithModeBottomSheet.java | 53 ------- .../plus/base/SelectionBottomSheet.java | 144 +++++++++++++----- .../plus/download/SelectIndexesUiHelper.java | 22 +-- 7 files changed, 299 insertions(+), 254 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/base/ModeSelectionBottomSheet.java rename OsmAnd/src/net/osmand/plus/base/{SelectMultipleItemsBottomSheet.java => MultipleSelectionBottomSheet.java} (54%) create mode 100644 OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java delete mode 100644 OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java delete mode 100644 OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java diff --git a/OsmAnd/src/net/osmand/plus/base/ModeSelectionBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/ModeSelectionBottomSheet.java new file mode 100644 index 0000000000..f8355c8805 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/base/ModeSelectionBottomSheet.java @@ -0,0 +1,80 @@ +package net.osmand.plus.base; + +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentManager; + +import net.osmand.AndroidUtils; +import net.osmand.plus.R; +import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; + +import java.util.Collections; +import java.util.List; + +public class ModeSelectionBottomSheet extends SelectionBottomSheet { + + public static final String TAG = ModeSelectionBottomSheet.class.getSimpleName(); + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + showElements(primaryDescription, toggleContainer); + hideElements(checkBox, checkBoxTitle, titleDescription, + secondaryDescription, selectedSize, selectAllButton); + } + + @Override + protected void updateItemView(SelectableItem item, View view) { + ImageView ivIcon = view.findViewById(R.id.icon); + TextView tvTitle = view.findViewById(R.id.title); + TextView tvDescr = view.findViewById(R.id.description); + + Drawable icon = uiUtilities.getIcon(item.getIconId(), activeColorRes); + ivIcon.setImageDrawable(icon); + tvTitle.setText(item.getTitle()); + tvDescr.setText(item.getDescription()); + tvDescr.setTextColor(ContextCompat.getColor(app, AndroidUtils.getSecondaryTextColorId(nightMode))); + } + + @Override + protected int getItemLayoutId() { + return R.layout.bottom_sheet_item_with_descr_56dp; + } + + public void setItem(SelectableItem item) { + setItems(Collections.singletonList(item)); + } + + @NonNull + @Override + public List getSelectedItems() { + return allItems; + } + + @Override + protected boolean shouldShowDivider() { + return false; + } + + public static ModeSelectionBottomSheet showInstance(@NonNull AppCompatActivity activity, + @NonNull SelectableItem previewItem, + @NonNull List radioItems, + boolean usedOnMap) { + ModeSelectionBottomSheet fragment = new ModeSelectionBottomSheet(); + fragment.setUsedOnMap(usedOnMap); + fragment.setModes(radioItems); + fragment.setItems(Collections.singletonList(previewItem)); + FragmentManager fm = activity.getSupportFragmentManager(); + fragment.show(fm, TAG); + return fragment; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/MultipleSelectionBottomSheet.java similarity index 54% rename from OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java rename to OsmAnd/src/net/osmand/plus/base/MultipleSelectionBottomSheet.java index d9a6204e2c..728dfbaa65 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectMultipleItemsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/MultipleSelectionBottomSheet.java @@ -1,7 +1,12 @@ package net.osmand.plus.base; import android.content.res.ColorStateList; +import android.os.Bundle; import android.view.View; +import android.view.View.OnClickListener; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -12,9 +17,7 @@ import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.plus.R; -import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; -import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; -import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton.Builder; +import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.util.Algorithms; import java.util.ArrayList; @@ -24,16 +27,16 @@ import static net.osmand.view.ThreeStateCheckbox.State.CHECKED; import static net.osmand.view.ThreeStateCheckbox.State.MISC; import static net.osmand.view.ThreeStateCheckbox.State.UNCHECKED; -public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { +public class MultipleSelectionBottomSheet extends SelectionBottomSheet { - public static final String TAG = SelectMultipleItemsBottomSheet.class.getSimpleName(); + public static final String TAG = MultipleSelectionBottomSheet.class.getSimpleName(); - private final List allItems = new ArrayList<>(); private final List selectedItems = new ArrayList<>(); private SelectionUpdateListener selectionUpdateListener; @Override - protected void initHeaderUi() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); selectAllButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -45,39 +48,49 @@ public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { selectedItems.clear(); } onSelectedItemsChanged(); - updateItems(checked); + updateItemsSelection(checked); } }); } @Override - protected void createSelectionUi() { - for (final SelectableItem item : allItems) { - boolean checked = selectedItems.contains(item); - final BottomSheetItemWithCompoundButton[] uiItem = new BottomSheetItemWithCompoundButton[1]; - final Builder builder = (BottomSheetItemWithCompoundButton.Builder) new Builder(); - builder.setChecked(checked) - .setButtonTintList(AndroidUtils.createCheckedColorStateList(app, secondaryColorRes, activeColorRes)) - .setLayoutId(R.layout.bottom_sheet_item_with_descr_and_checkbox_56dp) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - boolean checked = !uiItem[0].isChecked(); - uiItem[0].setChecked(checked); - SelectableItem tag = (SelectableItem) uiItem[0].getTag(); - if (checked) { - selectedItems.add(tag); - } else { - selectedItems.remove(tag); - } - onSelectedItemsChanged(); - } - }) - .setTag(item); - setupListItem(builder, item); - uiItem[0] = builder.create(); - items.add(uiItem[0]); - } + protected boolean shouldShowDivider() { + return true; + } + + @Override + protected void updateItemView(final SelectableItem item, View view) { + boolean checked = selectedItems.contains(item); + ImageView imageView = view.findViewById(R.id.icon); + TextView title = view.findViewById(R.id.title); + TextView description = view.findViewById(R.id.description); + final CheckBox checkBox = view.findViewById(R.id.compound_button); + AndroidUiHelper.setVisibility(View.VISIBLE, imageView, title, description, checkBox); + + checkBox.setChecked(checked); + CompoundButtonCompat.setButtonTintList(checkBox, AndroidUtils.createCheckedColorStateList(app, secondaryColorRes, activeColorRes)); + + view.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + boolean checked = !checkBox.isChecked(); + checkBox.setChecked(checked); + if (checked) { + selectedItems.add(item); + } else { + selectedItems.remove(item); + } + onSelectedItemsChanged(); + } + }); + title.setText(item.getTitle()); + description.setText(item.getDescription()); + imageView.setImageDrawable(uiUtilities.getIcon(item.getIconId(), activeColorRes)); + } + + @Override + protected int getItemLayoutId() { + return R.layout.bottom_sheet_item_with_descr_and_checkbox_56dp; } @Override @@ -95,12 +108,6 @@ public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { } } - private void setupListItem(Builder builder, SelectableItem item) { - builder.setTitle(item.getTitle()); - builder.setDescription(item.getDescription()); - builder.setIcon(uiUtilities.getIcon(item.getIconId(), activeColorRes)); - } - private void updateSelectAllButton() { String checkBoxTitle; if (Algorithms.isEmpty(selectedItems)) { @@ -126,21 +133,16 @@ public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { rightButton.setEnabled(noEmptySelection); } - private void updateItems(boolean checked) { - for (BaseBottomSheetItem item : items) { - if (item instanceof BottomSheetItemWithCompoundButton) { - ((BottomSheetItemWithCompoundButton) item).setChecked(checked); + private void updateItemsSelection(boolean checked) { + for (SelectableItem item : allItems) { + View v = listViews.get(item); + CheckBox checkBox = v != null ? (CheckBox) v.findViewById(R.id.compound_button) : null; + if (checkBox != null) { + checkBox.setChecked(checked); } } } - protected void setItems(List allItems) { - if (!Algorithms.isEmpty(allItems)) { - this.allItems.clear(); - this.allItems.addAll(allItems); - } - } - protected void setSelectedItems(List selected) { if (!Algorithms.isEmpty(selected)) { selectedItems.clear(); @@ -150,7 +152,7 @@ public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { @NonNull @Override - public List getSelection() { + public List getSelectedItems() { return selectedItems; } @@ -158,11 +160,11 @@ public class SelectMultipleItemsBottomSheet extends SelectionBottomSheet { this.selectionUpdateListener = selectionUpdateListener; } - public static SelectMultipleItemsBottomSheet showInstance(@NonNull AppCompatActivity activity, - @NonNull List items, - @Nullable List selected, - boolean usedOnMap) { - SelectMultipleItemsBottomSheet fragment = new SelectMultipleItemsBottomSheet(); + public static MultipleSelectionBottomSheet showInstance(@NonNull AppCompatActivity activity, + @NonNull List items, + @Nullable List selected, + boolean usedOnMap) { + MultipleSelectionBottomSheet fragment = new MultipleSelectionBottomSheet(); fragment.setUsedOnMap(usedOnMap); fragment.setItems(items); fragment.setSelectedItems(selected); diff --git a/OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java new file mode 100644 index 0000000000..0c3eb8c795 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java @@ -0,0 +1,40 @@ +package net.osmand.plus.base; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentManager; + +import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; + +import java.util.List; + +public class MultipleWithModeBottomSheet extends MultipleSelectionBottomSheet { + + public static final String TAG = MultipleWithModeBottomSheet.class.getSimpleName(); + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + showElements(secondaryDescription, toggleContainer, checkBox, + checkBoxTitle, titleDescription, selectedSize, selectAllButton); + } + + public static MultipleWithModeBottomSheet showInstance(@NonNull AppCompatActivity activity, + @NonNull List items, + @Nullable List selected, + @NonNull List modes, + boolean usedOnMap) { + MultipleWithModeBottomSheet fragment = new MultipleWithModeBottomSheet(); + fragment.setUsedOnMap(usedOnMap); + fragment.setItems(items); + fragment.setSelectedItems(selected); + fragment.setModes(modes); + FragmentManager fm = activity.getSupportFragmentManager(); + fragment.show(fm, TAG); + return fragment; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java deleted file mode 100644 index d16e61896e..0000000000 --- a/OsmAnd/src/net/osmand/plus/base/SelectModeBottomSheet.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.osmand.plus.base; - -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.FragmentManager; - -import net.osmand.AndroidUtils; -import net.osmand.plus.R; -import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; -import net.osmand.plus.helpers.AndroidUiHelper; -import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; - -import java.util.Collections; -import java.util.List; - -public class SelectModeBottomSheet extends SelectionBottomSheet { - - public static final String TAG = SelectModeBottomSheet.class.getSimpleName(); - - private BottomSheetItemWithDescription previewUi; - - private List modes; - private SelectableItem previewItem; - - @Override - protected void initHeaderUi() { - radioGroup.setItems(modes); - - AndroidUiHelper.setVisibility(View.VISIBLE, primaryDescription, toggleContainer); - - AndroidUiHelper.setVisibility(View.GONE, checkBox, checkBoxTitle, - titleDescription, secondaryDescription, selectedSize, selectAllButton); - } - - @Override - protected void createSelectionUi() { - previewUi = (BottomSheetItemWithDescription) new BottomSheetItemWithDescription.Builder() - .setDescription(previewItem.getDescription()) - .setDescriptionColorId(AndroidUtils.getSecondaryTextColorId(nightMode)) - .setTitle(previewItem.getTitle()) - .setIcon(uiUtilities.getIcon(previewItem.getIconId(), activeColorRes)) - .setTag(previewItem) - .setLayoutId(R.layout.bottom_sheet_item_with_descr_56dp) - .create(); - items.add(previewUi); - } - - private void updatePreviewUi() { - previewUi.setTitle(previewItem.getTitle()); - previewUi.setIcon(uiUtilities.getIcon(previewItem.getIconId(), activeColorRes)); - previewUi.setDescription(previewItem.getDescription()); - previewUi.setTag(previewItem); - } - - private void setModes(@NonNull List modes) { - this.modes = modes; - } - - public void setSelectedMode(@NonNull RadioItem mode) { - radioGroup.setSelectedItem(mode); - } - - public void setPreviewItem(@NonNull SelectableItem preview) { - this.previewItem = preview; - if (previewUi != null) { - updatePreviewUi(); - } - } - - @NonNull - @Override - public List getSelection() { - return Collections.singletonList(previewItem); - } - - @Override - protected boolean shouldShowDivider() { - return false; - } - - public static SelectModeBottomSheet showInstance(@NonNull AppCompatActivity activity, - @NonNull SelectableItem previewItem, - @NonNull List radioItems, - boolean usedOnMap) { - SelectModeBottomSheet fragment = new SelectModeBottomSheet(); - fragment.setUsedOnMap(usedOnMap); - fragment.setModes(radioItems); - fragment.setPreviewItem(previewItem); - FragmentManager fm = activity.getSupportFragmentManager(); - fragment.show(fm, TAG); - return fragment; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java deleted file mode 100644 index 4318d9c3c7..0000000000 --- a/OsmAnd/src/net/osmand/plus/base/SelectMultipleWithModeBottomSheet.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.osmand.plus.base; - -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.FragmentManager; - -import net.osmand.plus.helpers.AndroidUiHelper; -import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; - -import java.util.List; - -public class SelectMultipleWithModeBottomSheet extends SelectMultipleItemsBottomSheet { - - public static final String TAG = SelectMultipleWithModeBottomSheet.class.getSimpleName(); - - private List modes; - - @Override - protected void initHeaderUi() { - super.initHeaderUi(); - radioGroup.setItems(modes); - - AndroidUiHelper.setVisibility(View.VISIBLE, secondaryDescription, toggleContainer, - checkBox, checkBoxTitle, titleDescription, selectedSize, selectAllButton); - } - - private void setModes(@NonNull List modes) { - this.modes = modes; - } - - public void setSelectedMode(@NonNull RadioItem mode) { - radioGroup.setSelectedItem(mode); - } - - public static SelectMultipleWithModeBottomSheet showInstance(@NonNull AppCompatActivity activity, - @NonNull List items, - @Nullable List selected, - @NonNull List modes, - boolean usedOnMap) { - SelectMultipleWithModeBottomSheet fragment = new SelectMultipleWithModeBottomSheet(); - fragment.setUsedOnMap(usedOnMap); - fragment.setItems(items); - fragment.setSelectedItems(selected); - fragment.setModes(modes); - FragmentManager fm = activity.getSupportFragmentManager(); - fragment.show(fm, TAG); - return fragment; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java index 6f788a9be2..26a66cdb61 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java @@ -1,10 +1,12 @@ package net.osmand.plus.base; +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; +import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; import androidx.annotation.NonNull; @@ -16,14 +18,21 @@ import net.osmand.plus.UiUtilities; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.SimpleDividerItem; +import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.widgets.MultiStateToggleButton; +import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; +import net.osmand.util.Algorithms; import net.osmand.view.ThreeStateCheckbox; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment { protected OsmandApplication app; + protected LayoutInflater inflater; protected UiUtilities uiUtilities; protected TextView title; @@ -45,6 +54,10 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment private OnUiInitializedListener uiInitializedListener; private OnApplySelectionListener applySelectionListener; + protected List allItems = new ArrayList<>(); + protected Map listViews = new HashMap<>(); + private List modes; + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { @@ -57,27 +70,19 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment public void createMenuItems(Bundle savedInstanceState) { app = requiredMyApplication(); uiUtilities = app.getUIUtilities(); + inflater = UiUtilities.getInflater(requireContext(), nightMode); activeColorRes = nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light; secondaryColorRes = nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light; - items.add(createHeaderUi()); + items.add(createHeaderView()); if (shouldShowDivider()) { items.add(new SimpleDividerItem(app)); } - createSelectionUi(); + items.add(createSelectionView()); } - @Override - public void onPause() { - super.onPause(); - if (requireActivity().isChangingConfigurations()) { - dismiss(); - } - } - - private BaseBottomSheetItem createHeaderUi() { - LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode); - View view = themedInflater.inflate(R.layout.settings_group_title, null); + private BaseBottomSheetItem createHeaderView() { + View view = inflater.inflate(R.layout.settings_group_title, null); title = view.findViewById(R.id.title); titleDescription = view.findViewById(R.id.title_description); @@ -90,22 +95,22 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment checkBoxTitle = view.findViewById(R.id.check_box_title); checkBox = view.findViewById(R.id.check_box); - initHeaderUi(); + if (modes != null) { + radioGroup.setItems(modes); + } + return new SimpleBottomSheetItem.Builder().setCustomView(view).create(); } - protected abstract void createSelectionUi(); - - protected abstract void initHeaderUi(); - - protected boolean shouldShowDivider() { - return true; - } - - @Override - protected void setupRightButton() { - super.setupRightButton(); - applyButtonTitle = rightButton.findViewById(R.id.button_text); + private BaseBottomSheetItem createSelectionView() { + Context themedCtx = UiUtilities.getThemedContext(requireContext(), nightMode); + listContainer = new LinearLayout(themedCtx); + listContainer.setLayoutParams(new LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + listContainer.setOrientation(LinearLayout.VERTICAL); + fillInSelectionList(); + return new SimpleBottomSheetItem.Builder().setCustomView(listContainer).create(); } public void setTitle(@NonNull String title) { @@ -128,20 +133,23 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment applyButtonTitle.setText(title); } - @Override - protected void onRightBottomButtonClick() { - if (applySelectionListener != null) { - applySelectionListener.onSelectionApplied(getSelection()); + public void setModes(@NonNull List modes) { + this.modes = modes; + if (radioGroup != null) { + radioGroup.setItems(modes); } - dismiss(); } - @NonNull - public abstract List getSelection(); + public void setSelectedMode(@NonNull RadioItem mode) { + radioGroup.setSelectedItem(mode); + } - @Override - protected int getRightBottomButtonTextId() { - return R.string.shared_string_apply; + public void setItems(List allItems) { + if (!Algorithms.isEmpty(allItems)) { + this.allItems.clear(); + this.allItems.addAll(allItems); + fillInSelectionList(); + } } public void setUiInitializedListener(OnUiInitializedListener uiInitializedListener) { @@ -152,17 +160,81 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment this.applySelectionListener = onApplySelectionListener; } + private void fillInSelectionList() { + if (listContainer != null && allItems != null) { + recreateList(); + } + } + + private void recreateList() { + listViews.clear(); + listContainer.removeAllViews(); + for (SelectableItem item : allItems) { + setupItemView(item, inflater.inflate(getItemLayoutId(), null)); + } + } + + private void setupItemView(SelectableItem item, View view) { + updateItemView(item, view); + listViews.put(item, view); + listContainer.addView(view); + } + + @NonNull + public abstract List getSelectedItems(); + + protected abstract void updateItemView(SelectableItem item, View view); + + protected abstract int getItemLayoutId(); + + protected abstract boolean shouldShowDivider(); + protected void notifyUiInitialized() { if (uiInitializedListener != null) { uiInitializedListener.onUiInitialized(); } } + protected void showElements(View... views) { + AndroidUiHelper.setVisibility(View.VISIBLE, views); + } + + protected void hideElements(View... views) { + AndroidUiHelper.setVisibility(View.GONE, views); + } + + @Override + protected void setupRightButton() { + super.setupRightButton(); + applyButtonTitle = rightButton.findViewById(R.id.button_text); + } + + @Override + protected void onRightBottomButtonClick() { + if (applySelectionListener != null) { + applySelectionListener.onSelectionApplied(getSelectedItems()); + } + dismiss(); + } + + @Override + protected int getRightBottomButtonTextId() { + return R.string.shared_string_apply; + } + @Override protected boolean useVerticalButtons() { return true; } + @Override + public void onPause() { + super.onPause(); + if (requireActivity().isChangingConfigurations()) { + dismiss(); + } + } + public interface OnUiInitializedListener { void onUiInitialized(); } diff --git a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java index 7933b4eeff..03b9bc7b9b 100644 --- a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java @@ -8,10 +8,10 @@ import androidx.appcompat.app.AppCompatActivity; import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.base.SelectMultipleItemsBottomSheet; -import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectionUpdateListener; -import net.osmand.plus.base.SelectModeBottomSheet; -import net.osmand.plus.base.SelectMultipleWithModeBottomSheet; +import net.osmand.plus.base.MultipleSelectionBottomSheet; +import net.osmand.plus.base.MultipleSelectionBottomSheet.SelectionUpdateListener; +import net.osmand.plus.base.ModeSelectionBottomSheet; +import net.osmand.plus.base.MultipleWithModeBottomSheet; import net.osmand.plus.base.SelectionBottomSheet; import net.osmand.plus.base.SelectionBottomSheet.OnApplySelectionListener; import net.osmand.plus.base.SelectionBottomSheet.OnUiInitializedListener; @@ -96,8 +96,8 @@ public class SelectIndexesUiHelper { } } - final SelectMultipleItemsBottomSheet dialog = - SelectMultipleItemsBottomSheet.showInstance(activity, allItems, selectedItems, true); + final MultipleSelectionBottomSheet dialog = + MultipleSelectionBottomSheet.showInstance(activity, allItems, selectedItems, true); dialog.setUiInitializedListener(new OnUiInitializedListener() { @Override @@ -131,7 +131,7 @@ public class SelectIndexesUiHelper { radioItems.add(meters); radioItems.add(feet); - dialog = SelectModeBottomSheet.showInstance(activity, + dialog = ModeSelectionBottomSheet.showInstance(activity, baseSRTM ? meterItem : feetItem, radioItems, true); final RadioItem initRadio = baseSRTM ? meters : feet; @@ -139,7 +139,7 @@ public class SelectIndexesUiHelper { dialog.setUiInitializedListener(new OnUiInitializedListener() { @Override public void onUiInitialized() { - SelectModeBottomSheet dialog = (SelectModeBottomSheet) SelectIndexesUiHelper.this.dialog; + ModeSelectionBottomSheet dialog = (ModeSelectionBottomSheet) SelectIndexesUiHelper.this.dialog; dialog.setTitle(app.getString(R.string.srtm_unit_format)); dialog.setPrimaryDescription(app.getString(R.string.srtm_download_single_help_message)); updateSize(dialog, false); @@ -169,7 +169,7 @@ public class SelectIndexesUiHelper { radioItem.setOnClickListener(new OnRadioItemClickListener() { @Override public boolean onRadioItemClick(RadioItem radioItem, View view) { - ((SelectModeBottomSheet)dialog).setPreviewItem(selectableItem); + ((ModeSelectionBottomSheet)dialog).setItem(selectableItem); updateSize(dialog, false); return true; } @@ -210,7 +210,7 @@ public class SelectIndexesUiHelper { radioItems.add(meters); radioItems.add(feet); - final SelectMultipleWithModeBottomSheet dialog = SelectMultipleWithModeBottomSheet.showInstance( + final MultipleWithModeBottomSheet dialog = MultipleWithModeBottomSheet.showInstance( activity, itemsList, selectedItems, radioItems, true); meters.setOnClickListener(new OnRadioItemClickListener() { @@ -265,7 +265,7 @@ public class SelectIndexesUiHelper { private void updateSize(SelectionBottomSheet dialog, boolean updateDescription) { - double sizeToDownload = getDownloadSizeInMb(dialog.getSelection()); + double sizeToDownload = getDownloadSizeInMb(dialog.getSelectedItems()); String size = DownloadItem.getFormattedMb(app, sizeToDownload); if (updateDescription) { String total = app.getString(R.string.shared_string_total); From 2f1e43147da47817646b2dc8bae7ef7b214418ad Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Fri, 16 Apr 2021 22:19:26 +0300 Subject: [PATCH 7/9] refactoring p.6: dialog preparation and update --- ...MultipleSelectionWithModeBottomSheet.java} | 17 +- .../plus/base/SelectionBottomSheet.java | 4 + .../osmand/plus/download/DownloadItem.java | 11 +- .../net/osmand/plus/download/IndexItem.java | 14 +- .../plus/download/MultipleDownloadItem.java | 41 ++- .../plus/download/SelectIndexesUiHelper.java | 267 ++++++++---------- .../plus/download/SrtmDownloadItem.java | 18 +- .../plus/download/ui/ItemViewHolder.java | 34 +-- 8 files changed, 214 insertions(+), 192 deletions(-) rename OsmAnd/src/net/osmand/plus/base/{MultipleWithModeBottomSheet.java => MultipleSelectionWithModeBottomSheet.java} (50%) diff --git a/OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/MultipleSelectionWithModeBottomSheet.java similarity index 50% rename from OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java rename to OsmAnd/src/net/osmand/plus/base/MultipleSelectionWithModeBottomSheet.java index 0c3eb8c795..261e8dfdea 100644 --- a/OsmAnd/src/net/osmand/plus/base/MultipleWithModeBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/MultipleSelectionWithModeBottomSheet.java @@ -12,22 +12,23 @@ import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; import java.util.List; -public class MultipleWithModeBottomSheet extends MultipleSelectionBottomSheet { +public class MultipleSelectionWithModeBottomSheet extends MultipleSelectionBottomSheet { - public static final String TAG = MultipleWithModeBottomSheet.class.getSimpleName(); + public static final String TAG = MultipleSelectionWithModeBottomSheet.class.getSimpleName(); @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); showElements(secondaryDescription, toggleContainer, checkBox, checkBoxTitle, titleDescription, selectedSize, selectAllButton); } - public static MultipleWithModeBottomSheet showInstance(@NonNull AppCompatActivity activity, - @NonNull List items, - @Nullable List selected, - @NonNull List modes, - boolean usedOnMap) { - MultipleWithModeBottomSheet fragment = new MultipleWithModeBottomSheet(); + public static MultipleSelectionWithModeBottomSheet showInstance(@NonNull AppCompatActivity activity, + @NonNull List items, + @Nullable List selected, + @NonNull List modes, + boolean usedOnMap) { + MultipleSelectionWithModeBottomSheet fragment = new MultipleSelectionWithModeBottomSheet(); fragment.setUsedOnMap(usedOnMap); fragment.setItems(items); fragment.setSelectedItems(selected); diff --git a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java index 26a66cdb61..66778f134c 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java @@ -180,6 +180,10 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment listContainer.addView(view); } + public List getAllItems() { + return allItems; + } + @NonNull public abstract List getSelectedItems(); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadItem.java b/OsmAnd/src/net/osmand/plus/download/DownloadItem.java index 366f3554a7..46b3855a10 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadItem.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadItem.java @@ -9,6 +9,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import java.io.File; +import java.text.DateFormat; import java.util.List; import java.util.Locale; @@ -55,6 +56,13 @@ public abstract class DownloadItem { return type.getBasename(this); } + @NonNull + public abstract List getDownloadedFiles(@NonNull OsmandApplication app); + + public abstract boolean isUseAbbreviation(); + + public abstract String getAbbreviationInScopes(Context ctx); + protected abstract double getSizeToDownloadInMb(); public abstract double getArchiveSizeMB(); @@ -69,8 +77,7 @@ public abstract class DownloadItem { public abstract String getFileName(); - @NonNull - public abstract List getDownloadedFiles(@NonNull OsmandApplication app); + public abstract String getDate(@NonNull DateFormat dateFormat, boolean remote); @NonNull public static String getFormattedMb(@NonNull Context ctx, double sizeInMb) { diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index da0103fdb0..2cd75b2a5e 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -1,5 +1,7 @@ package net.osmand.plus.download; +import android.content.Context; + import androidx.annotation.NonNull; import net.osmand.IndexConstants; @@ -19,6 +21,7 @@ import java.util.Date; import java.util.List; public class IndexItem extends DownloadItem implements Comparable { + private static final Log log = PlatformUtil.getLog(IndexItem.class); String description; @@ -225,6 +228,16 @@ public class IndexItem extends DownloadItem implements Comparable { public String getDate(java.text.DateFormat format) { return format.format(new Date(timestamp)); } + + @Override + public boolean isUseAbbreviation() { + return false; + } + + @Override + public String getAbbreviationInScopes(Context ctx) { + return ""; + } public static class DownloadEntry { public long dateModified; @@ -254,5 +267,4 @@ public class IndexItem extends DownloadItem implements Comparable { } } - } diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java b/OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java index 394a116241..268ae412b8 100644 --- a/OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java +++ b/OsmAnd/src/net/osmand/plus/download/MultipleDownloadItem.java @@ -1,5 +1,7 @@ package net.osmand.plus.download; +import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -7,6 +9,7 @@ import net.osmand.map.WorldRegion; import net.osmand.plus.OsmandApplication; import java.io.File; +import java.text.DateFormat; import java.util.ArrayList; import java.util.List; @@ -32,7 +35,7 @@ public class MultipleDownloadItem extends DownloadItem { return indexes; } - public List getItems() { + public List getAllItems() { return items; } @@ -96,19 +99,19 @@ public class MultipleDownloadItem extends DownloadItem { return result; } - public List getIndexesToDownload() { - List indexesToDownload = new ArrayList<>(); - for (IndexItem item : getAllIndexes()) { + public List getItemsToDownload() { + List itemsToDownload = new ArrayList<>(); + for (DownloadItem item : getAllItems()) { if (item.hasActualDataToDownload()) { - indexesToDownload.add(item); + itemsToDownload.add(item); } } - return indexesToDownload; + return itemsToDownload; } @Override public boolean hasActualDataToDownload() { - return getIndexesToDownload().size() > 0; + return getItemsToDownload().size() > 0; } @Override @@ -141,4 +144,28 @@ public class MultipleDownloadItem extends DownloadItem { return null; } + @Override + public boolean isUseAbbreviation() { + for (DownloadItem item : items) { + if (item.isUseAbbreviation()) { + return true; + } + } + return false; + } + + @Override + public String getAbbreviationInScopes(Context ctx) { + for (DownloadItem item : items) { + return item.getAbbreviationInScopes(ctx); + } + return ""; + } + + @Override + public String getDate(@NonNull DateFormat dateFormat, boolean remote) { + return ""; + } + + } diff --git a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java index 03b9bc7b9b..fc062c7ddc 100644 --- a/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java @@ -5,13 +5,12 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.base.MultipleSelectionBottomSheet; import net.osmand.plus.base.MultipleSelectionBottomSheet.SelectionUpdateListener; import net.osmand.plus.base.ModeSelectionBottomSheet; -import net.osmand.plus.base.MultipleWithModeBottomSheet; +import net.osmand.plus.base.MultipleSelectionWithModeBottomSheet; import net.osmand.plus.base.SelectionBottomSheet; import net.osmand.plus.base.SelectionBottomSheet.OnApplySelectionListener; import net.osmand.plus.base.SelectionBottomSheet.OnUiInitializedListener; @@ -24,7 +23,6 @@ import java.text.DateFormat; import java.util.ArrayList; import java.util.List; -import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; import static net.osmand.plus.download.MultipleDownloadItem.getIndexItem; public class SelectIndexesUiHelper { @@ -57,221 +55,196 @@ public class SelectIndexesUiHelper { @NonNull DateFormat df, boolean showRemoteDate, @NonNull ItemsToDownloadSelectedListener l) { + new SelectIndexesUiHelper(i, a, df, showRemoteDate, l).showDialogInternal(); } private void showDialogInternal() { - if (downloadItem.getType() == SRTM_COUNTRY_FILE) { + if (downloadItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) { if (downloadItem instanceof MultipleDownloadItem) { - showMultipleSrtmDialog(); + showSrtmMultipleSelectionDialog(); } else { - showSingleSrtmDialog(); + showSrtmModeSelectionDialog(); } } else if (downloadItem instanceof MultipleDownloadItem) { - showBaseDialog(); + showMultipleSelectionDialog(); } } - private void showBaseDialog() { - MultipleDownloadItem multipleDownloadItem = (MultipleDownloadItem) downloadItem; - List indexesToDownload = getIndexesToDownload(multipleDownloadItem); + private void showMultipleSelectionDialog() { List allItems = new ArrayList<>(); List selectedItems = new ArrayList<>(); - OsmandRegions osmandRegions = app.getRegions(); - for (IndexItem indexItem : multipleDownloadItem.getAllIndexes()) { - SelectableItem selectableItem = new SelectableItem(); - selectableItem.setTitle(indexItem.getVisibleName(app, osmandRegions, false)); + prepareItems(allItems, selectedItems); - String size = indexItem.getSizeDescription(app); - String date = indexItem.getDate(dateFormat, showRemoteDate); - String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date); - selectableItem.setDescription(description); + MultipleSelectionBottomSheet msDialog = MultipleSelectionBottomSheet.showInstance( + activity, allItems, selectedItems, true); + this.dialog = msDialog; - selectableItem.setIconId(indexItem.getType().getIconResource()); - selectableItem.setObject(indexItem); - allItems.add(selectableItem); - - if (indexesToDownload.contains(indexItem)) { - selectedItems.add(selectableItem); - } - } - - final MultipleSelectionBottomSheet dialog = - MultipleSelectionBottomSheet.showInstance(activity, allItems, selectedItems, true); - - dialog.setUiInitializedListener(new OnUiInitializedListener() { + msDialog.setUiInitializedListener(new OnUiInitializedListener() { @Override public void onUiInitialized() { dialog.setTitle(app.getString(R.string.welmode_download_maps)); } }); - dialog.setSelectionUpdateListener(new SelectionUpdateListener() { + msDialog.setSelectionUpdateListener(new SelectionUpdateListener() { @Override public void onSelectionUpdate() { - updateSize(dialog, true); + updateSize(); } }); - dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); + + msDialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - private void showSingleSrtmDialog() { - boolean baseSRTM = SrtmDownloadItem.shouldUseMetersByDefault(app); + private void showSrtmMultipleSelectionDialog() { + List allItems = new ArrayList<>(); + List selectedItems = new ArrayList<>(); + prepareItems(allItems, selectedItems); + + SrtmDownloadItem srtmItem = (SrtmDownloadItem) ((MultipleDownloadItem)downloadItem).getAllItems().get(0); + final int selectedModeOrder = srtmItem.isUseMeters() ? 0 : 1; + final List radioItems = createSrtmRadioItems(); + + MultipleSelectionBottomSheet msDialog = MultipleSelectionWithModeBottomSheet.showInstance( + activity, allItems, selectedItems, radioItems, true); + this.dialog = msDialog; + + msDialog.setUiInitializedListener(new OnUiInitializedListener() { + @Override + public void onUiInitialized() { + dialog.setTitle(app.getString(R.string.welmode_download_maps)); + dialog.setSelectedMode(radioItems.get(selectedModeOrder)); + dialog.setSecondaryDescription(app.getString(R.string.srtm_download_list_help_message)); + } + }); + + msDialog.setSelectionUpdateListener(new SelectionUpdateListener() { + @Override + public void onSelectionUpdate() { + updateSize(); + } + }); + + msDialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); + } + + private void showSrtmModeSelectionDialog() { SrtmDownloadItem srtmItem = (SrtmDownloadItem) downloadItem; + final int selectedModeOrder = srtmItem.isUseMeters() ? 0 : 1; - srtmItem.setUseMeters(true); - SelectableItem meterItem = createSrtmSelectableItem(srtmItem.getIndexItem()); - srtmItem.setUseMeters(false); - SelectableItem feetItem = createSrtmSelectableItem(srtmItem.getIndexItem()); - srtmItem.setUseMeters(baseSRTM); + final List radioItems = createSrtmRadioItems(); + SelectableItem preview = createSelectableItem(srtmItem); - List radioItems = new ArrayList<>(); - RadioItem meters = createRadioItem(meterItem, R.string.shared_string_meters); - RadioItem feet = createRadioItem(feetItem, R.string.shared_string_feets); - radioItems.add(meters); - radioItems.add(feet); + dialog = ModeSelectionBottomSheet.showInstance(activity, preview, radioItems, true); - dialog = ModeSelectionBottomSheet.showInstance(activity, - baseSRTM ? meterItem : feetItem, radioItems, true); - - final RadioItem initRadio = baseSRTM ? meters : feet; - final SelectableItem initItem = baseSRTM ? meterItem : feetItem; dialog.setUiInitializedListener(new OnUiInitializedListener() { @Override public void onUiInitialized() { ModeSelectionBottomSheet dialog = (ModeSelectionBottomSheet) SelectIndexesUiHelper.this.dialog; dialog.setTitle(app.getString(R.string.srtm_unit_format)); dialog.setPrimaryDescription(app.getString(R.string.srtm_download_single_help_message)); - updateSize(dialog, false); - dialog.setSelectedMode(initRadio); + updateSize(); + dialog.setSelectedMode(radioItems.get(selectedModeOrder)); } }); dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); } - private SelectableItem createSrtmSelectableItem(IndexItem indexItem) { - SelectableItem selectableItem = new SelectableItem(); - selectableItem.setTitle(indexItem.getVisibleName(app, app.getRegions(), false)); - String size = indexItem.getSizeDescription(app); - size += " " + SrtmDownloadItem.getAbbreviationInScopes(app, indexItem); - 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 void prepareItems(List allItems, + List selectedItems) { + final MultipleDownloadItem multipleDownloadItem = (MultipleDownloadItem) downloadItem; + final List itemsToDownload = getItemsToDownload(multipleDownloadItem); + for (DownloadItem downloadItem : multipleDownloadItem.getAllItems()) { + SelectableItem selectableItem = createSelectableItem(downloadItem); + allItems.add(selectableItem); + + if (itemsToDownload.contains(downloadItem)) { + selectedItems.add(selectableItem); + } + } } - private RadioItem createRadioItem(final SelectableItem selectableItem, int titleId) { + private List createSrtmRadioItems() { + List radioItems = new ArrayList<>(); + radioItems.add(createSrtmRadioBtn(R.string.shared_string_meters, true)); + radioItems.add(createSrtmRadioBtn(R.string.shared_string_feets, false)); + return radioItems; + } + + private RadioItem createSrtmRadioBtn(int titleId, + final boolean useMeters) { String title = Algorithms.capitalizeFirstLetter(app.getString(titleId)); RadioItem radioItem = new RadioItem(title); radioItem.setOnClickListener(new OnRadioItemClickListener() { @Override public boolean onRadioItemClick(RadioItem radioItem, View view) { - ((ModeSelectionBottomSheet)dialog).setItem(selectableItem); - updateSize(dialog, false); + updateDialogListItems(useMeters); + updateSize(); return true; } }); return radioItem; } - private void showMultipleSrtmDialog() { - List selectedItems = new ArrayList<>(); - List indexesToDownload = getIndexesToDownload((MultipleDownloadItem) downloadItem); - - List allItems = new ArrayList<>(((MultipleDownloadItem) downloadItem).getItems()); - List itemsList = new ArrayList<>(); - - for (DownloadItem downloadItem : allItems) { - SrtmDownloadItem srtmItem = (SrtmDownloadItem) downloadItem; - SelectableItem selectableItem = new SelectableItem(); - selectableItem.setTitle(downloadItem.getVisibleName(app, app.getRegions(), false)); - String size = downloadItem.getSizeDescription(app); - size += " " + SrtmDownloadItem.getAbbreviationInScopes(app, srtmItem); - String date = srtmItem.getDate(dateFormat, showRemoteDate); - String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date); - selectableItem.setDescription(description); - selectableItem.setIconId(downloadItem.getType().getIconResource()); - selectableItem.setObject(downloadItem); - - itemsList.add(selectableItem); - - if (indexesToDownload.contains(downloadItem)) { - selectedItems.add(selectableItem); + private void updateDialogListItems(boolean useMeters) { + List items = new ArrayList<>(dialog.getAllItems()); + for (SelectableItem item : items) { + DownloadItem downloadItem = (DownloadItem) item.getObject(); + if (downloadItem instanceof SrtmDownloadItem) { + ((SrtmDownloadItem) downloadItem).setUseMeters(useMeters); + updateSelectableItem(item, downloadItem); } } + dialog.setItems(items); + } - List radioItems = new ArrayList<>(); - 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))); - final RadioItem selectedMode = SrtmDownloadItem.isMetersItem(downloadItem) ? meters : feet; - radioItems.add(meters); - radioItems.add(feet); + private SelectableItem createSelectableItem(DownloadItem item) { + SelectableItem selectableItem = new SelectableItem(); + updateSelectableItem(selectableItem, item); + return selectableItem; + } - final MultipleWithModeBottomSheet dialog = MultipleWithModeBottomSheet.showInstance( - activity, itemsList, selectedItems, radioItems, true); + private void updateSelectableItem(SelectableItem selectableItem, + DownloadItem downloadItem) { + selectableItem.setTitle( + downloadItem.getVisibleName(app, app.getRegions(), false)); - meters.setOnClickListener(new OnRadioItemClickListener() { - @Override - public boolean onRadioItemClick(RadioItem radioItem, View view) { -// dialog.recreateList(meterItems); - return true; - } - }); + String size = downloadItem.getSizeDescription(app); + if (downloadItem.isUseAbbreviation()) { + size += " " + downloadItem.getAbbreviationInScopes(app); + } + String date = downloadItem.getDate(dateFormat, showRemoteDate); + String description = app.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, date); + selectableItem.setDescription(description); - feet.setOnClickListener(new OnRadioItemClickListener() { - @Override - public boolean onRadioItemClick(RadioItem radioItem, View view) { -// dialog.recreateList(feetItems); - return true; - } - }); - - dialog.setUiInitializedListener(new OnUiInitializedListener() { - @Override - public void onUiInitialized() { - dialog.setTitle(app.getString(R.string.welmode_download_maps)); - dialog.setSelectedMode(selectedMode); - dialog.setSecondaryDescription(app.getString(R.string.srtm_download_list_help_message)); - } - }); - - dialog.setSelectionUpdateListener(new SelectionUpdateListener() { - @Override - public void onSelectionUpdate() { - updateSize(dialog, true); - } - }); - dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener)); + selectableItem.setIconId(downloadItem.getType().getIconResource()); + selectableItem.setObject(downloadItem); } private OnApplySelectionListener getOnApplySelectionListener(final ItemsToDownloadSelectedListener listener) { return new OnApplySelectionListener() { @Override public void onSelectionApplied(List selectedItems) { - List indexItems = new ArrayList<>(); + List indexes = new ArrayList<>(); for (SelectableItem item : selectedItems) { IndexItem index = getIndexItem((DownloadItem) item.getObject()); if (index != null) { - indexItems.add(index); + indexes.add(index); } } - listener.onItemsToDownloadSelected(indexItems); + listener.onItemsToDownloadSelected(indexes); } }; } - private void updateSize(SelectionBottomSheet dialog, - boolean updateDescription) { + private void updateSize() { double sizeToDownload = getDownloadSizeInMb(dialog.getSelectedItems()); String size = DownloadItem.getFormattedMb(app, sizeToDownload); - if (updateDescription) { - String total = app.getString(R.string.shared_string_total); - String description = app.getString(R.string.ltr_or_rtl_combine_via_colon, total, size); - dialog.setTitleDescription(description); - } + String total = app.getString(R.string.shared_string_total); + String description = app.getString(R.string.ltr_or_rtl_combine_via_colon, total, size); + dialog.setTitleDescription(description); 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); @@ -280,27 +253,23 @@ public class SelectIndexesUiHelper { } private double getDownloadSizeInMb(@NonNull List selectableItems) { - List downloadItems = new ArrayList<>(); + double totalSizeMb = 0.0d; for (SelectableItem i : selectableItems) { Object obj = i.getObject(); if (obj instanceof DownloadItem) { - downloadItems.add((DownloadItem) obj); + totalSizeMb += ((DownloadItem) obj).getSizeToDownloadInMb(); } } - double totalSizeMb = 0.0d; - for (DownloadItem item : downloadItems) { - totalSizeMb += item.getSizeToDownloadInMb(); - } return totalSizeMb; } - private static List getIndexesToDownload(MultipleDownloadItem multipleDownloadItem) { - if (multipleDownloadItem.hasActualDataToDownload()) { + private static List getItemsToDownload(MultipleDownloadItem md) { + if (md.hasActualDataToDownload()) { // download left regions - return multipleDownloadItem.getIndexesToDownload(); + return md.getItemsToDownload(); } else { // download all regions again - return multipleDownloadItem.getAllIndexes(); + return md.getAllItems(); } } diff --git a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java index c89194910e..aada6acd55 100644 --- a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java +++ b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java @@ -38,6 +38,10 @@ public class SrtmDownloadItem extends DownloadItem { this.useMeters = useMeters; } + public boolean isUseMeters() { + return useMeters; + } + @Nullable public IndexItem getIndexItem() { for (IndexItem index : indexes) { @@ -124,6 +128,16 @@ public class SrtmDownloadItem extends DownloadItem { return getIndexItem().getDate(dateFormat, remote); } + @Override + public boolean isUseAbbreviation() { + return true; + } + + @Override + public String getAbbreviationInScopes(Context ctx) { + return getAbbreviationInScopes(ctx, this); + } + public static boolean shouldUseMetersByDefault(@NonNull OsmandApplication app) { MetricsConstants metricSystem = app.getSettings().METRIC_SYSTEM.get(); return metricSystem != MetricsConstants.MILES_AND_FEET; @@ -147,7 +161,9 @@ public class SrtmDownloadItem extends DownloadItem { } else if (item instanceof SrtmDownloadItem) { return ((SrtmDownloadItem) item).useMeters; } else if (item instanceof MultipleDownloadItem) { - return isMetersItem(((MultipleDownloadItem) item).getItems().get(0)); + for (DownloadItem downloadItem : ((MultipleDownloadItem) item).getAllItems()) { + return isMetersItem(downloadItem); + } } return false; } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 31d228f50e..1bca97cfe1 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -44,7 +44,6 @@ import net.osmand.plus.download.IndexItem; import net.osmand.plus.download.SelectIndexesUiHelper; import net.osmand.plus.download.SelectIndexesUiHelper.ItemsToDownloadSelectedListener; import net.osmand.plus.download.MultipleDownloadItem; -import net.osmand.plus.download.SrtmDownloadItem; import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.inapp.InAppPurchaseHelper; @@ -52,11 +51,8 @@ import net.osmand.util.Algorithms; import java.io.File; import java.text.DateFormat; -import java.util.ArrayList; import java.util.List; -import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; - public class ItemViewHolder { protected final TextView nameTextView; @@ -211,8 +207,8 @@ public class ItemViewHolder { MultipleDownloadItem item = (MultipleDownloadItem) downloadItem; String allRegionsHeader = context.getString(R.string.shared_strings_all_regions); String regionsHeader = context.getString(R.string.regions); - String allRegionsCount = String.valueOf(item.getItems().size()); - String leftToDownloadCount = String.valueOf(item.getIndexesToDownload().size()); + String allRegionsCount = String.valueOf(item.getAllItems().size()); + String leftToDownloadCount = String.valueOf(item.getItemsToDownload().size()); String header; String count; if (item.hasActualDataToDownload()) { @@ -231,8 +227,8 @@ public class ItemViewHolder { count = allRegionsCount; } String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count); - if (SrtmDownloadItem.isSRTMItem(downloadItem)) { - fullDescription += " " + SrtmDownloadItem.getAbbreviationInScopes(context, item); + if (item.isUseAbbreviation()) { + fullDescription += " " + item.getAbbreviationInScopes(context); } if (item.hasActualDataToDownload()) { fullDescription = context.getString( @@ -240,24 +236,14 @@ public class ItemViewHolder { item.getSizeDescription(context)); } 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.getAbbreviationInScopes(context, 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 { - IndexItem item = (IndexItem) 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); - String date = item.getDate(dateFormat, showRemoteDate); + String type = downloadItem.getType().getString(context); + String size = downloadItem.getSizeDescription(context); + if (downloadItem.isUseAbbreviation()) { + size += " " + downloadItem.getAbbreviationInScopes(context); + } + String date = downloadItem.getDate(dateFormat, showRemoteDate); String fullDescription = String.format(pattern, size, date); if (showTypeInDesc) { fullDescription = String.format(pattern, type, fullDescription); From adbc331fce11f662989fae618f26c164ad6810e1 Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Fri, 16 Apr 2021 22:32:14 +0300 Subject: [PATCH 8/9] fix: can't cancel srtm file downloading --- .../osmand/plus/download/DownloadIndexesThread.java | 3 +++ .../net/osmand/plus/download/SrtmDownloadItem.java | 13 ++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index ab45abe6d0..568dcc9ed6 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -243,6 +243,9 @@ public class DownloadIndexesThread { if (item instanceof MultipleDownloadItem) { MultipleDownloadItem multipleDownloadItem = (MultipleDownloadItem) item; cancelDownload(multipleDownloadItem.getAllIndexes()); + } else if (item instanceof SrtmDownloadItem) { + IndexItem indexItem = ((SrtmDownloadItem) item).getIndexItem(); + cancelDownload(indexItem); } else if (item instanceof IndexItem) { IndexItem indexItem = (IndexItem) item; cancelDownload(indexItem); diff --git a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java index aada6acd55..a9a184d57c 100644 --- a/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java +++ b/OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java @@ -10,11 +10,10 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.helpers.enums.MetricsConstants; -import net.osmand.util.Algorithms; import java.io.File; import java.text.DateFormat; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; @@ -105,7 +104,6 @@ public class SrtmDownloadItem extends DownloadItem { @Override public String getFileName() { - // may be check only downloaded items if any downloaded return getIndexItem().getFileName(); } @@ -113,14 +111,11 @@ public class SrtmDownloadItem extends DownloadItem { @Override public List getDownloadedFiles(@NonNull OsmandApplication app) { // may be check both indexes files - List result; + List result = new ArrayList<>(); for (IndexItem index : indexes) { - result = index.getDownloadedFiles(app); - if (!Algorithms.isEmpty(result)) { - return result; - } + result.addAll(index.getDownloadedFiles(app)); } - return Collections.emptyList(); + return result; } public String getDate(@NonNull DateFormat dateFormat, boolean remote) { From 54069a1106487900f6590be0d54447115248ff24 Mon Sep 17 00:00:00 2001 From: nazar-kutz Date: Fri, 16 Apr 2021 22:36:29 +0300 Subject: [PATCH 9/9] Fix: icon not shown for first element in list --- OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java index 66778f134c..f4bea22e62 100644 --- a/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java @@ -62,6 +62,7 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { View mainView = super.onCreateView(inflater, parent, savedInstanceState); + createSelectionListIfPossible(); notifyUiInitialized(); return mainView; } @@ -109,7 +110,6 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); listContainer.setOrientation(LinearLayout.VERTICAL); - fillInSelectionList(); return new SimpleBottomSheetItem.Builder().setCustomView(listContainer).create(); } @@ -148,7 +148,7 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment if (!Algorithms.isEmpty(allItems)) { this.allItems.clear(); this.allItems.addAll(allItems); - fillInSelectionList(); + createSelectionListIfPossible(); } } @@ -160,7 +160,7 @@ public abstract class SelectionBottomSheet extends MenuBottomSheetDialogFragment this.applySelectionListener = onApplySelectionListener; } - private void fillInSelectionList() { + private void createSelectionListIfPossible() { if (listContainer != null && allItems != null) { recreateList(); }