Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
a6ac3d765e
4 changed files with 87 additions and 49 deletions
|
@ -37,6 +37,7 @@ import com.github.ksoichiro.android.observablescrollview.ScrollState;
|
|||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.ValueHolder;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.plus.ApplicationMode;
|
||||
import net.osmand.plus.ContextMenuAdapter;
|
||||
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
|
||||
import net.osmand.plus.ContextMenuAdapter.OnRowItemClick;
|
||||
|
@ -128,6 +129,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
private boolean visible = false;
|
||||
private DashboardType visibleType;
|
||||
private DashboardType previousVisibleType;
|
||||
private ApplicationMode previousAppMode;
|
||||
private boolean landscape;
|
||||
private List<WeakReference<DashBaseFragment>> fragList = new LinkedList<>();
|
||||
private net.osmand.Location myLocation;
|
||||
|
@ -167,7 +169,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
DASHBOARD,
|
||||
OVERLAY_MAP,
|
||||
UNDERLAY_MAP,
|
||||
MAP_MARKERS
|
||||
MAP_MARKERS,
|
||||
MAP_MARKERS_SELECTION
|
||||
}
|
||||
|
||||
private Map<DashboardActionButtonType, DashboardActionButton> actionButtons = new HashMap<>();
|
||||
|
@ -175,7 +178,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
public enum DashboardActionButtonType {
|
||||
MY_LOCATION,
|
||||
NAVIGATE,
|
||||
ROUTE
|
||||
ROUTE,
|
||||
MARKERS_SELECTION
|
||||
}
|
||||
|
||||
private class DashboardActionButton {
|
||||
|
@ -226,7 +230,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
List<Object> activeObjects = ((StableArrayAdapter) listAdapter).getActiveObjects();
|
||||
Object obj = listAdapter.getItem(position);
|
||||
res = activeObjects.contains(obj);
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
Object obj = listAdapter.getItem(position);
|
||||
res = obj instanceof MapMarker;
|
||||
}
|
||||
|
@ -243,7 +247,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
stableAdapter = (StableArrayAdapter) listAdapter;
|
||||
item = stableAdapter.getItem(position);
|
||||
|
||||
if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
if (!((MapMarker) item).history) {
|
||||
deletedMarkers.add(item);
|
||||
}
|
||||
|
@ -273,7 +277,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
stableAdapter.refreshData();
|
||||
if (visibleType == DashboardType.WAYPOINTS || visibleType == DashboardType.WAYPOINTS_FLAT) {
|
||||
onItemsSwapped(stableAdapter.getActiveObjects());
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
deletedMarkers.remove(item);
|
||||
updateMapMarkers(stableAdapter.getActiveObjects());
|
||||
reloadAdapter();
|
||||
|
@ -302,7 +306,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
stableAdapter.refreshData();
|
||||
if (visibleType == DashboardType.WAYPOINTS || visibleType == DashboardType.WAYPOINTS_FLAT) {
|
||||
onItemsSwapped(stableAdapter.getActiveObjects());
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
updateMapMarkers(stableAdapter.getActiveObjects());
|
||||
}
|
||||
if (stableAdapter.getActiveObjects().size() == 0) {
|
||||
|
@ -312,7 +316,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
mapActivity.getMapLayers().getMapControlsLayer().getMapRouteInfoMenu().hide();
|
||||
}
|
||||
} else {
|
||||
if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
reloadAdapter();
|
||||
}
|
||||
}
|
||||
|
@ -383,7 +387,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
|
||||
@Override
|
||||
public void onMapMarkerChanged(MapMarker mapMarker) {
|
||||
if (visible && visibleType == DashboardType.MAP_MARKERS) {
|
||||
if (visible && visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
mapMarkerDialogHelper.updateMarkerView(listView, mapMarker);
|
||||
}
|
||||
}
|
||||
|
@ -431,6 +435,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
tv.setText(R.string.map_overlay);
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
tv.setText(R.string.map_markers);
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
tv.setText(R.string.select_map_markers);
|
||||
}
|
||||
ImageView edit = (ImageView) dashboardView.findViewById(R.id.toolbar_edit);
|
||||
edit.setVisibility(View.GONE);
|
||||
|
@ -473,7 +479,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
}
|
||||
}
|
||||
|
||||
if (visibleType == DashboardType.MAP_MARKERS
|
||||
if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION
|
||||
&& getMyApplication().getMapMarkersHelper().getActiveMapMarkers().size() > 0) {
|
||||
sort.setVisibility(View.VISIBLE);
|
||||
sort.setOnClickListener(new View.OnClickListener() {
|
||||
|
@ -559,9 +565,19 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
}
|
||||
};
|
||||
|
||||
DashboardActionButton markersSelectionButton = new DashboardActionButton();
|
||||
markersSelectionButton.icon = mapActivity.getResources().getDrawable(R.drawable.map_start_navigation);
|
||||
markersSelectionButton.onClickListener = new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
setDashboardVisibility(true, DashboardType.MAP_MARKERS_SELECTION);
|
||||
}
|
||||
};
|
||||
|
||||
actionButtons.put(DashboardActionButtonType.MY_LOCATION, myLocationButton);
|
||||
actionButtons.put(DashboardActionButtonType.NAVIGATE, navigateButton);
|
||||
actionButtons.put(DashboardActionButtonType.ROUTE, routeButton);
|
||||
actionButtons.put(DashboardActionButtonType.MARKERS_SELECTION, markersSelectionButton);
|
||||
}
|
||||
|
||||
private void setActionButton(DashboardType type) {
|
||||
|
@ -574,20 +590,15 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
} else if (type == DashboardType.ROUTE_PREFERENCES) {
|
||||
button = actionButtons.get(DashboardActionButtonType.NAVIGATE);
|
||||
} else if (type == DashboardType.WAYPOINTS || type == DashboardType.WAYPOINTS_FLAT) {
|
||||
boolean routePlanningMode = false;
|
||||
RoutingHelper rh = mapActivity.getRoutingHelper();
|
||||
if (rh.isRoutePlanningMode()) {
|
||||
routePlanningMode = true;
|
||||
} else if ((rh.isRouteCalculated() || rh.isRouteBeingCalculated()) && !rh.isFollowingMode()) {
|
||||
routePlanningMode = true;
|
||||
}
|
||||
boolean routeFollowingMode = !routePlanningMode && rh.isFollowingMode();
|
||||
|
||||
if (routePlanningMode || routeFollowingMode) {
|
||||
if (isInRouteOrPlannigMode()) {
|
||||
button = actionButtons.get(DashboardActionButtonType.NAVIGATE);
|
||||
} else {
|
||||
button = actionButtons.get(DashboardActionButtonType.ROUTE);
|
||||
}
|
||||
} else if (type == DashboardType.MAP_MARKERS) {
|
||||
button = actionButtons.get(DashboardActionButtonType.MARKERS_SELECTION);
|
||||
} else if (type == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
button = actionButtons.get(DashboardActionButtonType.ROUTE);
|
||||
}
|
||||
|
||||
if (button != null) {
|
||||
|
@ -596,6 +607,18 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
}
|
||||
}
|
||||
|
||||
private boolean isInRouteOrPlannigMode() {
|
||||
boolean routePlanningMode = false;
|
||||
RoutingHelper rh = mapActivity.getRoutingHelper();
|
||||
if (rh.isRoutePlanningMode()) {
|
||||
routePlanningMode = true;
|
||||
} else if ((rh.isRouteCalculated() || rh.isRouteBeingCalculated()) && !rh.isFollowingMode()) {
|
||||
routePlanningMode = true;
|
||||
}
|
||||
boolean routeFollowingMode = !routePlanningMode && rh.isFollowingMode();
|
||||
return routePlanningMode || routeFollowingMode;
|
||||
}
|
||||
|
||||
private void hideActionButton() {
|
||||
actionButton.setVisibility(View.GONE);
|
||||
}
|
||||
|
@ -659,7 +682,11 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
|
||||
this.previousVisibleType = prevItem;
|
||||
this.visible = visible;
|
||||
boolean refresh = this.visibleType == type;
|
||||
ApplicationMode currentAppMode = getMyApplication().getSettings().APPLICATION_MODE.get();
|
||||
boolean appModeChanged = currentAppMode != previousAppMode;
|
||||
|
||||
boolean refresh = this.visibleType == type && !appModeChanged;
|
||||
previousAppMode = currentAppMode;
|
||||
this.visibleType = type;
|
||||
DashboardOnMap.staticVisible = visible;
|
||||
DashboardOnMap.staticVisibleType = type;
|
||||
|
@ -702,7 +729,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
}
|
||||
applyDayNightMode();
|
||||
|
||||
if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
getMyApplication().getMapMarkersHelper().addListener(this);
|
||||
}
|
||||
}
|
||||
|
@ -722,7 +749,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
// addOrUpdateDashboardFragments();
|
||||
mapActivity.getRoutingHelper().addListener(this);
|
||||
} else {
|
||||
if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
getMyApplication().getMapMarkersHelper().removeListener(this);
|
||||
}
|
||||
if (swipeDismissListener != null) {
|
||||
|
@ -755,7 +782,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
} else {
|
||||
listView.setBackgroundColor(mapActivity.getResources().getColor(R.color.ctx_menu_info_view_bg_dark));
|
||||
}
|
||||
if (visibleType != DashboardType.WAYPOINTS && visibleType != DashboardType.MAP_MARKERS) {
|
||||
if (visibleType != DashboardType.WAYPOINTS && visibleType != DashboardType.MAP_MARKERS
|
||||
&& visibleType != DashboardType.MAP_MARKERS_SELECTION) {
|
||||
Drawable d = new ColorDrawable(mapActivity.getResources().getColor(R.color.dashboard_divider_dark));
|
||||
listView.setDivider(d);
|
||||
listView.setDividerHeight(dpToPx(1f));
|
||||
|
@ -768,7 +796,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
} else {
|
||||
listView.setBackgroundColor(mapActivity.getResources().getColor(R.color.ctx_menu_info_view_bg_light));
|
||||
}
|
||||
if (visibleType != DashboardType.WAYPOINTS && visibleType != DashboardType.MAP_MARKERS) {
|
||||
if (visibleType != DashboardType.WAYPOINTS && visibleType != DashboardType.MAP_MARKERS
|
||||
&& visibleType != DashboardType.MAP_MARKERS_SELECTION) {
|
||||
Drawable d = new ColorDrawable(mapActivity.getResources().getColor(R.color.dashboard_divider_light));
|
||||
listView.setDivider(d);
|
||||
listView.setDividerHeight(dpToPx(1f));
|
||||
|
@ -800,8 +829,9 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
setDynamicListItems((DynamicListView) listView, listAdapter);
|
||||
updateListAdapter(listAdapter, listener);
|
||||
|
||||
} else if (DashboardType.MAP_MARKERS == visibleType) {
|
||||
} else if (DashboardType.MAP_MARKERS == visibleType || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
|
||||
mapMarkerDialogHelper.setSelectionMode(visibleType == DashboardType.MAP_MARKERS_SELECTION);
|
||||
mapMarkerDialogHelper.setNightMode(nightMode);
|
||||
StableArrayAdapter listAdapter = mapMarkerDialogHelper.getMapMarkersListAdapter();
|
||||
OnItemClickListener listener = mapMarkerDialogHelper.getItemClickListener(listAdapter);
|
||||
|
@ -845,7 +875,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
}
|
||||
|
||||
public void refreshContent(boolean force) {
|
||||
if (visibleType == DashboardType.WAYPOINTS || visibleType == DashboardType.MAP_MARKERS || force) {
|
||||
if (visibleType == DashboardType.WAYPOINTS || visibleType == DashboardType.MAP_MARKERS
|
||||
|| visibleType == DashboardType.MAP_MARKERS_SELECTION || force) {
|
||||
updateListAdapter();
|
||||
} else if (visibleType == DashboardType.CONFIGURE_MAP || visibleType == DashboardType.ROUTE_PREFERENCES) {
|
||||
int index = listView.getFirstVisiblePosition();
|
||||
|
@ -863,7 +894,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
|
||||
if (DashboardType.WAYPOINTS == visibleType || DashboardType.WAYPOINTS_FLAT == visibleType) {
|
||||
listView.setActiveItemsList(listAdapter.getActiveObjects());
|
||||
} else if (DashboardType.MAP_MARKERS == visibleType) {
|
||||
} else if (DashboardType.MAP_MARKERS == visibleType || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
List<Object> activeMarkers = new ArrayList<>();
|
||||
for (Object obj : listAdapter.getActiveObjects()) {
|
||||
if (obj instanceof MapMarker && !((MapMarker) obj).history) {
|
||||
|
@ -1052,7 +1083,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
((DashLocationFragment) df.get()).updateLocation(centerChanged, locationChanged, compassChanged);
|
||||
}
|
||||
}
|
||||
if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
mapMarkerDialogHelper.updateLocation(listView, compassChanged);
|
||||
}
|
||||
}
|
||||
|
@ -1338,8 +1369,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
newRouteIsCalculated(false, new ValueHolder<Boolean>());
|
||||
getMyApplication().getTargetPointsHelper().updateRouteAndRefresh(true);
|
||||
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS) {
|
||||
List<MapMarker> markers = (List<MapMarker>)(Object)items;
|
||||
} else if (visibleType == DashboardType.MAP_MARKERS || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
List<MapMarker> markers = (List<MapMarker>) (Object) items;
|
||||
getMyApplication().getMapMarkersHelper().saveMapMarkers(markers, null);
|
||||
}
|
||||
|
||||
|
@ -1377,7 +1408,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis
|
|||
StableArrayAdapter stableAdapter = (StableArrayAdapter) listAdapter;
|
||||
if (DashboardType.WAYPOINTS == visibleType || DashboardType.WAYPOINTS_FLAT == visibleType) {
|
||||
waypointDialogHelper.reloadListAdapter(stableAdapter);
|
||||
} else if (DashboardType.MAP_MARKERS == visibleType) {
|
||||
} else if (DashboardType.MAP_MARKERS == visibleType || visibleType == DashboardType.MAP_MARKERS_SELECTION) {
|
||||
mapMarkerDialogHelper.reloadListAdapter(stableAdapter);
|
||||
}
|
||||
if (listView instanceof DynamicListView) {
|
||||
|
|
|
@ -268,8 +268,9 @@ public class ConfigureMapMenu {
|
|||
view.getSettings().DAYNIGHT_MODE.set(OsmandSettings.DayNightMode.values()[which]);
|
||||
refreshMapComplete(activity);
|
||||
dialog.dismiss();
|
||||
adapter.setItemDescription(pos, getDayNightDescr(activity));
|
||||
ad.notifyDataSetInvalidated();
|
||||
activity.getDashboard().refreshContent(true);
|
||||
//adapter.setItemDescription(pos, getDayNightDescr(activity));
|
||||
//ad.notifyDataSetInvalidated();
|
||||
}
|
||||
});
|
||||
bld.show();
|
||||
|
|
|
@ -89,7 +89,7 @@ public class MapMarkerDialogHelper {
|
|||
this.helperCallbacks = helperCallbacks;
|
||||
}
|
||||
|
||||
public boolean isSelectionMode() {
|
||||
public boolean isInSelectionMode() {
|
||||
return selectionMode;
|
||||
}
|
||||
|
||||
|
@ -302,20 +302,22 @@ public class MapMarkerDialogHelper {
|
|||
}
|
||||
});
|
||||
|
||||
item = optionsMenu.getMenu().add(R.string.shared_string_reverse_order).setIcon(
|
||||
iconsCache.getContentIcon(R.drawable.ic_action_undo_dark, !nightMode));
|
||||
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
markersHelper.reverseActiveMarkersOrder();
|
||||
if (helperCallbacks != null) {
|
||||
helperCallbacks.reloadAdapter();
|
||||
} else {
|
||||
reloadListAdapter(listAdapter);
|
||||
if (!sorted) {
|
||||
item = optionsMenu.getMenu().add(R.string.shared_string_reverse_order).setIcon(
|
||||
iconsCache.getContentIcon(R.drawable.ic_action_undo_dark, !nightMode));
|
||||
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
markersHelper.reverseActiveMarkersOrder();
|
||||
if (helperCallbacks != null) {
|
||||
helperCallbacks.reloadAdapter();
|
||||
} else {
|
||||
reloadListAdapter(listAdapter);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
item = optionsMenu.getMenu().add(R.string.shared_string_save_as_gpx).setIcon(
|
||||
iconsCache.getContentIcon(R.drawable.ic_action_save, !nightMode));
|
||||
|
@ -349,7 +351,7 @@ public class MapMarkerDialogHelper {
|
|||
final View remove = v.findViewById(R.id.info_close);
|
||||
remove.setVisibility(View.GONE);
|
||||
more.setVisibility(View.GONE);
|
||||
if (!marker.history) {
|
||||
if (!marker.history && !sorted) {
|
||||
move.setVisibility(View.VISIBLE);
|
||||
((ImageView) move).setImageDrawable(app.getIconsCache().getContentIcon(
|
||||
R.drawable.ic_action_reorder, !nightMode));
|
||||
|
@ -379,6 +381,7 @@ public class MapMarkerDialogHelper {
|
|||
});
|
||||
} else {
|
||||
move.setVisibility(View.GONE);
|
||||
move.setTag(null);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ public class MapMarkersWidgetsFactory {
|
|||
private boolean largeDevice;
|
||||
|
||||
private View topBar;
|
||||
private View addressTopBar;
|
||||
private View topBar2nd;
|
||||
private View rowView;
|
||||
private View rowView2nd;
|
||||
|
@ -63,6 +64,7 @@ public class MapMarkersWidgetsFactory {
|
|||
portraitMode = AndroidUiHelper.isOrientationPortrait(map);
|
||||
largeDevice = AndroidUiHelper.isXLargeDevice(map);
|
||||
|
||||
addressTopBar = map.findViewById(R.id.map_top_bar);
|
||||
topBar = map.findViewById(R.id.map_markers_top_bar);
|
||||
topBar2nd = map.findViewById(R.id.map_markers_top_bar_2nd);
|
||||
rowView = map.findViewById(R.id.map_marker_row);
|
||||
|
@ -180,7 +182,8 @@ public class MapMarkersWidgetsFactory {
|
|||
|| !map.getMyApplication().getSettings().SHOW_MAP_MARKERS_TOOLBAR.get()
|
||||
|| map.getMyApplication().getRoutingHelper().isFollowingMode()
|
||||
|| map.getMyApplication().getRoutingHelper().isRoutePlanningMode()
|
||||
|| map.getMapLayers().getMapControlsLayer().getMapRouteInfoMenu().isVisible()) {
|
||||
|| map.getMapLayers().getMapControlsLayer().getMapRouteInfoMenu().isVisible()
|
||||
|| addressTopBar.getVisibility() == View.VISIBLE) {
|
||||
updateVisibility(false);
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue