Merge branch 'master' into PlanRouteLendscape
# Conflicts: # OsmAnd/src/net/osmand/plus/widgets/multistatetoggle/MultiStateToggleButton.java
This commit is contained in:
commit
5497bc4691
46 changed files with 1700 additions and 946 deletions
|
@ -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<WorldRegion> removeDuplicates(List<WorldRegion> regions) {
|
||||
List<WorldRegion> copy = new ArrayList<>(regions);
|
||||
Set<WorldRegion> 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;
|
||||
}
|
||||
}
|
|
@ -55,7 +55,9 @@ public class SearchResult {
|
|||
|
||||
public double getSumPhraseMatchWeight() {
|
||||
// if result is a complete match in the search we prioritize it higher
|
||||
boolean match = requiredSearchPhrase.countWords(localeName) <= getSelfWordCount();
|
||||
int localWordsMatched = alternateName != null ?
|
||||
requiredSearchPhrase.countWords(alternateName) : requiredSearchPhrase.countWords(localeName) ;
|
||||
boolean match = localWordsMatched <= getSelfWordCount();
|
||||
double res = ObjectType.getTypeWeight(match ? objectType : null);
|
||||
if (parentSearchResult != null) {
|
||||
res = res + parentSearchResult.getSumPhraseMatchWeight() / MAX_TYPE_WEIGHT;
|
||||
|
|
|
@ -191,10 +191,10 @@ public class SearchUICoreTest {
|
|||
if (!Algorithms.stringsEqual(expected, present)) {
|
||||
System.out.println(String.format("Phrase: %s", phrase));
|
||||
System.out.println(String.format("Mismatch for '%s' != '%s'. Result: ", expected, present));
|
||||
}
|
||||
for (SearchResult r : searchResults) {
|
||||
System.out.println(String.format("\t\"%s\",", formatResult(false, r, phrase)));
|
||||
}
|
||||
}
|
||||
Assert.assertEquals(expected, present);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
tools:text="Some title" />
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/description"
|
||||
android:id="@+id/title_description"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/title"
|
||||
|
@ -60,6 +60,54 @@
|
|||
|
||||
</RelativeLayout>
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/primary_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/dialog_content_margin"
|
||||
android:letterSpacing="@dimen/description_letter_spacing"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:visibility="gone"
|
||||
app:typeface="@string/font_roboto_regular"
|
||||
tools:text="@string/srtm_download_single_help_message"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/secondary_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/content_padding_small"
|
||||
android:letterSpacing="@dimen/description_letter_spacing"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
android:visibility="gone"
|
||||
app:typeface="@string/font_roboto_regular"
|
||||
tools:text="@string/srtm_download_list_help_message"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<include
|
||||
layout="@layout/custom_radio_buttons"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginBottom="@dimen/content_padding_half"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/select_all_button"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -67,12 +115,12 @@
|
|||
android:background="?attr/selectableItemBackground"
|
||||
android:gravity="center_vertical"
|
||||
android:minHeight="@dimen/bottom_sheet_list_item_height"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingBottom="@dimen/content_padding_small"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding">
|
||||
android:paddingBottom="@dimen/content_padding_small">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/check_box_title"
|
||||
|
|
|
@ -64,7 +64,6 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/content_padding_small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="@dimen/content_padding_small"
|
||||
android:paddingLeft="@dimen/content_padding_small"
|
||||
android:paddingTop="@dimen/content_padding_small_half"
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/bg_color"
|
||||
|
@ -13,78 +11,13 @@
|
|||
android:layout_height="@dimen/list_content_padding"
|
||||
android:background="?attr/activity_background_color" />
|
||||
|
||||
<include
|
||||
layout="@layout/divider" />
|
||||
<include layout="@layout/divider" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/subscriptions_list_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/support_region_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="@dimen/setting_list_item_group_height"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="@dimen/map_widget_height"
|
||||
android:layout_marginRight="@dimen/map_widget_height"
|
||||
app:srcCompat="@drawable/ic_world_globe_dark"
|
||||
app:tint="?attr/default_icon_color" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginTop="@dimen/content_padding_small"
|
||||
android:layout_marginBottom="@dimen/content_padding_small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:orientation="vertical">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/support_region_header"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
osmand:typeface="@string/font_roboto_regular"
|
||||
tools:text="@string/osm_live_support_region"/>
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/support_region"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:text="@string/osm_live_support_region"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
osmand:typeface="@string/font_roboto_regular"
|
||||
tools:text="@string/clear_updates_proposition_message"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
app:srcCompat="@drawable/ic_action_settings"
|
||||
app:tint="?attr/default_icon_color" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<include layout="@layout/simple_divider_item" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/report_container"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -206,8 +139,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:background="?attr/activity_background_color">
|
||||
|
||||
<include
|
||||
layout="@layout/card_bottom_divider" />
|
||||
<include layout="@layout/card_bottom_divider" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
android:id="@+id/troubleshooting_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="@dimen/map_widget_height"
|
||||
android:layout_marginRight="@dimen/map_widget_height"
|
||||
android:paddingBottom="@dimen/dialog_content_bottom_margin"
|
||||
|
|
|
@ -16,6 +16,10 @@
|
|||
<string name="user_points">User points</string>
|
||||
<string name="announce_when_exceeded">Announce when exceeded</string>
|
||||
<string name="exit_number">Exit number</string>
|
||||
<string name="srtm_download_single_help_message">Please select the needed format. You will need to re-download the file to change the format.</string>
|
||||
<string name="srtm_download_list_help_message">OsmAnd provides contour lines data in meters and feet. You will need to re-download the file to change the format.</string>
|
||||
<string name="srtm_unit_format">Contour lines unit format</string>
|
||||
<string name="shared_string_feet">feet</string>
|
||||
<string name="update_all_maps_added">Update all maps added to %1$s?</string>
|
||||
<string name="release_4_0_beta">
|
||||
• OsmAnd Live updates moved to \"Downloads > Updates\"\n\n
|
||||
|
|
|
@ -442,15 +442,14 @@ public class UiUtilities {
|
|||
} catch (Throwable e) { }
|
||||
}
|
||||
|
||||
public static void rotateImageByLayoutDirection(ImageView image, int layoutDirection) {
|
||||
public static void rotateImageByLayoutDirection(ImageView image) {
|
||||
if (image == null) {
|
||||
return;
|
||||
}
|
||||
int rotation = layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL ? 180 : 0;
|
||||
int rotation = AndroidUtils.getLayoutDirection(image.getContext()) == ViewCompat.LAYOUT_DIRECTION_RTL ? 180 : 0;
|
||||
image.setRotationY(rotation);
|
||||
}
|
||||
|
||||
|
||||
public static void updateCustomRadioButtons(Context app, View buttonsView, boolean nightMode,
|
||||
CustomRadioButtonType buttonType) {
|
||||
int activeColor = ContextCompat.getColor(app, nightMode
|
||||
|
|
|
@ -13,6 +13,7 @@ import net.osmand.plus.OsmandApplication;
|
|||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.SQLiteTileSource;
|
||||
import net.osmand.plus.Version;
|
||||
import net.osmand.plus.download.SrtmDownloadItem;
|
||||
import net.osmand.plus.download.ui.AbstractLoadLocalIndexTask;
|
||||
import net.osmand.plus.voice.JSMediaCommandPlayerImpl;
|
||||
import net.osmand.plus.voice.JSTTSCommandPlayerImpl;
|
||||
|
@ -143,8 +144,6 @@ public class LocalIndexHelper {
|
|||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public List<LocalIndexInfo> getLocalIndexInfos(String downloadName) {
|
||||
List<LocalIndexInfo> list = new ArrayList<>();
|
||||
LocalIndexInfo info = getLocalIndexInfo(LocalIndexType.MAP_DATA, downloadName, false, false);
|
||||
|
@ -333,14 +332,15 @@ public class LocalIndexHelper {
|
|||
if (mapPath.canRead()) {
|
||||
for (File mapFile : listFilesSorted(mapPath)) {
|
||||
if (mapFile.isFile() && mapFile.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
|
||||
String fileName = mapFile.getName();
|
||||
LocalIndexType lt = LocalIndexType.MAP_DATA;
|
||||
if (mapFile.getName().endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)) {
|
||||
if (SrtmDownloadItem.isSrtmFile(fileName)) {
|
||||
lt = LocalIndexType.SRTM_DATA;
|
||||
} else if (mapFile.getName().endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)) {
|
||||
} else if (fileName.endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)) {
|
||||
lt = LocalIndexType.WIKI_DATA;
|
||||
}
|
||||
LocalIndexInfo info = new LocalIndexInfo(lt, mapFile, backup, app);
|
||||
if (loadedMaps.containsKey(mapFile.getName()) && !backup) {
|
||||
if (loadedMaps.containsKey(fileName) && !backup) {
|
||||
info.setLoaded(true);
|
||||
}
|
||||
updateDescription(info);
|
||||
|
@ -430,5 +430,4 @@ public class LocalIndexHelper {
|
|||
return fileName;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -94,6 +94,12 @@ public class MapActivityKeyListener implements KeyEvent.Callback {
|
|||
mapActivity.getMapViewTrackingUtilities().backToLocationImpl();
|
||||
} else if (keyCode == KeyEvent.KEYCODE_D) {
|
||||
mapActivity.getMapViewTrackingUtilities().switchRotateMapMode();
|
||||
} else if (keyCode == KeyEvent.KEYCODE_MINUS) {
|
||||
mapActivity.changeZoom(-1);
|
||||
return true;
|
||||
} else if (keyCode == KeyEvent.KEYCODE_PLUS || keyCode == KeyEvent.KEYCODE_EQUALS) {
|
||||
mapActivity.changeZoom(1);
|
||||
return true;
|
||||
} else if (mapScrollHelper.isAvailableKeyCode(keyCode)) {
|
||||
return mapScrollHelper.onKeyUp(keyCode, event);
|
||||
} else if (settings.EXTERNAL_INPUT_DEVICE.get() == PARROT_EXTERNAL_DEVICE) {
|
||||
|
@ -121,13 +127,7 @@ public class MapActivityKeyListener implements KeyEvent.Callback {
|
|||
return true;
|
||||
}
|
||||
} else if (settings.EXTERNAL_INPUT_DEVICE.get() == GENERIC_EXTERNAL_DEVICE) {
|
||||
if (keyCode == KeyEvent.KEYCODE_MINUS) {
|
||||
mapActivity.changeZoom(-1);
|
||||
return true;
|
||||
} else if (keyCode == KeyEvent.KEYCODE_PLUS || keyCode == KeyEvent.KEYCODE_EQUALS) {
|
||||
mapActivity.changeZoom(1);
|
||||
return true;
|
||||
}
|
||||
// currently doesn't process specific commands
|
||||
} else if (OsmandPlugin.onMapActivityKeyUp(mapActivity, keyCode)) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -109,7 +109,7 @@ public class PluginInfoFragment extends BaseOsmAndFragment implements PluginStat
|
|||
}
|
||||
}
|
||||
});
|
||||
UiUtilities.rotateImageByLayoutDirection(closeButton, AndroidUtils.getLayoutDirection(app));
|
||||
UiUtilities.rotateImageByLayoutDirection(closeButton);
|
||||
|
||||
Drawable pluginImage = plugin.getAssetResourceImage();
|
||||
if (pluginImage != null) {
|
||||
|
|
|
@ -101,7 +101,7 @@ public class PluginsFragment extends BaseOsmAndFragment implements PluginStateLi
|
|||
}
|
||||
}
|
||||
});
|
||||
UiUtilities.rotateImageByLayoutDirection(closeButton, AndroidUtils.getLayoutDirection(app));
|
||||
UiUtilities.rotateImageByLayoutDirection(closeButton);
|
||||
|
||||
adapter = new PluginsListAdapter(requireContext());
|
||||
|
||||
|
|
|
@ -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<SelectableItem> getSelectedItems() {
|
||||
return allItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldShowDivider() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static ModeSelectionBottomSheet showInstance(@NonNull AppCompatActivity activity,
|
||||
@NonNull SelectableItem previewItem,
|
||||
@NonNull List<RadioItem> 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;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,180 @@
|
|||
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;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.widget.CompoundButtonCompat;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
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 MultipleSelectionBottomSheet extends SelectionBottomSheet {
|
||||
|
||||
public static final String TAG = MultipleSelectionBottomSheet.class.getSimpleName();
|
||||
|
||||
private final List<SelectableItem> selectedItems = new ArrayList<>();
|
||||
private SelectionUpdateListener selectionUpdateListener;
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
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();
|
||||
updateItemsSelection(checked);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
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
|
||||
protected void notifyUiInitialized() {
|
||||
onSelectedItemsChanged();
|
||||
super.notifyUiInitialized();
|
||||
}
|
||||
|
||||
private void onSelectedItemsChanged() {
|
||||
updateSelectAllButton();
|
||||
updateSelectedSizeView();
|
||||
updateApplyButtonEnable();
|
||||
if (selectionUpdateListener != null) {
|
||||
selectionUpdateListener.onSelectionUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateSelectAllButton() {
|
||||
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() {
|
||||
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() {
|
||||
boolean noEmptySelection = !Algorithms.isEmpty(selectedItems);
|
||||
rightButton.setEnabled(noEmptySelection);
|
||||
}
|
||||
|
||||
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 setSelectedItems(List<SelectableItem> selected) {
|
||||
selectedItems.clear();
|
||||
if (!Algorithms.isEmpty(selected)) {
|
||||
selectedItems.addAll(selected);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public List<SelectableItem> getSelectedItems() {
|
||||
return selectedItems;
|
||||
}
|
||||
|
||||
public void setSelectionUpdateListener(SelectionUpdateListener selectionUpdateListener) {
|
||||
this.selectionUpdateListener = selectionUpdateListener;
|
||||
}
|
||||
|
||||
public static MultipleSelectionBottomSheet showInstance(@NonNull AppCompatActivity activity,
|
||||
@NonNull List<SelectableItem> items,
|
||||
@Nullable List<SelectableItem> selected,
|
||||
boolean usedOnMap) {
|
||||
MultipleSelectionBottomSheet fragment = new MultipleSelectionBottomSheet();
|
||||
fragment.setUsedOnMap(usedOnMap);
|
||||
fragment.setItems(items);
|
||||
fragment.setSelectedItems(selected);
|
||||
FragmentManager fm = activity.getSupportFragmentManager();
|
||||
fragment.show(fm, TAG);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
public interface SelectionUpdateListener {
|
||||
void onSelectionUpdate();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
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 MultipleSelectionWithModeBottomSheet extends MultipleSelectionBottomSheet {
|
||||
|
||||
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 MultipleSelectionWithModeBottomSheet showInstance(@NonNull AppCompatActivity activity,
|
||||
@NonNull List<SelectableItem> items,
|
||||
@Nullable List<SelectableItem> selected,
|
||||
@NonNull List<RadioItem> modes,
|
||||
boolean usedOnMap) {
|
||||
MultipleSelectionWithModeBottomSheet fragment = new MultipleSelectionWithModeBottomSheet();
|
||||
fragment.setUsedOnMap(usedOnMap);
|
||||
fragment.setItems(items);
|
||||
fragment.setSelectedItems(selected);
|
||||
fragment.setModes(modes);
|
||||
FragmentManager fm = activity.getSupportFragmentManager();
|
||||
fragment.show(fm, TAG);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,301 +0,0 @@
|
|||
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.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
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.SimpleBottomSheetItem;
|
||||
import net.osmand.plus.base.bottomsheetmenu.simpleitems.SimpleDividerItem;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.view.ThreeStateCheckbox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
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 {
|
||||
|
||||
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 activeColorRes;
|
||||
private int secondaryColorRes;
|
||||
|
||||
private final List<SelectableItem> allItems = new ArrayList<>();
|
||||
private final List<SelectableItem> selectedItems = new ArrayList<>();
|
||||
private SelectionUpdateListener selectionUpdateListener;
|
||||
private OnApplySelectionListener onApplySelectionListener;
|
||||
|
||||
public static final String TAG = SelectMultipleItemsBottomSheet.class.getSimpleName();
|
||||
|
||||
@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));
|
||||
createListItems();
|
||||
}
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
});
|
||||
return new SimpleBottomSheetItem.Builder().setCustomView(view).create();
|
||||
}
|
||||
|
||||
private void createListItems() {
|
||||
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 setupRightButton() {
|
||||
super.setupRightButton();
|
||||
applyButtonTitle = rightButton.findViewById(R.id.button_text);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRightBottomButtonClick() {
|
||||
if (onApplySelectionListener != null) {
|
||||
onApplySelectionListener.onSelectionApplied(selectedItems);
|
||||
}
|
||||
dismiss();
|
||||
}
|
||||
|
||||
private void onSelectedItemsChanged() {
|
||||
updateSelectAllButton();
|
||||
updateSelectedSizeView();
|
||||
updateApplyButtonEnable();
|
||||
if (selectionUpdateListener != null) {
|
||||
selectionUpdateListener.onSelectionUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRightBottomButtonTextId() {
|
||||
return R.string.shared_string_apply;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean useVerticalButtons() {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void setupListItem(Builder builder, SelectableItem item) {
|
||||
builder.setTitle(item.title);
|
||||
builder.setDescription(item.description);
|
||||
builder.setIcon(uiUtilities.getIcon(item.iconId, activeColorRes));
|
||||
}
|
||||
|
||||
private void updateSelectAllButton() {
|
||||
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() {
|
||||
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() {
|
||||
if (Algorithms.isEmpty(selectedItems)) {
|
||||
rightButton.setEnabled(false);
|
||||
} else {
|
||||
rightButton.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateItems(boolean checked) {
|
||||
for (BaseBottomSheetItem item : items) {
|
||||
if (item instanceof BottomSheetItemWithCompoundButton) {
|
||||
((BottomSheetItemWithCompoundButton) item).setChecked(checked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setTitle(@NonNull String title) {
|
||||
this.title.setText(title);
|
||||
}
|
||||
|
||||
public void setDescription(@NonNull String description) {
|
||||
this.description.setText(description);
|
||||
}
|
||||
|
||||
public void setConfirmButtonTitle(@NonNull String confirmButtonTitle) {
|
||||
applyButtonTitle.setText(confirmButtonTitle);
|
||||
}
|
||||
|
||||
private void setItems(List<SelectableItem> allItems) {
|
||||
if (!Algorithms.isEmpty(allItems)) {
|
||||
this.allItems.addAll(allItems);
|
||||
}
|
||||
}
|
||||
|
||||
private void setSelectedItems(List<SelectableItem> selected) {
|
||||
if (!Algorithms.isEmpty(selected)) {
|
||||
this.selectedItems.addAll(selected);
|
||||
}
|
||||
}
|
||||
|
||||
public List<SelectableItem> getSelectedItems() {
|
||||
return selectedItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
if (requireActivity().isChangingConfigurations()) {
|
||||
dismiss();
|
||||
}
|
||||
}
|
||||
|
||||
public static SelectMultipleItemsBottomSheet showInstance(@NonNull AppCompatActivity activity,
|
||||
@NonNull List<SelectableItem> items,
|
||||
@Nullable List<SelectableItem> selected,
|
||||
boolean usedOnMap) {
|
||||
SelectMultipleItemsBottomSheet fragment = new SelectMultipleItemsBottomSheet();
|
||||
fragment.setUsedOnMap(usedOnMap);
|
||||
fragment.setItems(items);
|
||||
fragment.setSelectedItems(selected);
|
||||
FragmentManager fm = activity.getSupportFragmentManager();
|
||||
fragment.show(fm, TAG);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
public void setSelectionUpdateListener(SelectionUpdateListener selectionUpdateListener) {
|
||||
this.selectionUpdateListener = selectionUpdateListener;
|
||||
}
|
||||
|
||||
public void setOnApplySelectionListener(OnApplySelectionListener onApplySelectionListener) {
|
||||
this.onApplySelectionListener = onApplySelectionListener;
|
||||
}
|
||||
|
||||
public interface SelectionUpdateListener {
|
||||
void onSelectionUpdate();
|
||||
}
|
||||
|
||||
public interface OnApplySelectionListener {
|
||||
void onSelectionApplied(List<SelectableItem> selectedItems);
|
||||
}
|
||||
|
||||
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 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
289
OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java
Normal file
289
OsmAnd/src/net/osmand/plus/base/SelectionBottomSheet.java
Normal file
|
@ -0,0 +1,289 @@
|
|||
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;
|
||||
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.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;
|
||||
protected TextView titleDescription;
|
||||
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 listContainer;
|
||||
protected TextView applyButtonTitle;
|
||||
|
||||
protected int activeColorRes;
|
||||
protected int secondaryColorRes;
|
||||
|
||||
private OnUiInitializedAdapter onUiInitializedAdapter;
|
||||
private OnApplySelectionListener onApplySelectionListener;
|
||||
|
||||
protected List<SelectableItem> allItems = new ArrayList<>();
|
||||
protected Map<SelectableItem, View> listViews = new HashMap<>();
|
||||
private List<RadioItem> modes;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
|
||||
View mainView = super.onCreateView(inflater, parent, savedInstanceState);
|
||||
createSelectionListIfPossible();
|
||||
notifyUiInitialized();
|
||||
return mainView;
|
||||
}
|
||||
|
||||
@Override
|
||||
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(createHeaderView());
|
||||
if (shouldShowDivider()) {
|
||||
items.add(new SimpleDividerItem(app));
|
||||
}
|
||||
items.add(createSelectionView());
|
||||
}
|
||||
|
||||
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);
|
||||
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);
|
||||
selectAllButton = view.findViewById(R.id.select_all_button);
|
||||
checkBoxTitle = view.findViewById(R.id.check_box_title);
|
||||
checkBox = view.findViewById(R.id.check_box);
|
||||
|
||||
if (modes != null) {
|
||||
radioGroup.setItems(modes);
|
||||
}
|
||||
|
||||
return new SimpleBottomSheetItem.Builder().setCustomView(view).create();
|
||||
}
|
||||
|
||||
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);
|
||||
return new SimpleBottomSheetItem.Builder().setCustomView(listContainer).create();
|
||||
}
|
||||
|
||||
public void setTitle(@NonNull String title) {
|
||||
this.title.setText(title);
|
||||
}
|
||||
|
||||
public void setTitleDescription(@NonNull String description) {
|
||||
titleDescription.setText(description);
|
||||
}
|
||||
|
||||
public void setPrimaryDescription(@NonNull String description) {
|
||||
primaryDescription.setText(description);
|
||||
}
|
||||
|
||||
public void setSecondaryDescription(@NonNull String description) {
|
||||
secondaryDescription.setText(description);
|
||||
}
|
||||
|
||||
public void setApplyButtonTitle(@NonNull String title) {
|
||||
applyButtonTitle.setText(title);
|
||||
}
|
||||
|
||||
public void setModes(@NonNull List<RadioItem> modes) {
|
||||
this.modes = modes;
|
||||
if (radioGroup != null) {
|
||||
radioGroup.setItems(modes);
|
||||
}
|
||||
}
|
||||
|
||||
public void setSelectedMode(@NonNull RadioItem mode) {
|
||||
radioGroup.setSelectedItem(mode);
|
||||
}
|
||||
|
||||
public void setItems(List<SelectableItem> allItems) {
|
||||
this.allItems.clear();
|
||||
if (!Algorithms.isEmpty(allItems)) {
|
||||
this.allItems.addAll(allItems);
|
||||
createSelectionListIfPossible();
|
||||
}
|
||||
}
|
||||
|
||||
public void setOnUiInitializedAdapter(OnUiInitializedAdapter onUiInitializedAdapter) {
|
||||
this.onUiInitializedAdapter = onUiInitializedAdapter;
|
||||
}
|
||||
|
||||
public void setOnApplySelectionListener(OnApplySelectionListener onApplySelectionListener) {
|
||||
this.onApplySelectionListener = onApplySelectionListener;
|
||||
}
|
||||
|
||||
private void createSelectionListIfPossible() {
|
||||
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);
|
||||
}
|
||||
|
||||
public List<SelectableItem> getAllItems() {
|
||||
return allItems;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public abstract List<SelectableItem> getSelectedItems();
|
||||
|
||||
protected abstract void updateItemView(SelectableItem item, View view);
|
||||
|
||||
protected abstract int getItemLayoutId();
|
||||
|
||||
protected abstract boolean shouldShowDivider();
|
||||
|
||||
protected void notifyUiInitialized() {
|
||||
if (onUiInitializedAdapter != null) {
|
||||
onUiInitializedAdapter.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 (onApplySelectionListener != null) {
|
||||
onApplySelectionListener.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 OnUiInitializedAdapter {
|
||||
void onUiInitialized();
|
||||
}
|
||||
|
||||
public interface OnApplySelectionListener {
|
||||
void onSelectionApplied(List<SelectableItem> 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -32,6 +32,10 @@ public class BaseBottomSheetItem {
|
|||
return tag;
|
||||
}
|
||||
|
||||
public void setTag(Object tag) {
|
||||
this.tag = tag;
|
||||
}
|
||||
|
||||
public BaseBottomSheetItem(View view,
|
||||
@LayoutRes int layoutId,
|
||||
Object tag,
|
||||
|
|
|
@ -10,6 +10,7 @@ import net.osmand.map.OsmandRegions;
|
|||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.Version;
|
||||
import net.osmand.plus.activities.LocalIndexInfo;
|
||||
import net.osmand.plus.helpers.FileNameTranslationHelper;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
|
@ -27,6 +28,7 @@ import java.util.Locale;
|
|||
import java.util.Map;
|
||||
|
||||
import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT;
|
||||
import static net.osmand.plus.activities.LocalIndexHelper.LocalIndexType.SRTM_DATA;
|
||||
|
||||
public class DownloadActivityType {
|
||||
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.US);
|
||||
|
@ -145,8 +147,9 @@ public class DownloadActivityType {
|
|||
return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT_ZIP,
|
||||
IndexConstants.BINARY_MAP_VERSION));
|
||||
} else if (SRTM_COUNTRY_FILE == this) {
|
||||
return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP,
|
||||
IndexConstants.BINARY_MAP_VERSION));
|
||||
boolean srtm = fileName.endsWith(addVersionToExt(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION));
|
||||
boolean srtmf = fileName.endsWith(addVersionToExt(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION));
|
||||
return srtm || srtmf;
|
||||
} else if (HILLSHADE_FILE == this) {
|
||||
return fileName.endsWith(IndexConstants.SQLITE_EXT);
|
||||
} else if (SLOPE_FILE == this) {
|
||||
|
@ -227,7 +230,7 @@ public class DownloadActivityType {
|
|||
} else if (FONT_FILE == this) {
|
||||
return IndexConstants.FONT_INDEX_EXT;
|
||||
} else if (SRTM_COUNTRY_FILE == this) {
|
||||
return IndexConstants.BINARY_SRTM_MAP_INDEX_EXT;
|
||||
return SrtmDownloadItem.getExtension(indexItem);
|
||||
} else if (WIKIPEDIA_FILE == this) {
|
||||
return IndexConstants.BINARY_WIKI_MAP_INDEX_EXT;
|
||||
} else if (WIKIVOYAGE_FILE == this) {
|
||||
|
@ -361,6 +364,9 @@ public class DownloadActivityType {
|
|||
if (basename.endsWith(FileNameTranslationHelper.WIKI_NAME)) {
|
||||
return FileNameTranslationHelper.getWikiName(ctx, basename);
|
||||
}
|
||||
if (basename.endsWith(FileNameTranslationHelper.WIKIVOYAGE_NAME)) {
|
||||
return FileNameTranslationHelper.getWikivoyageName(ctx, basename);
|
||||
}
|
||||
// if (this == HILLSHADE_FILE){
|
||||
// return FileNameTranslationHelper.getHillShadeName(ctx, osmandRegions, bn);
|
||||
// }
|
||||
|
@ -423,7 +429,7 @@ public class DownloadActivityType {
|
|||
}
|
||||
String baseNameWithoutVersion = fileName.substring(0, l);
|
||||
if (this == SRTM_COUNTRY_FILE) {
|
||||
return baseNameWithoutVersion + IndexConstants.BINARY_SRTM_MAP_INDEX_EXT;
|
||||
return baseNameWithoutVersion + SrtmDownloadItem.getExtension(item);
|
||||
}
|
||||
if (this == WIKIPEDIA_FILE) {
|
||||
return baseNameWithoutVersion + IndexConstants.BINARY_WIKI_MAP_INDEX_EXT;
|
||||
|
|
|
@ -240,9 +240,12 @@ 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 SrtmDownloadItem) {
|
||||
IndexItem indexItem = ((SrtmDownloadItem) item).getIndexItem();
|
||||
cancelDownload(indexItem);
|
||||
} else if (item instanceof IndexItem) {
|
||||
IndexItem indexItem = (IndexItem) item;
|
||||
cancelDownload(indexItem);
|
||||
|
|
|
@ -3,12 +3,14 @@ package net.osmand.plus.download;
|
|||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import net.osmand.map.OsmandRegions;
|
||||
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 +57,12 @@ public abstract class DownloadItem {
|
|||
return type.getBasename(this);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public abstract List<File> getDownloadedFiles(@NonNull OsmandApplication app);
|
||||
|
||||
@Nullable
|
||||
public abstract String getAdditionalDescription(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<File> getDownloadedFiles(@NonNull OsmandApplication app);
|
||||
public abstract String getDate(@NonNull DateFormat dateFormat, boolean remote);
|
||||
|
||||
@NonNull
|
||||
public static String getFormattedMb(@NonNull Context ctx, double sizeInMb) {
|
||||
|
|
|
@ -1,5 +1,26 @@
|
|||
package net.osmand.plus.download;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.res.AssetManager;
|
||||
import android.provider.Settings.Secure;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.osm.io.NetworkUtils;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
import org.xmlpull.v1.XmlPullParserFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
@ -11,26 +32,6 @@ import java.util.Comparator;
|
|||
import java.util.List;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.osm.io.NetworkUtils;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
import org.xmlpull.v1.XmlPullParserFactory;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.res.AssetManager;
|
||||
import android.provider.Settings.Secure;
|
||||
|
||||
public class DownloadOsmandIndexesHelper {
|
||||
private final static Log log = PlatformUtil.getLog(DownloadOsmandIndexesHelper.class);
|
||||
|
||||
|
|
|
@ -25,12 +25,11 @@ import java.io.InputStream;
|
|||
import java.text.DateFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Collections;
|
||||
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 +116,16 @@ public class DownloadResources extends DownloadResourceGroup {
|
|||
return res;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<DownloadItem> getDownloadItems(WorldRegion region) {
|
||||
DownloadResourceGroup group = getRegionMapsGroup(region);
|
||||
if (group != null) {
|
||||
return group.getIndividualDownloadItems();
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<IndexItem> getIndexItems(WorldRegion region) {
|
||||
if (groupByRegion != null) {
|
||||
List<IndexItem> res = groupByRegion.get(region);
|
||||
|
@ -124,7 +133,7 @@ public class DownloadResources extends DownloadResourceGroup {
|
|||
return res;
|
||||
}
|
||||
}
|
||||
return new LinkedList<>();
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
public void updateLoadedFiles() {
|
||||
|
@ -471,30 +480,60 @@ public class DownloadResources extends DownloadResourceGroup {
|
|||
addGroup(otherGroup);
|
||||
|
||||
createHillshadeSRTMGroups();
|
||||
collectMultipleIndexesItems();
|
||||
replaceIndividualSrtmWithGroups(region);
|
||||
createMultipleDownloadItems(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<DownloadItem> individualItems = group.getIndividualDownloadItems();
|
||||
if (isListContainsType(individualItems, srtmType)) {
|
||||
List<IndexItem> srtmIndexes = new ArrayList<>();
|
||||
for (DownloadItem item : individualItems) {
|
||||
if (item.getType() == srtmType && item instanceof IndexItem) {
|
||||
srtmIndexes.add((IndexItem) item);
|
||||
}
|
||||
}
|
||||
if (srtmIndexes.size() > 1) {
|
||||
individualItems.removeAll(srtmIndexes);
|
||||
group.addItem(new SrtmDownloadItem(srtmIndexes, useMetersByDefault));
|
||||
}
|
||||
listModified = true;
|
||||
}
|
||||
if (listModified) {
|
||||
sortDownloadItems(individualItems);
|
||||
}
|
||||
}
|
||||
|
||||
private void collectMultipleIndexesItems(@NonNull WorldRegion region) {
|
||||
List<WorldRegion> subRegions = region.getSubregions();
|
||||
if (!Algorithms.isEmpty(subRegions)) {
|
||||
for (WorldRegion subRegion : subRegions) {
|
||||
replaceIndividualSrtmWithGroups(subRegion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void createMultipleDownloadItems(@NonNull WorldRegion region) {
|
||||
List<WorldRegion> subRegions = region.getSubregions();
|
||||
if (Algorithms.isEmpty(subRegions)) return;
|
||||
|
||||
DownloadResourceGroup group = getRegionMapsGroup(region);
|
||||
if (group != null) {
|
||||
boolean listModified = false;
|
||||
List<IndexItem> indexesList = group.getIndividualResources();
|
||||
List<WorldRegion> regionsToCollect = removeDuplicateRegions(subRegions);
|
||||
List<DownloadItem> downloadItems = group.getIndividualDownloadItems();
|
||||
List<WorldRegion> uniqueSubRegions = WorldRegion.removeDuplicates(subRegions);
|
||||
for (DownloadActivityType type : DownloadActivityType.values()) {
|
||||
if (!doesListContainIndexWithType(indexesList, type)) {
|
||||
List<IndexItem> indexesFromSubRegions = collectIndexesOfType(regionsToCollect, type);
|
||||
if (indexesFromSubRegions != null) {
|
||||
group.addItem(new MultipleIndexItem(region, indexesFromSubRegions, type));
|
||||
if (!isListContainsType(downloadItems, type)) {
|
||||
List<DownloadItem> itemsFromSubRegions = collectItemsOfType(uniqueSubRegions, type);
|
||||
if (itemsFromSubRegions != null) {
|
||||
group.addItem(new MultipleDownloadItem(region, itemsFromSubRegions, type));
|
||||
listModified = true;
|
||||
}
|
||||
}
|
||||
|
@ -504,7 +543,7 @@ public class DownloadResources extends DownloadResourceGroup {
|
|||
}
|
||||
}
|
||||
for (WorldRegion subRegion : subRegions) {
|
||||
collectMultipleIndexesItems(subRegion);
|
||||
createMultipleDownloadItems(subRegion);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -517,43 +556,21 @@ public class DownloadResources extends DownloadResourceGroup {
|
|||
}
|
||||
|
||||
@Nullable
|
||||
private List<IndexItem> collectIndexesOfType(@NonNull List<WorldRegion> regions,
|
||||
private List<DownloadItem> collectItemsOfType(@NonNull List<WorldRegion> regions,
|
||||
@NonNull DownloadActivityType type) {
|
||||
List<IndexItem> collectedIndexes = new ArrayList<>();
|
||||
List<DownloadItem> collectedItems = new ArrayList<>();
|
||||
for (WorldRegion region : regions) {
|
||||
List<IndexItem> regionIndexes = getIndexItems(region);
|
||||
boolean found = false;
|
||||
if (regionIndexes != null) {
|
||||
for (IndexItem index : regionIndexes) {
|
||||
if (index.getType() == type) {
|
||||
for (DownloadItem item : getDownloadItems(region)) {
|
||||
if (item.getType() == type) {
|
||||
found = true;
|
||||
collectedIndexes.add(index);
|
||||
collectedItems.add(item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found) return null;
|
||||
}
|
||||
return collectedIndexes;
|
||||
}
|
||||
|
||||
private List<WorldRegion> removeDuplicateRegions(List<WorldRegion> regions) {
|
||||
Set<WorldRegion> 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) {
|
||||
|
@ -680,11 +697,11 @@ public class DownloadResources extends DownloadResourceGroup {
|
|||
&& isIndexItemDownloaded(downloadThread, type, downloadRegion.getSuperregion(), res);
|
||||
}
|
||||
|
||||
private boolean doesListContainIndexWithType(List<IndexItem> indexItems,
|
||||
private boolean isListContainsType(List<DownloadItem> items,
|
||||
DownloadActivityType type) {
|
||||
if (indexItems != null) {
|
||||
for (IndexItem indexItem : indexItems) {
|
||||
if (indexItem.getType() == type) {
|
||||
if (items != null) {
|
||||
for (DownloadItem item : items) {
|
||||
if (item.getType() == type) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package net.osmand.plus.download;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.PlatformUtil;
|
||||
|
@ -19,6 +22,7 @@ import java.util.Date;
|
|||
import java.util.List;
|
||||
|
||||
public class IndexItem extends DownloadItem implements Comparable<IndexItem> {
|
||||
|
||||
private static final Log log = PlatformUtil.getLog(IndexItem.class);
|
||||
|
||||
String description;
|
||||
|
@ -226,6 +230,12 @@ public class IndexItem extends DownloadItem implements Comparable<IndexItem> {
|
|||
return format.format(new Date(timestamp));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getAdditionalDescription(Context ctx) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static class DownloadEntry {
|
||||
public long dateModified;
|
||||
public double sizeMB;
|
||||
|
@ -254,5 +264,4 @@ public class IndexItem extends DownloadItem implements Comparable<IndexItem> {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,32 +1,47 @@
|
|||
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;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MultipleIndexItem extends DownloadItem {
|
||||
public class MultipleDownloadItem extends DownloadItem {
|
||||
|
||||
private final List<IndexItem> items;
|
||||
private final List<DownloadItem> items;
|
||||
|
||||
public MultipleIndexItem(@NonNull WorldRegion region,
|
||||
@NonNull List<IndexItem> items,
|
||||
public MultipleDownloadItem(@NonNull WorldRegion region,
|
||||
@NonNull List<DownloadItem> items,
|
||||
@NonNull DownloadActivityType type) {
|
||||
super(type);
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
public List<IndexItem> getAllIndexes() {
|
||||
List<IndexItem> indexes = new ArrayList<>();
|
||||
for (DownloadItem item : items) {
|
||||
IndexItem index = getIndexItem(item);
|
||||
if (index != null) {
|
||||
indexes.add(index);
|
||||
}
|
||||
}
|
||||
return indexes;
|
||||
}
|
||||
|
||||
public List<DownloadItem> getAllItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOutdated() {
|
||||
for (IndexItem item : items) {
|
||||
for (DownloadItem item : items) {
|
||||
if (item.isOutdated()) {
|
||||
return true;
|
||||
}
|
||||
|
@ -36,7 +51,7 @@ public class MultipleIndexItem extends DownloadItem {
|
|||
|
||||
@Override
|
||||
public boolean isDownloaded() {
|
||||
for (IndexItem item : items) {
|
||||
for (DownloadItem item : items) {
|
||||
if (item.isDownloaded()) {
|
||||
return true;
|
||||
}
|
||||
|
@ -46,8 +61,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;
|
||||
}
|
||||
}
|
||||
|
@ -78,31 +93,31 @@ public class MultipleIndexItem extends DownloadItem {
|
|||
@Override
|
||||
public List<File> getDownloadedFiles(@NonNull OsmandApplication app) {
|
||||
List<File> result = new ArrayList<>();
|
||||
for (IndexItem item : items) {
|
||||
for (DownloadItem item : items) {
|
||||
result.addAll(item.getDownloadedFiles(app));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<IndexItem> getIndexesToDownload() {
|
||||
List<IndexItem> indexesToDownload = new ArrayList<>();
|
||||
for (IndexItem item : items) {
|
||||
public List<DownloadItem> getItemsToDownload() {
|
||||
List<DownloadItem> 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
|
||||
public double getSizeToDownloadInMb() {
|
||||
double totalSizeMb = 0.0d;
|
||||
for (IndexItem item : items) {
|
||||
for (DownloadItem item : items) {
|
||||
if (item.hasActualDataToDownload()) {
|
||||
totalSizeMb += item.getSizeToDownloadInMb();
|
||||
}
|
||||
|
@ -113,10 +128,33 @@ public class MultipleIndexItem extends DownloadItem {
|
|||
@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;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getAdditionalDescription(Context ctx) {
|
||||
for (DownloadItem item : items) {
|
||||
return item.getAdditionalDescription(ctx);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDate(@NonNull DateFormat dateFormat, boolean remote) {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -1,113 +0,0 @@
|
|||
package net.osmand.plus.download;
|
||||
|
||||
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.SelectMultipleItemsBottomSheet;
|
||||
import net.osmand.plus.base.SelectMultipleItemsBottomSheet.OnApplySelectionListener;
|
||||
import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectableItem;
|
||||
import net.osmand.plus.base.SelectMultipleItemsBottomSheet.SelectionUpdateListener;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MultipleIndexesUiHelper {
|
||||
|
||||
public static void showDialog(@NonNull MultipleIndexItem multipleIndexItem,
|
||||
@NonNull AppCompatActivity activity,
|
||||
@NonNull final OsmandApplication app,
|
||||
@NonNull DateFormat dateFormat,
|
||||
boolean showRemoteDate,
|
||||
@NonNull final SelectItemsToDownloadListener listener) {
|
||||
List<IndexItem> indexesToDownload = getIndexesToDownload(multipleIndexItem);
|
||||
List<SelectableItem> allItems = new ArrayList<>();
|
||||
List<SelectableItem> selectedItems = new ArrayList<>();
|
||||
OsmandRegions osmandRegions = app.getRegions();
|
||||
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);
|
||||
|
||||
if (indexesToDownload.contains(indexItem)) {
|
||||
selectedItems.add(selectableItem);
|
||||
}
|
||||
}
|
||||
|
||||
final SelectMultipleItemsBottomSheet dialog =
|
||||
SelectMultipleItemsBottomSheet.showInstance(activity, allItems, selectedItems, true);
|
||||
|
||||
dialog.setSelectionUpdateListener(new SelectionUpdateListener() {
|
||||
@Override
|
||||
public void onSelectionUpdate() {
|
||||
dialog.setTitle(app.getString(R.string.welmode_download_maps));
|
||||
String total = app.getString(R.string.shared_string_total);
|
||||
double sizeToDownload = getDownloadSizeInMb(dialog.getSelectedItems());
|
||||
String size = DownloadItem.getFormattedMb(app, sizeToDownload);
|
||||
String description =
|
||||
app.getString(R.string.ltr_or_rtl_combine_via_colon, total, size);
|
||||
dialog.setDescription(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);
|
||||
}
|
||||
dialog.setConfirmButtonTitle(btnTitle);
|
||||
}
|
||||
});
|
||||
|
||||
dialog.setOnApplySelectionListener(new OnApplySelectionListener() {
|
||||
@Override
|
||||
public void onSelectionApplied(List<SelectableItem> selectedItems) {
|
||||
List<IndexItem> indexItems = new ArrayList<>();
|
||||
for (SelectableItem item : selectedItems) {
|
||||
Object obj = item.getObject();
|
||||
if (obj instanceof IndexItem) {
|
||||
indexItems.add((IndexItem) obj);
|
||||
}
|
||||
}
|
||||
listener.onItemsToDownloadSelected(indexItems);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static List<IndexItem> getIndexesToDownload(MultipleIndexItem multipleIndexItem) {
|
||||
if (multipleIndexItem.hasActualDataToDownload()) {
|
||||
// download left regions
|
||||
return multipleIndexItem.getIndexesToDownload();
|
||||
} else {
|
||||
// download all regions again
|
||||
return multipleIndexItem.getAllIndexes();
|
||||
}
|
||||
}
|
||||
|
||||
private static double getDownloadSizeInMb(@NonNull List<SelectableItem> selectableItems) {
|
||||
List<IndexItem> indexItems = new ArrayList<>();
|
||||
for (SelectableItem i : selectableItems) {
|
||||
Object obj = i.getObject();
|
||||
if (obj instanceof IndexItem) {
|
||||
indexItems.add((IndexItem) obj);
|
||||
}
|
||||
}
|
||||
double totalSizeMb = 0.0d;
|
||||
for (IndexItem item : indexItems) {
|
||||
totalSizeMb += item.getSizeToDownloadInMb();
|
||||
}
|
||||
return totalSizeMb;
|
||||
}
|
||||
|
||||
public interface SelectItemsToDownloadListener {
|
||||
void onItemsToDownloadSelected(List<IndexItem> items);
|
||||
}
|
||||
|
||||
}
|
280
OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java
Normal file
280
OsmAnd/src/net/osmand/plus/download/SelectIndexesUiHelper.java
Normal file
|
@ -0,0 +1,280 @@
|
|||
package net.osmand.plus.download;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
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.MultipleSelectionWithModeBottomSheet;
|
||||
import net.osmand.plus.base.SelectionBottomSheet;
|
||||
import net.osmand.plus.base.SelectionBottomSheet.OnApplySelectionListener;
|
||||
import net.osmand.plus.base.SelectionBottomSheet.OnUiInitializedAdapter;
|
||||
import net.osmand.plus.base.SelectionBottomSheet.SelectableItem;
|
||||
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.List;
|
||||
|
||||
import static net.osmand.plus.download.MultipleDownloadItem.getIndexItem;
|
||||
|
||||
public class SelectIndexesUiHelper {
|
||||
|
||||
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 SelectionBottomSheet dialog;
|
||||
|
||||
private SelectIndexesUiHelper(@NonNull DownloadItem downloadItem,
|
||||
@NonNull AppCompatActivity activity,
|
||||
@NonNull DateFormat dateFormat,
|
||||
boolean showRemoteDate,
|
||||
@NonNull ItemsToDownloadSelectedListener listener) {
|
||||
this.app = (OsmandApplication) activity.getApplicationContext();
|
||||
this.activity = activity;
|
||||
this.downloadItem = downloadItem;
|
||||
this.dateFormat = dateFormat;
|
||||
this.showRemoteDate = showRemoteDate;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public static void showDialog(@NonNull DownloadItem i,
|
||||
@NonNull AppCompatActivity a,
|
||||
@NonNull DateFormat df,
|
||||
boolean showRemoteDate,
|
||||
@NonNull ItemsToDownloadSelectedListener l) {
|
||||
|
||||
new SelectIndexesUiHelper(i, a, df, showRemoteDate, l).showDialogInternal();
|
||||
}
|
||||
|
||||
private void showDialogInternal() {
|
||||
if (downloadItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) {
|
||||
if (downloadItem instanceof MultipleDownloadItem) {
|
||||
showSrtmMultipleSelectionDialog();
|
||||
} else {
|
||||
showSrtmModeSelectionDialog();
|
||||
}
|
||||
} else if (downloadItem instanceof MultipleDownloadItem) {
|
||||
showMultipleSelectionDialog();
|
||||
}
|
||||
}
|
||||
|
||||
private void showMultipleSelectionDialog() {
|
||||
List<SelectableItem> allItems = new ArrayList<>();
|
||||
List<SelectableItem> selectedItems = new ArrayList<>();
|
||||
prepareItems(allItems, selectedItems);
|
||||
|
||||
MultipleSelectionBottomSheet msDialog = MultipleSelectionBottomSheet.showInstance(
|
||||
activity, allItems, selectedItems, true);
|
||||
this.dialog = msDialog;
|
||||
|
||||
msDialog.setOnUiInitializedAdapter(new OnUiInitializedAdapter() {
|
||||
@Override
|
||||
public void onUiInitialized() {
|
||||
dialog.setTitle(app.getString(R.string.welmode_download_maps));
|
||||
}
|
||||
});
|
||||
|
||||
msDialog.setSelectionUpdateListener(new SelectionUpdateListener() {
|
||||
@Override
|
||||
public void onSelectionUpdate() {
|
||||
updateSize();
|
||||
}
|
||||
});
|
||||
|
||||
msDialog.setOnApplySelectionListener(getOnApplySelectionListener(listener));
|
||||
}
|
||||
|
||||
private void showSrtmMultipleSelectionDialog() {
|
||||
List<SelectableItem> allItems = new ArrayList<>();
|
||||
List<SelectableItem> selectedItems = new ArrayList<>();
|
||||
prepareItems(allItems, selectedItems);
|
||||
|
||||
SrtmDownloadItem srtmItem = (SrtmDownloadItem) ((MultipleDownloadItem)downloadItem).getAllItems().get(0);
|
||||
final int selectedModeOrder = srtmItem.isUseMetric() ? 0 : 1;
|
||||
final List<RadioItem> radioItems = createSrtmRadioItems();
|
||||
|
||||
MultipleSelectionBottomSheet msDialog = MultipleSelectionWithModeBottomSheet.showInstance(
|
||||
activity, allItems, selectedItems, radioItems, true);
|
||||
this.dialog = msDialog;
|
||||
|
||||
msDialog.setOnUiInitializedAdapter(new OnUiInitializedAdapter() {
|
||||
@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.isUseMetric() ? 0 : 1;
|
||||
|
||||
final List<RadioItem> radioItems = createSrtmRadioItems();
|
||||
SelectableItem preview = createSelectableItem(srtmItem);
|
||||
|
||||
dialog = ModeSelectionBottomSheet.showInstance(activity, preview, radioItems, true);
|
||||
|
||||
dialog.setOnUiInitializedAdapter(new OnUiInitializedAdapter() {
|
||||
@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.setSelectedMode(radioItems.get(selectedModeOrder));
|
||||
}
|
||||
});
|
||||
|
||||
dialog.setOnApplySelectionListener(getOnApplySelectionListener(listener));
|
||||
}
|
||||
|
||||
private void prepareItems(List<SelectableItem> allItems,
|
||||
List<SelectableItem> selectedItems) {
|
||||
final MultipleDownloadItem multipleDownloadItem = (MultipleDownloadItem) downloadItem;
|
||||
final List<DownloadItem> itemsToDownload = getItemsToDownload(multipleDownloadItem);
|
||||
for (DownloadItem downloadItem : multipleDownloadItem.getAllItems()) {
|
||||
SelectableItem selectableItem = createSelectableItem(downloadItem);
|
||||
allItems.add(selectableItem);
|
||||
|
||||
if (itemsToDownload.contains(downloadItem)) {
|
||||
selectedItems.add(selectableItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<RadioItem> createSrtmRadioItems() {
|
||||
List<RadioItem> radioItems = new ArrayList<>();
|
||||
radioItems.add(createSrtmRadioBtn(R.string.shared_string_meters, true));
|
||||
radioItems.add(createSrtmRadioBtn(R.string.shared_string_feet, 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) {
|
||||
updateDialogListItems(useMeters);
|
||||
updateSize();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return radioItem;
|
||||
}
|
||||
|
||||
private void updateDialogListItems(boolean useMeters) {
|
||||
List<SelectableItem> items = new ArrayList<>(dialog.getAllItems());
|
||||
for (SelectableItem item : items) {
|
||||
DownloadItem downloadItem = (DownloadItem) item.getObject();
|
||||
if (downloadItem instanceof SrtmDownloadItem) {
|
||||
((SrtmDownloadItem) downloadItem).setUseMetric(useMeters);
|
||||
updateSelectableItem(item, downloadItem);
|
||||
}
|
||||
}
|
||||
dialog.setItems(items);
|
||||
}
|
||||
|
||||
private SelectableItem createSelectableItem(DownloadItem item) {
|
||||
SelectableItem selectableItem = new SelectableItem();
|
||||
updateSelectableItem(selectableItem, item);
|
||||
return selectableItem;
|
||||
}
|
||||
|
||||
private void updateSelectableItem(SelectableItem selectableItem,
|
||||
DownloadItem downloadItem) {
|
||||
selectableItem.setTitle(downloadItem.getVisibleName(app, app.getRegions(), false));
|
||||
|
||||
String size = downloadItem.getSizeDescription(app);
|
||||
String addDescr = downloadItem.getAdditionalDescription(app);
|
||||
if (addDescr != null) {
|
||||
size += " " + addDescr;
|
||||
}
|
||||
String date = downloadItem.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);
|
||||
}
|
||||
|
||||
private OnApplySelectionListener getOnApplySelectionListener(final ItemsToDownloadSelectedListener listener) {
|
||||
return new OnApplySelectionListener() {
|
||||
@Override
|
||||
public void onSelectionApplied(List<SelectableItem> selectedItems) {
|
||||
List<IndexItem> indexes = new ArrayList<>();
|
||||
for (SelectableItem item : selectedItems) {
|
||||
IndexItem index = getIndexItem((DownloadItem) item.getObject());
|
||||
if (index != null) {
|
||||
indexes.add(index);
|
||||
}
|
||||
}
|
||||
listener.onItemsToDownloadSelected(indexes);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void updateSize() {
|
||||
double sizeToDownload = getDownloadSizeInMb(dialog.getSelectedItems());
|
||||
String size = DownloadItem.getFormattedMb(app, sizeToDownload);
|
||||
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);
|
||||
}
|
||||
dialog.setApplyButtonTitle(btnTitle);
|
||||
}
|
||||
|
||||
private double getDownloadSizeInMb(@NonNull List<SelectableItem> selectableItems) {
|
||||
double totalSizeMb = 0.0d;
|
||||
for (SelectableItem i : selectableItems) {
|
||||
Object obj = i.getObject();
|
||||
if (obj instanceof DownloadItem) {
|
||||
totalSizeMb += ((DownloadItem) obj).getSizeToDownloadInMb();
|
||||
}
|
||||
}
|
||||
return totalSizeMb;
|
||||
}
|
||||
|
||||
private static List<DownloadItem> getItemsToDownload(MultipleDownloadItem md) {
|
||||
if (md.hasActualDataToDownload()) {
|
||||
// download left regions
|
||||
return md.getItemsToDownload();
|
||||
} else {
|
||||
// download all regions again
|
||||
return md.getAllItems();
|
||||
}
|
||||
}
|
||||
|
||||
public interface ItemsToDownloadSelectedListener {
|
||||
void onItemsToDownloadSelected(List<IndexItem> items);
|
||||
}
|
||||
|
||||
}
|
191
OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java
Normal file
191
OsmAnd/src/net/osmand/plus/download/SrtmDownloadItem.java
Normal file
|
@ -0,0 +1,191 @@
|
|||
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;
|
||||
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.ArrayList;
|
||||
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 final List<IndexItem> indexes;
|
||||
private boolean useMetric;
|
||||
|
||||
public SrtmDownloadItem(List<IndexItem> indexes, boolean useMetric) {
|
||||
super(SRTM_COUNTRY_FILE);
|
||||
this.indexes = indexes;
|
||||
this.useMetric = useMetric;
|
||||
}
|
||||
|
||||
public void setUseMetric(boolean useMetric) {
|
||||
this.useMetric = useMetric;
|
||||
}
|
||||
|
||||
public boolean isUseMetric() {
|
||||
for (IndexItem index : indexes) {
|
||||
if (index.isDownloaded()) {
|
||||
return isMetricItem(index);
|
||||
}
|
||||
}
|
||||
return useMetric;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public IndexItem getIndexItem() {
|
||||
for (IndexItem index : indexes) {
|
||||
if (index.isDownloaded()) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
for (IndexItem index : indexes) {
|
||||
if (useMetric && isMetricItem(index) || !useMetric && !isMetricItem(index)) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
return indexes.get(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double getSizeToDownloadInMb() {
|
||||
return getIndexItem().getSizeToDownloadInMb();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getArchiveSizeMB() {
|
||||
return getIndexItem().getArchiveSizeMB();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOutdated() {
|
||||
for (DownloadItem item : indexes) {
|
||||
if (item.isOutdated()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDownloaded() {
|
||||
for (DownloadItem item : indexes) {
|
||||
if (item.isDownloaded()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasActualDataToDownload() {
|
||||
for (IndexItem item : indexes) {
|
||||
if (!item.hasActualDataToDownload()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDownloading(@NonNull DownloadIndexesThread thread) {
|
||||
for (IndexItem item : indexes) {
|
||||
if (thread.isDownloading(item)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFileName() {
|
||||
return getIndexItem().getFileName();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public List<File> getDownloadedFiles(@NonNull OsmandApplication app) {
|
||||
List<File> result = new ArrayList<>();
|
||||
for (IndexItem index : indexes) {
|
||||
result.addAll(index.getDownloadedFiles(app));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String getDate(@NonNull DateFormat dateFormat, boolean remote) {
|
||||
return getIndexItem().getDate(dateFormat, remote);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String getAdditionalDescription(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;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getAbbreviationInScopes(Context ctx, Object obj) {
|
||||
String abbreviation = ctx.getString(isMetricItem(obj) ? R.string.m : R.string.foot);
|
||||
return "(" + abbreviation + ")";
|
||||
}
|
||||
|
||||
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 isMetricItem(indexItem) ?
|
||||
IndexConstants.BINARY_SRTM_MAP_INDEX_EXT :
|
||||
IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT;
|
||||
}
|
||||
|
||||
public static boolean isSRTMItem(Object item) {
|
||||
if (item instanceof DownloadItem) {
|
||||
return ((DownloadItem) item).getType() == SRTM_COUNTRY_FILE;
|
||||
} else if (item instanceof LocalIndexInfo) {
|
||||
return ((LocalIndexInfo) item).getType() == SRTM_DATA;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean isMetricItem(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);
|
||||
} else if (item instanceof SrtmDownloadItem) {
|
||||
return isMetricItem(((SrtmDownloadItem) item).getIndexItem());
|
||||
} else if (item instanceof MultipleDownloadItem) {
|
||||
List<DownloadItem> items = ((MultipleDownloadItem) item).getAllItems();
|
||||
if (!Algorithms.isEmpty(items)) {
|
||||
return isMetricItem(items.get(0));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -41,9 +41,9 @@ 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.MultipleIndexItem;
|
||||
import net.osmand.plus.download.SelectIndexesUiHelper;
|
||||
import net.osmand.plus.download.SelectIndexesUiHelper.ItemsToDownloadSelectedListener;
|
||||
import net.osmand.plus.download.MultipleDownloadItem;
|
||||
import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask;
|
||||
import net.osmand.plus.helpers.FileNameTranslationHelper;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
||||
|
@ -146,11 +146,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;
|
||||
|
@ -203,12 +203,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.valueOf(item.getAllIndexes().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()) {
|
||||
|
@ -226,8 +226,11 @@ public class ItemViewHolder {
|
|||
header = allRegionsHeader;
|
||||
count = allRegionsCount;
|
||||
}
|
||||
String fullDescription =
|
||||
context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count);
|
||||
String fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count);
|
||||
String addDescr = item.getAdditionalDescription(context);
|
||||
if (addDescr != null) {
|
||||
fullDescription += " " + addDescr;
|
||||
}
|
||||
if (item.hasActualDataToDownload()) {
|
||||
fullDescription = context.getString(
|
||||
R.string.ltr_or_rtl_combine_via_bold_point, fullDescription,
|
||||
|
@ -235,11 +238,14 @@ public class ItemViewHolder {
|
|||
}
|
||||
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);
|
||||
String addDescr = downloadItem.getAdditionalDescription(context);
|
||||
if (addDescr != null) {
|
||||
size += " " + addDescr;
|
||||
}
|
||||
String date = downloadItem.getDate(dateFormat, showRemoteDate);
|
||||
String fullDescription = String.format(pattern, size, date);
|
||||
if (showTypeInDesc) {
|
||||
fullDescription = String.format(pattern, type, fullDescription);
|
||||
|
@ -274,9 +280,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);
|
||||
|
@ -316,9 +322,9 @@ 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_import;
|
||||
R.drawable.ic_action_gsave_dark;
|
||||
}
|
||||
|
||||
@SuppressLint("DefaultLocale")
|
||||
|
@ -459,6 +465,7 @@ public class ItemViewHolder {
|
|||
startDownload(item);
|
||||
}
|
||||
}
|
||||
|
||||
private void confirmDownload(final DownloadItem item) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
builder.setTitle(R.string.are_you_sure);
|
||||
|
@ -476,18 +483,17 @@ public class ItemViewHolder {
|
|||
}
|
||||
|
||||
private void startDownload(DownloadItem item) {
|
||||
if (item instanceof MultipleIndexItem) {
|
||||
selectIndexesToDownload((MultipleIndexItem) item);
|
||||
} else if (item instanceof IndexItem) {
|
||||
if (item instanceof IndexItem) {
|
||||
IndexItem indexItem = (IndexItem) item;
|
||||
context.startDownload(indexItem);
|
||||
} else {
|
||||
selectIndexesToDownload(item);
|
||||
}
|
||||
}
|
||||
|
||||
private void selectIndexesToDownload(MultipleIndexItem item) {
|
||||
OsmandApplication app = context.getMyApplication();
|
||||
MultipleIndexesUiHelper.showDialog(item, context, app, dateFormat, showRemoteDate,
|
||||
new SelectItemsToDownloadListener() {
|
||||
private void selectIndexesToDownload(DownloadItem item) {
|
||||
SelectIndexesUiHelper.showDialog(item, context, dateFormat, showRemoteDate,
|
||||
new ItemsToDownloadSelectedListener() {
|
||||
@Override
|
||||
public void onItemsToDownloadSelected(List<IndexItem> indexes) {
|
||||
IndexItem[] indexesArray = new IndexItem[indexes.size()];
|
||||
|
|
|
@ -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,6 +75,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class LocalIndexesFragment extends OsmandExpandableListFragment implements DownloadEvents,
|
||||
OnMapSourceUpdateListener, RenameCallback {
|
||||
private LoadLocalIndexTask asyncLoader;
|
||||
|
@ -963,7 +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)) {
|
||||
} else if (child.isBackupedData() && (SrtmDownloadItem.isSrtmFile(child.getFileName()))) {
|
||||
return ctx.getString(R.string.download_srtm_maps);
|
||||
}
|
||||
return "";
|
||||
|
@ -1029,6 +1031,10 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
|
|||
builder.append(AndroidUtils.formatSize(ctx, child.getSize() * 1024l));
|
||||
}
|
||||
|
||||
if (SrtmDownloadItem.isSRTMItem(child)) {
|
||||
builder.append(" ").append(SrtmDownloadItem.getAbbreviationInScopes(ctx, child));
|
||||
}
|
||||
|
||||
if (!Algorithms.isEmpty(child.getDescription())) {
|
||||
if (builder.length() > 0) {
|
||||
builder.append(" • ");
|
||||
|
@ -1150,5 +1156,4 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
|
|||
private DownloadActivity getDownloadActivity() {
|
||||
return (DownloadActivity) getActivity();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
package net.osmand.plus.helpers;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.map.OsmandRegions;
|
||||
import net.osmand.map.WorldRegion;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.download.DownloadResources;
|
||||
|
@ -19,6 +21,7 @@ import java.lang.reflect.Field;
|
|||
public class FileNameTranslationHelper {
|
||||
private static final Log LOG = PlatformUtil.getLog(FileNameTranslationHelper.class);
|
||||
public static final String WIKI_NAME = "_wiki";
|
||||
public static final String WIKIVOYAGE_NAME = "_wikivoyage";
|
||||
public static final String HILL_SHADE = "Hillshade";
|
||||
public static final String SLOPE = "Slope";
|
||||
public static final String SEA_DEPTH = "Depth_";
|
||||
|
@ -31,6 +34,8 @@ public class FileNameTranslationHelper {
|
|||
String basename = getBasename(fileName);
|
||||
if (basename.endsWith(WIKI_NAME)) { //wiki files
|
||||
return getWikiName(ctx, basename);
|
||||
} else if (basename.endsWith(WIKIVOYAGE_NAME)) {
|
||||
return getWikivoyageName(ctx, basename);
|
||||
} else if (fileName.endsWith("tts")) { //tts files
|
||||
return getVoiceName(ctx, fileName);
|
||||
} else if (fileName.endsWith(IndexConstants.FONT_INDEX_EXT)) { //otf files
|
||||
|
@ -90,6 +95,17 @@ public class FileNameTranslationHelper {
|
|||
return wikiName + " " + ctx.getString(R.string.amenity_type_osmwiki);
|
||||
}
|
||||
|
||||
public static String getWikivoyageName(Context ctx, String basename) {
|
||||
String formattedName = basename.substring(0, basename.indexOf(WIKIVOYAGE_NAME)).replaceAll("-", "").replaceAll("all", "");
|
||||
String wikiVoyageName = getSuggestedWikivoyageMaps(ctx, formattedName);
|
||||
if (wikiVoyageName == null) {
|
||||
wikiVoyageName = formattedName;
|
||||
}
|
||||
String wikiVoyageWord = ctx.getString(R.string.shared_string_wikivoyage);
|
||||
|
||||
return ctx.getString(R.string.ltr_or_rtl_combine_via_space, wikiVoyageName, wikiVoyageWord);
|
||||
}
|
||||
|
||||
public static String getVoiceName(Context ctx, String fileName) {
|
||||
try {
|
||||
String nm = fileName.replace('-', '_').replace(' ', '_');
|
||||
|
@ -245,4 +261,27 @@ public class FileNameTranslationHelper {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static String getSuggestedWikivoyageMaps(Context ctx, String filename) {
|
||||
if (WorldRegion.AFRICA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_africa);
|
||||
} else if (WorldRegion.AUSTRALIA_AND_OCEANIA_REGION_ID.replaceAll("-", "").equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_oceania);
|
||||
} else if (WorldRegion.ASIA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_asia);
|
||||
} else if (WorldRegion.CENTRAL_AMERICA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_central_america);
|
||||
} else if (WorldRegion.EUROPE_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_europe);
|
||||
} else if (WorldRegion.RUSSIA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_russia);
|
||||
} else if (WorldRegion.NORTH_AMERICA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_north_america);
|
||||
} else if (WorldRegion.SOUTH_AMERICA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_south_america);
|
||||
} else if (WorldRegion.ANTARCTICA_REGION_ID.equalsIgnoreCase(filename)) {
|
||||
return ctx.getString(R.string.index_name_antarctica);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
package net.osmand.plus.resources;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
|
||||
import net.osmand.IndexConstants;
|
||||
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;
|
||||
|
@ -34,7 +33,6 @@ public class IncrementalChangesManager {
|
|||
private ResourceManager resourceManager;
|
||||
private final Map<String, RegionUpdateFiles> regions = new ConcurrentHashMap<String, IncrementalChangesManager.RegionUpdateFiles>();
|
||||
|
||||
|
||||
public IncrementalChangesManager(ResourceManager resourceManager) {
|
||||
this.resourceManager = resourceManager;
|
||||
}
|
||||
|
@ -48,7 +46,7 @@ public class IncrementalChangesManager {
|
|||
Set<String> existingFiles = new HashSet<String>();
|
||||
for (File f : files) {
|
||||
if (!f.getName().endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT) &&
|
||||
!f.getName().endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)) {
|
||||
!SrtmDownloadItem.isSrtmFile(f.getName())) {
|
||||
existingFiles.add(Algorithms.getFileNameWithoutExtension(f));
|
||||
}
|
||||
}
|
||||
|
@ -186,7 +184,6 @@ public class IncrementalChangesManager {
|
|||
public String errorMessage;
|
||||
public RegionUpdateFiles updateFiles;
|
||||
|
||||
|
||||
public boolean isPreferrableLimitForDayUpdates(String monthYearPart, List<IncrementalUpdate> dayUpdates) {
|
||||
List<RegionUpdate> lst = updateFiles.dayUpdates.get(monthYearPart);
|
||||
if (lst == null || lst.size() < 10) {
|
||||
|
@ -333,8 +330,6 @@ public class IncrementalChangesManager {
|
|||
return lst;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public IncrementalUpdateList getUpdatesByMonth(String fileName) {
|
||||
IncrementalUpdateList iul = new IncrementalUpdateList();
|
||||
RegionUpdateFiles ruf = regions.get(fileName.toLowerCase());
|
||||
|
|
|
@ -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;
|
||||
|
@ -126,6 +127,7 @@ public class ResourceManager {
|
|||
private List<BinaryMapIndexReader> readers = new ArrayList<>(BinaryMapReaderResourceType.values().length);
|
||||
private boolean useForRouting;
|
||||
private boolean useForPublicTransport;
|
||||
|
||||
public BinaryMapReaderResource(File f, BinaryMapIndexReader initialReader) {
|
||||
this.filename = f;
|
||||
this.initialReader = initialReader;
|
||||
|
@ -205,7 +207,6 @@ public class ResourceManager {
|
|||
|
||||
protected final Map<String, BinaryMapReaderResource> fileReaders = new ConcurrentHashMap<String, BinaryMapReaderResource>();
|
||||
|
||||
|
||||
private final Map<String, RegionAddressRepository> addressMap = new ConcurrentHashMap<String, RegionAddressRepository>();
|
||||
protected final Map<String, AmenityIndexRepository> amenityRepositories = new ConcurrentHashMap<String, AmenityIndexRepository>();
|
||||
// protected final Map<String, BinaryMapIndexReader> routingMapFiles = new ConcurrentHashMap<String, BinaryMapIndexReader>();
|
||||
|
@ -214,7 +215,6 @@ public class ResourceManager {
|
|||
protected final Map<String, String> indexFileNames = new ConcurrentHashMap<String, String>();
|
||||
protected final Map<String, String> basemapFileNames = new ConcurrentHashMap<String, String>();
|
||||
|
||||
|
||||
protected final IncrementalChangesManager changesManager = new IncrementalChangesManager(this);
|
||||
|
||||
protected final MapRenderRepositories renderer;
|
||||
|
@ -540,6 +540,7 @@ public class ResourceManager {
|
|||
private final static String ASSET_COPY_MODE__overwriteOnlyIfExists = "overwriteOnlyIfExists";
|
||||
private final static String ASSET_COPY_MODE__alwaysOverwriteOrCopy = "alwaysOverwriteOrCopy";
|
||||
private final static String ASSET_COPY_MODE__copyOnlyIfDoesNotExist = "copyOnlyIfDoesNotExist";
|
||||
|
||||
private void unpackBundledAssets(AssetManager assetManager, File appDataDir, IProgress progress, boolean isFirstInstall) throws IOException, XmlPullParserException {
|
||||
List<AssetEntry> assetEntries = DownloadOsmandIndexesHelper.getBundledAssets(assetManager);
|
||||
for (AssetEntry asset : assetEntries) {
|
||||
|
@ -607,8 +608,6 @@ public class ResourceManager {
|
|||
return files;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void renameRoadsFiles(ArrayList<File> files, File roadsPath) {
|
||||
Iterator<File> it = files.iterator();
|
||||
while (it.hasNext()) {
|
||||
|
@ -703,7 +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);
|
||||
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 {
|
||||
|
@ -944,7 +943,6 @@ public class ResourceManager {
|
|||
return amenities;
|
||||
}
|
||||
|
||||
|
||||
public boolean containsAmenityRepositoryToSearch(boolean searchByName) {
|
||||
for (AmenityIndexRepository index : getAmenityRepositories()) {
|
||||
if (searchByName) {
|
||||
|
@ -1040,7 +1038,6 @@ public class ResourceManager {
|
|||
return res;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////// Working with transport ////////////////////////////////////////////////
|
||||
|
||||
private List<BinaryMapIndexReader> getTransportRepositories(double topLat, double leftLon, double bottomLat, double rightLon) {
|
||||
|
@ -1183,7 +1180,6 @@ public class ResourceManager {
|
|||
return new LinkedHashMap<String, String>(indexFileNames);
|
||||
}
|
||||
|
||||
|
||||
public boolean containsBasemap() {
|
||||
return !basemapFileNames.isEmpty();
|
||||
}
|
||||
|
|
|
@ -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,7 +93,7 @@ public class FileSettingsItem extends StreamSettingsItem {
|
|||
case OTHER:
|
||||
break;
|
||||
case SRTM_MAP:
|
||||
if (name.endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)) {
|
||||
if (SrtmDownloadItem.isSrtmFile(name)) {
|
||||
return subtype;
|
||||
}
|
||||
break;
|
||||
|
@ -257,6 +258,8 @@ public class FileSettingsItem extends StreamSettingsItem {
|
|||
prefix = oldPath.substring(0, oldPath.lastIndexOf(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT));
|
||||
} else if (oldPath.endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)) {
|
||||
prefix = oldPath.substring(0, oldPath.lastIndexOf(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT));
|
||||
} else if (oldPath.endsWith(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT)) {
|
||||
prefix = oldPath.substring(0, oldPath.lastIndexOf(IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT));
|
||||
} else if (oldPath.endsWith(IndexConstants.BINARY_ROAD_MAP_INDEX_EXT)) {
|
||||
prefix = oldPath.substring(0, oldPath.lastIndexOf(IndexConstants.BINARY_ROAD_MAP_INDEX_EXT));
|
||||
} else {
|
||||
|
|
|
@ -200,7 +200,7 @@ public class DataStorageHelper {
|
|||
|
||||
terrainMemory = MemoryItem.builder()
|
||||
.setKey(TERRAIN_MEMORY)
|
||||
.setExtensions(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)
|
||||
.setExtensions(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT, IndexConstants.BINARY_SRTM_FEET_MAP_INDEX_EXT)
|
||||
.setDirectories(
|
||||
createDirectory(SRTM_INDEX_DIR, true, EXTENSIONS, true),
|
||||
createDirectory(TILES_INDEX_DIR, false, PREFIX, false))
|
||||
|
|
|
@ -492,8 +492,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl
|
|||
}
|
||||
});
|
||||
if (closeButton instanceof ImageView) {
|
||||
UiUtilities.rotateImageByLayoutDirection(
|
||||
(ImageView) closeButton, AndroidUtils.getLayoutDirection(app));
|
||||
UiUtilities.rotateImageByLayoutDirection((ImageView) closeButton);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,7 +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)) {
|
||||
} 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);
|
||||
|
|
|
@ -10,6 +10,11 @@ import android.widget.ImageButton;
|
|||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
|
@ -30,11 +35,6 @@ import net.osmand.util.Algorithms;
|
|||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
public class PurchasesFragment extends BaseOsmAndFragment implements InAppPurchaseListener, OnFragmentInteractionListener {
|
||||
|
||||
private static final Log log = PlatformUtil.getLog(PurchasesFragment.class);
|
||||
|
@ -152,6 +152,7 @@ public class PurchasesFragment extends BaseOsmAndFragment implements InAppPurcha
|
|||
}
|
||||
});
|
||||
ImageButton backButton = toolbar.findViewById(R.id.close_button);
|
||||
UiUtilities.rotateImageByLayoutDirection(backButton);
|
||||
backButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
|
@ -197,9 +198,7 @@ public class PurchasesFragment extends BaseOsmAndFragment implements InAppPurcha
|
|||
|
||||
@Override
|
||||
public void onSearchResult(CountrySelectionFragment.CountryItem name) {
|
||||
if (subscriptionsCard != null) {
|
||||
subscriptionsCard.onSupportRegionSelected(name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -5,30 +5,26 @@ import android.net.Uri;
|
|||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
||||
import net.osmand.plus.liveupdates.CountrySelectionFragment;
|
||||
import net.osmand.plus.liveupdates.LiveUpdatesFragment;
|
||||
import net.osmand.plus.liveupdates.OsmLiveActivity;
|
||||
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
public class SubscriptionsCard extends BaseCard {
|
||||
|
||||
private static final String PLAY_STORE_SUBSCRIPTION_URL = "https://play.google.com/store/account/subscriptions";
|
||||
private static final String PLAY_STORE_SUBSCRIPTION_DEEPLINK_URL = "https://play.google.com/store/account/subscriptions?sku=%s&package=%s";
|
||||
|
||||
private Fragment target;
|
||||
private CountrySelectionFragment countrySelectionFragment = new CountrySelectionFragment();
|
||||
private SubscriptionsListCard subscriptionsListCard;
|
||||
|
||||
private InAppPurchaseHelper purchaseHelper;
|
||||
|
@ -54,7 +50,6 @@ public class SubscriptionsCard extends BaseCard {
|
|||
}
|
||||
|
||||
updateSubscriptionsListCard();
|
||||
setupSupportRegion();
|
||||
|
||||
LinearLayout reportContainer = view.findViewById(R.id.report_container);
|
||||
reportContainer.setOnClickListener(new View.OnClickListener() {
|
||||
|
@ -99,26 +94,6 @@ public class SubscriptionsCard extends BaseCard {
|
|||
}
|
||||
}
|
||||
|
||||
private void setupSupportRegion() {
|
||||
String region = LiveUpdatesFragment.getSupportRegionName(app, purchaseHelper);
|
||||
String header = LiveUpdatesFragment.getSupportRegionHeader(app, region);
|
||||
TextView supportRegionHeader = view.findViewById(R.id.support_region_header);
|
||||
TextView supportRegion = view.findViewById(R.id.support_region);
|
||||
supportRegionHeader.setText(header);
|
||||
supportRegion.setText(region);
|
||||
|
||||
View supportRegionContainer = view.findViewById(R.id.support_region_container);
|
||||
supportRegionContainer.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
CountrySelectionFragment countryCountrySelectionFragment = countrySelectionFragment;
|
||||
countryCountrySelectionFragment.show(target.getChildFragmentManager(), CountrySelectionFragment.TAG);
|
||||
}
|
||||
});
|
||||
|
||||
countrySelectionFragment.initCountries(app);
|
||||
}
|
||||
|
||||
private String getSubscriptionUrl() {
|
||||
InAppPurchaseHelper purchaseHelper = app.getInAppPurchaseHelper();
|
||||
if (purchaseHelper != null && purchaseHelper.getFullVersion() != null) {
|
||||
|
@ -129,17 +104,4 @@ public class SubscriptionsCard extends BaseCard {
|
|||
return PLAY_STORE_SUBSCRIPTION_URL;
|
||||
}
|
||||
}
|
||||
|
||||
public void onSupportRegionSelected(CountrySelectionFragment.CountryItem selectedCountryItem) {
|
||||
String countryName = selectedCountryItem != null ? selectedCountryItem.getLocalName() : "";
|
||||
String countryDownloadName = selectedCountryItem != null ?
|
||||
selectedCountryItem.getDownloadName() : OsmandSettings.BILLING_USER_DONATION_WORLD_PARAMETER;
|
||||
|
||||
TextView supportRegionHeader = view.findViewById(R.id.support_region_header);
|
||||
TextView supportRegion = view.findViewById(R.id.support_region);
|
||||
supportRegionHeader.setText(LiveUpdatesFragment.getSupportRegionHeader(app, countryName));
|
||||
supportRegion.setText(countryName);
|
||||
app.getSettings().BILLING_USER_COUNTRY.set(countryName);
|
||||
app.getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.set(countryDownloadName);
|
||||
}
|
||||
}
|
|
@ -7,20 +7,22 @@ import android.text.Spannable;
|
|||
import android.text.SpannableString;
|
||||
import android.text.style.StyleSpan;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.cardview.widget.CardView;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.chooseplan.ChoosePlanDialogFragment;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
||||
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
|
||||
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.cardview.widget.CardView;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
public class TroubleshootingOrPurchasingCard extends BaseCard {
|
||||
|
||||
private static final String OSMAND_NEW_DEVICE_URL = "https://docs.osmand.net/en/main@latest/osmand/purchases#new-device--new-account";
|
||||
|
@ -74,6 +76,9 @@ public class TroubleshootingOrPurchasingCard extends BaseCard {
|
|||
} else {
|
||||
AndroidUtils.setBackground(mapActivity, getItButton, nightMode, R.drawable.btn_unstroked_light, R.drawable.btn_unstroked_dark);
|
||||
}
|
||||
|
||||
ImageView getItArrow = view.findViewById(R.id.additional_button_icon);
|
||||
UiUtilities.rotateImageByLayoutDirection(getItArrow);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@ import net.osmand.plus.widgets.multistatetoggle.RadioItem.OnRadioItemClickListen
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class MultiStateToggleButton<_Radio extends RadioItem> {
|
||||
|
@ -45,6 +47,13 @@ public abstract class MultiStateToggleButton<_Radio extends RadioItem> {
|
|||
this.nightMode = nightMode;
|
||||
}
|
||||
|
||||
public void setItems(Collection<_Radio> radioItems) {
|
||||
if (radioItems == null || radioItems.size() < 2) return;
|
||||
items.clear();
|
||||
items.addAll(radioItems);
|
||||
initView();
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public final void setItems(@NonNull _Radio firstBtn,
|
||||
@NonNull _Radio secondBtn,
|
||||
|
|
Loading…
Reference in a new issue