public void updateGraph(
      List<ClusterRectangle> clusterRectangles, List<Period> indoorPeriods, String android_id) {
    // Graph Update
    // Make Graph
    Configuration conf = new BaseConfiguration();
    conf.setProperty("storage.backend", "cassandra");
    conf.setProperty("storage.hostname", "127.0.0.1");
    TitanGraph g = TitanFactory.open(conf);

    // Get Smartphone Vertex
    Vertex v = TitanHelper.getVertex(g, "android_id", android_id);
    if (v == null) {
      v = g.addVertex(null);
      v.setProperty("android_id", android_id);
      v.setProperty("ltype", "Object");
    }

    // Process Outdoor Cluster
    for (int i = 0; i < clusterRectangles.size(); i++) {
      ClusterRectangle clusterRectangle = clusterRectangles.get(i);
      double minLon = clusterRectangle.getMinLon();
      double minLat = clusterRectangle.getMinLat();
      double maxLon = clusterRectangle.getMaxLon();
      double maxLat = clusterRectangle.getMaxLat();

      for (int j = 0; j < clusterRectangle.getPeriods().size(); j++) {
        Vertex place = g.addVertex(null);
        place.setProperty("ltype", "Place.outdoor");
        place.setProperty("minLon", minLon);
        place.setProperty("minLat", minLat);
        place.setProperty("maxLon", maxLon);
        place.setProperty("maxLat", maxLat);

        Period period = clusterRectangle.getPeriods().get(j);
        long from = period.getFrom() * 1000;
        long to = period.getTo() * 1000;
        Edge isLocatedIn = g.addEdge(null, v, place, "isLocatedIn");
        Edge isContaining = g.addEdge(null, place, v, "isContaining");
        isLocatedIn.setProperty("from", from);
        isLocatedIn.setProperty("to", to);
        isContaining.setProperty("from", from);
        isContaining.setProperty("to", to);
      }
    }

    // Process Indoor Points
    for (int i = 0; i < indoorPeriods.size(); i++) {
      Period indoor = indoorPeriods.get(i);
      Vertex place = g.addVertex(null);
      place.setProperty("ltype", "Place.indoor");
      place.setProperty("longitude", indoor.getLongitude());
      place.setProperty("latitude", indoor.getLatitude());
      place.setProperty("from", indoor.getFrom());
      place.setProperty("to", indoor.getTo());
    }

    g.commit();
    g.shutdown();
  }
  public List<Period> getIndoorData(String manipulatedString) {
    /*
     * 127.36504046	36.3742216	9.0		1407381330
     * 127.36506211	36.37423924	11.0	1407381340
     * 127.36496859	36.37421911	11.0	1407381350
     * 127.3648429	36.37416071	11.0	1407381360
     * 127.36469597	36.37409721	11.0	1407381370
     */
    List<Period> indoorPeriods = new ArrayList<Period>();

    String[] lines = manipulatedString.split("\n");
    boolean isIndoorStart = false;
    Period period = new Period();
    long lastPeriod = 0;
    for (int i = 0; i < lines.length; i++) {
      String line = lines[i];
      String[] elements = line.split("\t");
      if (elements.length == 4) {
        int numSatellites = (int) Double.parseDouble(elements[2]);
        if (isIndoorStart == false && numSatellites < 6) {
          isIndoorStart = true;
          period = new Period();
          period.setLongitude(Double.parseDouble(elements[0]));
          period.setLatitude(Double.parseDouble(elements[1]));
          period.setFrom(Long.parseLong(elements[3]));
        } else if (isIndoorStart == false && numSatellites != 0) {
          // Keep going
        } else if (isIndoorStart == true && numSatellites == 0) {
          // Keep going
        } else if (isIndoorStart == true && numSatellites >= 6) {
          isIndoorStart = false;
          period.setTo(Long.parseLong(elements[3]));
          // We assume that Staying a place over 10 minutes is indoor
          if (period.getTo() - period.getFrom() >= 600) {
            // System.out.println(" [Location Clusterer] : [DEBUG] Success " + (period.getTo() -
            // period.getFrom()));
            indoorPeriods.add(period);
          } else {
            // System.out.println(" [Location Clusterer] : [DEBUG] Fail " + (period.getTo() -
            // period.getFrom()));
          }
        }

        lastPeriod = Long.parseLong(elements[3]);
      }
    }
    if (isIndoorStart == true) {
      period.setTo(lastPeriod);
      // We assume that Staying a place over 10 minutes is indoor
      if (period.getTo() - period.getFrom() >= 600) {
        // System.out.println(" [Location Clusterer] : [DEBUG] Success " + (period.getTo() -
        // period.getFrom()));
        indoorPeriods.add(period);
      } else {
        // System.out.println(" [Location Clusterer] : [DEBUG] Fail " + (period.getTo() -
        // period.getFrom()));
      }
    }

    return indoorPeriods;
  }