ThreatMapFragment.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package de.tudarmstadt.informatik.hostage.ui2.fragment;
  2. import android.app.Fragment;
  3. import android.graphics.Color;
  4. import android.location.Location;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.InflateException;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import com.google.android.gms.common.ConnectionResult;
  12. import com.google.android.gms.maps.CameraUpdateFactory;
  13. import com.google.android.gms.maps.GoogleMap;
  14. import com.google.android.gms.maps.MapFragment;
  15. import com.google.android.gms.maps.model.CircleOptions;
  16. import com.google.android.gms.maps.model.LatLng;
  17. import com.google.android.gms.maps.model.Marker;
  18. import com.google.android.gms.maps.model.MarkerOptions;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import de.tudarmstadt.informatik.hostage.R;
  23. import de.tudarmstadt.informatik.hostage.logging.Record;
  24. import de.tudarmstadt.informatik.hostage.logging.UglyDbHelper;
  25. import de.tudarmstadt.informatik.hostage.ui2.activity.MainActivity;
  26. import static com.google.android.gms.common.GooglePlayServicesUtil.*;
  27. /**
  28. * Created by Fabio Arnold on 10.02.14.
  29. */
  30. public class ThreatMapFragment extends Fragment implements GoogleMap.OnInfoWindowClickListener {
  31. private GoogleMap map = null;
  32. private static View view = null;
  33. /**
  34. * if google play services aren't available an error notification will be displayed
  35. *
  36. * @return true if the google play services are available
  37. */
  38. private boolean isGooglePlay() {
  39. int status = isGooglePlayServicesAvailable(getActivity());
  40. boolean result = status == ConnectionResult.SUCCESS;
  41. if (!result) {
  42. getErrorDialog(status, getActivity(), 10).show();
  43. }
  44. return result;
  45. }
  46. @Override
  47. public void onInfoWindowClick(Marker marker) {
  48. MainActivity.getInstance().displayView(MainActivity.MainMenuItem.RECORDS.getValue());
  49. RecordOverviewFragment recordOverviewFragment = (RecordOverviewFragment)MainActivity.getInstance().getCurrentFragment();
  50. recordOverviewFragment.showDetailsForSSID(marker.getId());
  51. Log.i("MARKER", ""+marker.getId());
  52. }
  53. private class Point {
  54. public double x, y;
  55. public Point(double sx, double sy) {
  56. x = sx;
  57. y = sy;
  58. }
  59. }
  60. private void populateMap() {
  61. UglyDbHelper dbh = new UglyDbHelper(getActivity());
  62. ArrayList<Record> records = dbh.getAllRecords();
  63. HashMap<String, ArrayList<Point>> threatLocations = new HashMap<String, ArrayList<Point>>();
  64. for (Record record : records) {
  65. LatLng location = new LatLng(record.getLatitude(), record.getLongitude());
  66. ArrayList<Point> points;
  67. if (threatLocations.containsKey(record.getSsid())) {
  68. points = threatLocations.get(record.getSsid());
  69. } else {
  70. points = new ArrayList<Point>();
  71. threatLocations.put(record.getSsid(), points);
  72. }
  73. points.add(new Point(location.latitude, location.longitude));
  74. }
  75. final int maxNumAttacks = 20;
  76. CircleOptions circleOptions = new CircleOptions().radius(200.0).fillColor(Color.argb(127, 240, 80, 60)).strokeWidth(0.0f);
  77. for (Map.Entry<String, ArrayList<Point>> entry : threatLocations.entrySet()) {
  78. String ssid = entry.getKey();
  79. ArrayList<Point> points = entry.getValue();
  80. // color
  81. int threatLevel = points.size();
  82. if (threatLevel > maxNumAttacks) threatLevel = maxNumAttacks;
  83. float alpha = 1.0f - (float)(threatLevel-1) / (float)(maxNumAttacks-1);
  84. int color = Color.argb(127, (int) (240.0 + 15.0 * alpha), (int) (80.0 + 175.0 * alpha), 60);
  85. // radius
  86. Point minimum = new Point(360.0, 360.0), maximum = new Point(-360.0, -360.0);
  87. for (Point point : points) {
  88. if (point.x < minimum.x) minimum.x = point.x;
  89. if (point.x > maximum.x) maximum.x = point.x;
  90. if (point.y < minimum.y) minimum.y = point.y;
  91. if (point.y > maximum.y) maximum.y = point.y;
  92. }
  93. LatLng center = new LatLng(0.5 * (minimum.x + maximum.x), 0.5 * (minimum.y + maximum.y));
  94. float[] result = new float[1];
  95. Location.distanceBetween(minimum.x, minimum.y, maximum.x, maximum.y, result);
  96. float radius = 0.5f * result[0];
  97. map.addCircle(circleOptions.center(center).radius(100.0 + radius).fillColor(color));
  98. map.addMarker(new MarkerOptions().title(ssid + ": " + points.size() + (points.size() == 1 ? " attack" : " attacks")).position(
  99. center));
  100. }
  101. map.setMyLocationEnabled(true);
  102. map.setOnInfoWindowClickListener(this);
  103. LatLng tudarmstadt = new LatLng(49.86923, 8.6632768);
  104. //LatLng mapCenter = new LatLng(41.889, -87.622);
  105. //Location myLocation = map.getMyLocation();
  106. map.moveCamera(CameraUpdateFactory.newLatLngZoom(tudarmstadt, 13));
  107. }
  108. @Override
  109. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  110. Bundle savedInstanceState) {
  111. super.onCreateView(inflater, container, savedInstanceState);
  112. if (view != null) {
  113. ViewGroup parent = (ViewGroup) view.getParent();
  114. if (parent != null)
  115. parent.removeView(view);
  116. }
  117. try {
  118. view = inflater.inflate(R.layout.fragment_threatmap, container, false);
  119. if (isGooglePlay()) {
  120. map = ((MapFragment) getFragmentManager()
  121. .findFragmentById(R.id.threatmapfragment)).getMap();
  122. populateMap();
  123. }
  124. } catch (InflateException e) {
  125. // map already exists
  126. e.printStackTrace();
  127. }
  128. return view;
  129. }
  130. }