package hu.nspace.mapsforgeview;
import android.content.Context;
import android.view.View;
import com.google.appinventor.components.annotations.*;
import com.google.appinventor.components.runtime.*;
import com.google.appinventor.components.common.ComponentCategory;
import org.mapsforge.map.android.graphics.AndroidGraphicFactory;
import org.mapsforge.map.android.util.AndroidUtil;
import org.mapsforge.map.layer.cache.TileCache;
import org.mapsforge.map.layer.renderer.TileRendererLayer;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.model.MapViewPosition;
import org.mapsforge.map.reader.MapFile;
//import org.mapsforge.map.reader.MapDataStore;
import java.io.File;
import java.io.FileInputStream;
@DesignerComponent(
version = 1,
description = "Offline Mapsforge 0.26.1 view component",
category = ComponentCategory.EXTENSION,
nonVisible = false,
iconName = "images/map.png"
)
@SimpleObject
public class MapsforgeView extends AndroidViewComponent {
// private View view;
private MapView mapView;
private MapFile mapFile;
private TileRendererLayer renderer;
private TileCache tileCache;
private MapViewPosition mapViewPosition;
public MapsforgeView(ComponentContainer container) {
super(container.$form());
Context context = container.$context();
AndroidGraphicFactory.createInstance(context);
mapView = new MapView(context);
// Alapbeállítások
mapView.setClickable(true);
mapView.getMapScaleBar().setVisible(true);
mapView.setZoomLevel((byte) 10);
// UI-hoz hozzárendelés
container.$add(this);
}
// Egyszerű getter a view-hoz (nem kell @Override)
public MapView getView() {
return mapView;
}
@SimpleFunction(description = "Load .map file from path with XmlRenderTheme")
public void LoadMap(String mapFilePath, String renderThemePath) {
try {
File file = new File(mapFilePath);
if (file.exists()) {
// MapFile betöltése
mapFile = new MapFile(mapFilePath);
// MapDataStore mapDataStore = new MapFile(mapFile);
// TileCache létrehozása (méret és DPI értékek tetszőlegesen módosíthatók)
tileCache = AndroidUtil.createTileCache(
mapView.getContext(),
"mapcache",
mapView.getModel().displayModel.getTileSize(),
1f,
mapView.getModel().frameBufferModel.getOverdrawFactor(),
true);
// TileRendererLayer létrehozása
renderer = new TileRendererLayer(
tileCache,
mapFile,
//mapDataStore,
mapView.getModel().mapViewPosition,
//null,
true, // renderLabels
true, // renderHillshading
true, // renderMapData
null
);
mapView.getLayerManager().getLayers().add(renderer);
// középre állítjuk Budapestet
``//mapView.setCenter``(new LatLong(48.0, 20.0));
mapView.setZoomLevel((byte) 12);
}
// TODO: Integráld a renderer-t a View-be
// Pl.: renderer hozzáadása egy MapView-hoz (külön komponens)
} catch (Exception e) {
e.printStackTrace();
}
}
}