Search in sources :

Example 1 with POI

use of im.tny.segvault.subway.POI in project underlx by underlx.

the class StationPOIFragment method trySetupMap.

private void trySetupMap(final Station station, final List<POI> pois, final int[] lobbyColors, final String lang) {
    if (googleMap == null || !mapLayoutReady) {
        return;
    }
    if (!station.getFeatures().train) {
        googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.no_train_stations_map_style));
    }
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    int curLobbyColorIdx = 0;
    for (Lobby lobby : station.getLobbies()) {
        if (lobby.isAlwaysClosed()) {
            continue;
        }
        for (Lobby.Exit exit : lobby.getExits()) {
            LatLng pos = new LatLng(exit.worldCoord[0], exit.worldCoord[1]);
            builder.include(pos);
            googleMap.addMarker(new MarkerOptions().position(pos).title(String.format(getString(R.string.frag_station_lobby_name), lobby.getName())).snippet(exit.getExitsString()).icon(Util.createMapMarker(getContext(), Util.getDrawableResourceIdForExitType(exit.type, lobby.isAlwaysClosed()), lobbyColors[curLobbyColorIdx])).alpha(lobby.isAlwaysClosed() ? 0.5f : 1));
        }
        curLobbyColorIdx = (curLobbyColorIdx + 1) % lobbyColors.length;
    }
    markers.clear();
    for (POI poi : pois) {
        LatLng pos = new LatLng(poi.getWorldCoord()[0], poi.getWorldCoord()[1]);
        builder.include(pos);
        Marker marker = googleMap.addMarker(new MarkerOptions().position(pos).icon(getMarkerIcon(Util.getColorForPOIType(poi.getType(), getContext()))).title(poi.getNames(lang)[0]));
        markers.put(poi, marker);
    }
    for (Line line : station.getNetwork().getLines()) {
        for (WorldPath path : line.getPaths()) {
            PolylineOptions options = new PolylineOptions().width(5).color(line.getColor()).geodesic(true);
            for (float[] point : path.getPath()) {
                options.add(new LatLng(point[0], point[1]));
            }
            googleMap.addPolyline(options);
        }
    }
    googleMap.setOnInfoWindowClickListener(this);
    LatLngBounds bounds = builder.build();
    // offset from edges of the map in pixels
    int padding = 64;
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
    googleMap.moveCamera(cu);
}
Also used : MarkerOptions(com.google.android.gms.maps.model.MarkerOptions) LatLngBounds(com.google.android.gms.maps.model.LatLngBounds) POI(im.tny.segvault.subway.POI) Marker(com.google.android.gms.maps.model.Marker) WorldPath(im.tny.segvault.subway.WorldPath) PolylineOptions(com.google.android.gms.maps.model.PolylineOptions) Line(im.tny.segvault.subway.Line) Lobby(im.tny.segvault.subway.Lobby) LatLng(com.google.android.gms.maps.model.LatLng) CameraUpdate(com.google.android.gms.maps.CameraUpdate)

Example 2 with POI

use of im.tny.segvault.subway.POI in project underlx by underlx.

the class StationPOIFragment method onInfoWindowClick.

@Override
public void onInfoWindowClick(Marker marker) {
    for (POI poi : pois) {
        if (marker.getPosition().latitude == poi.getWorldCoord()[0] && marker.getPosition().longitude == poi.getWorldCoord()[1]) {
            Intent intent = new Intent(getContext(), POIActivity.class);
            intent.putExtra(POIActivity.EXTRA_POI_ID, poi.getId());
            getContext().startActivity(intent);
            return;
        }
    }
}
Also used : Intent(android.content.Intent) POI(im.tny.segvault.subway.POI)

Example 3 with POI

use of im.tny.segvault.subway.POI in project underlx by underlx.

the class SearchContentProvider method query.

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    if (!serviceBound) {
        return null;
    }
    String query = uri.getLastPathSegment();
    final String normalizedQuery = Normalizer.normalize(query.toString().toLowerCase().trim(), Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
    final List<ResultRow> results = new ArrayList<>();
    final String locale = Util.getCurrentLanguage(getContext());
    for (Station station : mainService.getAllStations()) {
        double distance = getDistance(station.getName(), normalizedQuery);
        if (station.getId().equals(query)) {
            // push to top of results
            distance = -5000;
        }
        for (String altName : station.getAltNames()) {
            double altDistance = getDistance(altName, normalizedQuery);
            if (altDistance < distance) {
                distance = altDistance;
            }
        }
        if (distance < Double.MAX_VALUE) {
            ResultRow row = new ResultRow();
            row.title = station.getName();
            row.subtitle = String.format(getContext().getString(R.string.search_station_subtitle), Util.getNetworkNames(getContext(), station.getNetwork())[0]);
            row.drawable = R.drawable.network_pt_ml;
            row.intentData = "station:" + station.getId();
            row.distance = distance;
            results.add(row);
        }
        for (Lobby lobby : station.getLobbies()) {
            if (lobby.getId().equals(query)) {
                for (Lobby.Exit exit : lobby.getExits()) {
                    results.add(buildResultRowForExit(station, lobby, exit, -5000, null));
                }
                break;
            }
            for (Lobby.Exit exit : lobby.getExits()) {
                boolean added = false;
                for (String street : exit.streets) {
                    distance = getDistance(street, normalizedQuery);
                    if (distance < Double.MAX_VALUE) {
                        results.add(buildResultRowForExit(station, lobby, exit, distance, street));
                        added = true;
                        break;
                    }
                }
                // do not add the same exit twice
                if (added)
                    break;
            }
        }
    }
    for (Line line : mainService.getAllLines()) {
        double distance = Double.MAX_VALUE;
        if (line.getId().equals(query)) {
            // push to top of results
            distance = -5000;
        }
        for (String name : Util.getLineNames(getContext(), line)) {
            double thisDistance = getDistance(name, normalizedQuery);
            if (thisDistance < distance) {
                distance = thisDistance;
            }
        }
        if (distance < Double.MAX_VALUE) {
            ResultRow row = new ResultRow();
            row.title = Util.getLineNames(getContext(), line)[0];
            row.subtitle = String.format(getContext().getString(R.string.search_line_subtitle), Util.getNetworkNames(getContext(), line.getNetwork())[0]);
            row.drawable = Util.getDrawableResourceIdForLineId(line.getId());
            row.intentData = "line:" + line.getId();
            row.distance = distance;
            results.add(row);
        }
    }
    for (POI poi : mainService.getAllPOIs()) {
        double distance = Double.MAX_VALUE;
        // it's unlikely anyone will search by POI ID, but let's support it anyway
        if (poi.getId().equals(query)) {
            // push to top of results
            distance = -5000;
        }
        for (String name : poi.getNames(locale)) {
            double thisDistance = getDistance(name, normalizedQuery);
            if (thisDistance < distance) {
                distance = thisDistance;
            }
        }
        if (distance < Double.MAX_VALUE) {
            ResultRow row = new ResultRow();
            row.title = poi.getNames(locale)[0];
            row.subtitle = String.format("%s \u2022 %s", getContext().getString(R.string.search_poi_subtitle), getContext().getString(Util.getStringResourceIdForPOIType(poi.getType())));
            row.drawable = R.drawable.ic_place_black_24dp;
            row.drawable2 = Util.getDrawableResourceIdForPOIType(poi.getType());
            row.intentData = "poi:" + poi.getId();
            row.distance = distance;
            results.add(row);
        }
    }
    // TODO search train services, bus services, trivia, etc.
    Collections.sort(results, new Comparator<ResultRow>() {

        @Override
        public int compare(ResultRow row, ResultRow t1) {
            return Double.compare(row.distance, t1.distance);
        }
    });
    if (results.size() == 0) {
        ResultRow row = new ResultRow();
        row.title = getContext().getString(R.string.search_no_results);
        row.drawable = R.drawable.ic_sentiment_dissatisfied_black_24dp;
        row.intentData = "no-results";
        row.distance = 0;
        results.add(row);
    }
    MatrixCursor cursor = new MatrixCursor(columns);
    int i = 0;
    for (ResultRow row : results) {
        Object[] cursorRow = { i++, row.title, row.subtitle, row.drawable, row.drawable2, row.intentData };
        cursor.addRow(cursorRow);
    }
    return cursor;
}
Also used : ArrayList(java.util.ArrayList) POI(im.tny.segvault.subway.POI) MatrixCursor(android.database.MatrixCursor) Station(im.tny.segvault.subway.Station) Line(im.tny.segvault.subway.Line) Lobby(im.tny.segvault.subway.Lobby)

Example 4 with POI

use of im.tny.segvault.subway.POI in project underlx by underlx.

the class TopologyCache method loadNetwork.

public static Network loadNetwork(Context context, String id, String apiEndpoint) throws CacheException {
    String filename = "net-" + id;
    Topology t = null;
    try {
        FileInputStream fis = context.openFileInput(filename);
        ObjectInputStream is = new ObjectInputStream(fis);
        t = (Topology) is.readObject();
        is.close();
        fis.close();
    } catch (FileNotFoundException e) {
        throw new CacheException(e).addInfo("File " + filename + " not found");
    } catch (IOException e) {
        throw new CacheException(e).addInfo("IO exception");
    } catch (ClassNotFoundException e) {
        throw new CacheException(e).addInfo("Class not found");
    } catch (Exception e) {
        e.printStackTrace();
        throw new CacheException(e).addInfo("Unforeseen exception");
    }
    Network net = new Network(t.network.id, t.network.mainLocale, t.network.names, t.network.typCars, t.network.holidays, t.network.timezone, t.network.newsURL);
    for (API.POI poi : t.pois) {
        net.addPOI(new POI(poi.id, poi.type, poi.worldCoord, poi.webURL, poi.mainLocale, poi.names));
    }
    for (String lineid : t.network.lines) {
        API.Line l = t.lines.get(lineid);
        Line line = new Line(net, l.mainLocale, l.names, new HashSet<Stop>(), l.id, l.typCars, l.order);
        line.setColor(Color.parseColor("#" + l.color));
        boolean isFirstStationInLine = true;
        for (String sid : l.stations) {
            API.Station s = t.stations.get(sid);
            Station station = net.getStation(s.id);
            if (station == null) {
                Map<String, String> triviaURLs = new HashMap<>();
                for (Map.Entry<String, String> entry : s.triviaURLs.entrySet()) {
                    triviaURLs.put(entry.getKey(), apiEndpoint + entry.getValue());
                }
                Map<String, Map<String, String>> connURLs = new HashMap<>();
                for (Map.Entry<String, Map<String, String>> entry : s.connURLs.entrySet()) {
                    Map<String, String> urls = new HashMap<>();
                    for (Map.Entry<String, String> localeEntry : entry.getValue().entrySet()) {
                        urls.put(localeEntry.getKey(), apiEndpoint + localeEntry.getValue());
                    }
                    connURLs.put(entry.getKey(), urls);
                }
                station = new Station(net, s.id, s.name, s.altNames, new Station.Features(s.features.lift, s.features.bus, s.features.boat, s.features.train, s.features.airport), triviaURLs);
                station.setConnectionURLs(connURLs);
                // Lobbies
                for (String lid : s.lobbies) {
                    API.Lobby alobby = t.lobbies.get(lid);
                    Lobby lobby = new Lobby(alobby.id, alobby.name);
                    for (API.Exit aexit : alobby.exits) {
                        Lobby.Exit exit = new Lobby.Exit(aexit.id, aexit.worldCoord, aexit.streets, aexit.type);
                        lobby.addExit(exit);
                    }
                    for (API.Schedule asched : alobby.schedule) {
                        Schedule sched = new Schedule(asched.holiday, asched.day, asched.open, asched.openTime * 1000, asched.duration * 1000);
                        lobby.addSchedule(sched);
                    }
                    station.addLobby(lobby);
                }
                // POIs
                for (String poiId : s.pois) {
                    POI poi = net.getPOI(poiId);
                    if (poi != null) {
                        station.addPOI(poi);
                    }
                }
            }
            Stop stop = new Stop(station, line);
            line.addVertex(stop);
            station.addVertex(stop);
            if (isFirstStationInLine) {
                line.setFirstStop(stop);
                isFirstStationInLine = false;
            }
            // WiFi APs
            for (API.WiFiAP w : s.wiFiAPs) {
                // take line affinity into account
                if (w.line.equals(line.getId())) {
                    WiFiLocator.addBSSIDforStop(stop, new BSSID(w.bssid));
                }
            }
        }
        for (API.Schedule asched : l.schedule) {
            Schedule sched = new Schedule(asched.holiday, asched.day, asched.open, asched.openTime * 1000, asched.duration * 1000);
            line.addSchedule(sched);
        }
        for (API.WorldPath apath : l.worldPaths) {
            WorldPath path = new WorldPath(apath.id, apath.path);
            line.addPath(path);
        }
        net.addLine(line);
    }
    // Connections are within stations in the same line
    for (API.Connection c : t.connections) {
        Set<Stop> sFrom = net.getStation(c.from).vertexSet();
        Set<Stop> sTo = net.getStation(c.to).vertexSet();
        Stop from = null, to = null;
        for (Stop s : sFrom) {
            for (Stop s2 : sTo) {
                if (s.getLine().getId().equals(s2.getLine().getId())) {
                    from = s;
                    to = s2;
                }
            }
        }
        if (from != null && to != null) {
            Connection newConnection = net.addEdge(from, to);
            from.getLine().addEdge(from, to);
            newConnection.setTimes(new Connection.Times(c.typWaitS, c.typStopS, c.typS));
            newConnection.setWorldLength(c.worldLength);
            net.setEdgeWeight(newConnection, c.typS);
        }
    }
    for (API.Transfer tr : t.transfers) {
        Transfer newTransfer = new Transfer();
        // find stations with the right IDs for each line
        Station station = net.getStation(tr.station);
        for (Stop from : station.vertexSet()) {
            for (Stop to : station.vertexSet()) {
                if (from.getLine().getId().equals(tr.from) && to.getLine().getId().equals(tr.to)) {
                    net.addEdge(from, to, newTransfer);
                    net.setEdgeWeight(newTransfer, tr.typS);
                    newTransfer.setTimes(new Connection.Times(0, 0, tr.typS));
                }
            }
        }
    }
    for (API.Schedule asched : t.network.schedule) {
        Schedule sched = new Schedule(asched.holiday, asched.day, asched.open, asched.openTime * 1000, asched.duration * 1000);
        net.addSchedule(sched);
    }
    net.setDatasetAuthors(t.info.authors);
    net.setDatasetVersion(t.info.version);
    return net;
}
Also used : CacheException(im.tny.segvault.disturbances.exception.CacheException) Stop(im.tny.segvault.subway.Stop) HashMap(java.util.HashMap) FileNotFoundException(java.io.FileNotFoundException) Lobby(im.tny.segvault.subway.Lobby) Network(im.tny.segvault.subway.Network) Connection(im.tny.segvault.subway.Connection) IOException(java.io.IOException) POI(im.tny.segvault.subway.POI) WorldPath(im.tny.segvault.subway.WorldPath) FileInputStream(java.io.FileInputStream) CacheException(im.tny.segvault.disturbances.exception.CacheException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) Line(im.tny.segvault.subway.Line) Station(im.tny.segvault.subway.Station) BSSID(im.tny.segvault.s2ls.wifi.BSSID) Schedule(im.tny.segvault.subway.Schedule) Transfer(im.tny.segvault.subway.Transfer) HashMap(java.util.HashMap) Map(java.util.Map) ObjectInputStream(java.io.ObjectInputStream)

Example 5 with POI

use of im.tny.segvault.subway.POI in project underlx by underlx.

the class StationPOIFragment method update.

private void update() {
    if (mListener == null)
        return;
    MainService service = mListener.getMainService();
    if (service == null)
        return;
    Network net = service.getNetwork(networkId);
    if (net == null)
        return;
    final Station station = net.getStation(stationId);
    if (station == null)
        return;
    Locale l = Util.getCurrentLocale(getContext());
    final String lang = l.getLanguage();
    // POIs
    pois = station.getPOIs();
    Collections.sort(pois, new Comparator<POI>() {

        @Override
        public int compare(POI o1, POI o2) {
            return o1.getNames(lang)[0].compareTo(o2.getNames(lang)[0]);
        }
    });
    for (POI poi : pois) {
        POIView v = new POIView(getContext(), poi);
        v.setInteractionListener(new POIView.OnViewInteractionListener() {

            @Override
            public void onPOIClicked(POI poi) {
                if (googleMap == null || !mapLayoutReady) {
                    return;
                }
                Marker marker = markers.get(poi);
                if (marker != null) {
                    marker.showInfoWindow();
                }
                poiScrollView.fullScroll(NestedScrollView.FOCUS_UP);
                googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.fromLatLngZoom(marker.getPosition(), googleMap.getCameraPosition().zoom)));
            }
        });
        poisLayout.addView(v);
    }
    // Lobbies
    final int[] lobbyColors = Util.lobbyColors.clone();
    if (station.getLobbies().size() == 1) {
        lobbyColors[0] = Color.BLACK;
    }
    final ViewTreeObserver vto = mapView.getViewTreeObserver();
    if (vto.isAlive()) {
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            public void onGlobalLayout() {
                mapLayoutReady = true;
                trySetupMap(station, pois, lobbyColors, lang);
                // remove the listener... or we'll be doing this a lot.
                ViewTreeObserver obs = mapView.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
            }
        });
    }
    mapView.getMapAsync(new OnMapReadyCallback() {

        @Override
        public void onMapReady(GoogleMap mMap) {
            googleMap = mMap;
            trySetupMap(station, pois, lobbyColors, lang);
        }
    });
}
Also used : Locale(java.util.Locale) POIView(im.tny.segvault.disturbances.ui.widget.POIView) OnMapReadyCallback(com.google.android.gms.maps.OnMapReadyCallback) POI(im.tny.segvault.subway.POI) Marker(com.google.android.gms.maps.model.Marker) MainService(im.tny.segvault.disturbances.MainService) Station(im.tny.segvault.subway.Station) GoogleMap(com.google.android.gms.maps.GoogleMap) Network(im.tny.segvault.subway.Network) ViewTreeObserver(android.view.ViewTreeObserver)

Aggregations

POI (im.tny.segvault.subway.POI)5 Line (im.tny.segvault.subway.Line)3 Lobby (im.tny.segvault.subway.Lobby)3 Station (im.tny.segvault.subway.Station)3 Marker (com.google.android.gms.maps.model.Marker)2 Network (im.tny.segvault.subway.Network)2 WorldPath (im.tny.segvault.subway.WorldPath)2 Intent (android.content.Intent)1 MatrixCursor (android.database.MatrixCursor)1 ViewTreeObserver (android.view.ViewTreeObserver)1 CameraUpdate (com.google.android.gms.maps.CameraUpdate)1 GoogleMap (com.google.android.gms.maps.GoogleMap)1 OnMapReadyCallback (com.google.android.gms.maps.OnMapReadyCallback)1 LatLng (com.google.android.gms.maps.model.LatLng)1 LatLngBounds (com.google.android.gms.maps.model.LatLngBounds)1 MarkerOptions (com.google.android.gms.maps.model.MarkerOptions)1 PolylineOptions (com.google.android.gms.maps.model.PolylineOptions)1 MainService (im.tny.segvault.disturbances.MainService)1 CacheException (im.tny.segvault.disturbances.exception.CacheException)1 POIView (im.tny.segvault.disturbances.ui.widget.POIView)1