123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- package de.edotzlaff.schockwelle;
-
- import android.Manifest;
- import android.content.pm.PackageManager;
- import android.location.Location;
- import android.os.Bundle;
- import android.os.SystemClock;
- import android.util.Log;
- import android.widget.Toast;
-
- import androidx.annotation.NonNull;
- import androidx.core.app.ActivityCompat;
- import androidx.core.content.ContextCompat;
- import androidx.fragment.app.FragmentActivity;
-
- import com.google.android.gms.location.FusedLocationProviderClient;
- import com.google.android.gms.location.LocationServices;
- import com.google.android.gms.maps.CameraUpdateFactory;
- import com.google.android.gms.maps.GoogleMap;
- import com.google.android.gms.maps.OnMapReadyCallback;
- import com.google.android.gms.maps.SupportMapFragment;
- import com.google.android.gms.maps.model.LatLng;
- import com.google.android.gms.maps.model.MarkerOptions;
- import com.google.android.gms.tasks.OnCompleteListener;
- import com.google.android.gms.tasks.Task;
- import com.google.firebase.database.DataSnapshot;
- import com.google.firebase.database.DatabaseError;
- import com.google.firebase.database.DatabaseReference;
- import com.google.firebase.database.FirebaseDatabase;
- import com.google.firebase.database.ValueEventListener;
- import java.util.Calendar;
- import java.util.Date;
-
- public class EarthquakeMapsActivity extends FragmentActivity implements OnMapReadyCallback {
-
- private static final String TAG = "MainActivity";
- private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
- private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
-
- //vars
- private Boolean mLocationPermissionsGranted = false;
- private GoogleMap mMap;
- private FusedLocationProviderClient mFusedLocationProviderClient;
-
- private DatabaseReference mDatenbank;
-
- //Date currentTime; //Workaround für Crash: currentTime nicht als Datum sondern als Long zeitstempel
- Long currentTime;
- Location currentLocation;
-
- private double breitengrad;
- private double laengengrad;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_earthquake_maps);
-
- getDataBaseValues(); //TODO Edward: Nur als Anmerkung, diese Methode erfolgt damit deine Methode getDeviceLocation rechtzeitig Koordinaten aus der DB bekommt
- //TODO Hast schon echt viel erledigt :D Ich habe gedacht das die Class EarthquakeMapsActivity Daten an die DB schickt und die SensorMapsActivity die Daten bekommt, ich glaub die Funktion muss in die andere Class
- getLocationPermission();
- }
-
- private void getLocationPermission() {
- String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
- if (ContextCompat.checkSelfPermission(this.getApplicationContext(), FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
- mLocationPermissionsGranted = true;
- initMap();
- } else {
- ActivityCompat.requestPermissions(this, permissions, LOCATION_PERMISSION_REQUEST_CODE);
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- mLocationPermissionsGranted = false;
-
- switch (requestCode) {
- case LOCATION_PERMISSION_REQUEST_CODE: {
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- mLocationPermissionsGranted = true;
- //initalize or map
- initMap();
- }
- }
- }
- }
-
-
- private void initMap() {
- SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
- mapFragment.getMapAsync(this);
- }
-
- @Override
- public void onMapReady(GoogleMap googleMap) {
- Toast.makeText(this, "Map is ready", Toast.LENGTH_SHORT).show();
- mMap = googleMap;
-
- if (mLocationPermissionsGranted) {
- getDeviceLocation();
-
- if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
- != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
- Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
-
- return;
- }
- mMap.setMyLocationEnabled(true);
- }
-
- // Add a marker in Sydney and move the camera
- //LatLng sydney = new LatLng(-34, 151);
- //mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
- //mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
- }
-
- private void getDeviceLocation(){
- mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
- try {
- if (mLocationPermissionsGranted){
- final Task location = mFusedLocationProviderClient.getLastLocation();
-
- location.addOnCompleteListener(new OnCompleteListener() {
-
- @Override
- public void onComplete(@NonNull Task task) {
- if (task.isSuccessful()){
- currentLocation = (Location) task.getResult();
- //currentTime = Calendar.getInstance().getTime(); //Workaround für Crash: currentTime nicht als Datum sondern als Long zeitstempel
- currentTime = Calendar.getInstance().getTimeInMillis();
- Toast.makeText(EarthquakeMapsActivity.this, currentTime.toString(), Toast.LENGTH_SHORT).show();
- currentLocation.setLatitude(breitengrad);
- currentLocation.setLongitude(laengengrad);
- setDataBaseValues(); //TODO Edward: Die Funktion geht jetzt. Statt Datum wird Unix Zeitstempel als Long Typ verwendet
- moveCamera(new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()),15f);
- }
- else{
- Toast.makeText(EarthquakeMapsActivity.this, "Current Location unavailable", Toast.LENGTH_SHORT).show();
- }
- }
- });
- }
- }catch (SecurityException e){
- Log.e(TAG,"Device Location not found" + e.getMessage());
- }
- }
-
- private void moveCamera(LatLng latlng, float zoom){
- Log.d(TAG,"Latitude: "+latlng.latitude+"Longitude: "+latlng.longitude);
- mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, zoom));
- }
-
-
-
- public void getDataBaseValues()
- {
- mDatenbank = FirebaseDatabase.getInstance().getReference();
- mDatenbank.addValueEventListener(new ValueEventListener() {
- @Override
- public void onDataChange(@NonNull DataSnapshot snapshot) {
- processDataBaseValues(snapshot); //Daten Snapshot, Übergabe an processDataBaseValues
- }
- @Override
- public void onCancelled(@NonNull DatabaseError error) {
- getDataBaseFailure(error);
- }
- });
- }
-
- public void processDataBaseValues (DataSnapshot data)
- {
- //####### Hier wird beispielweise mit IDG1 gearbeitet, sollte aber klüger ausgearbeitet werden #######:
- String breitengradString = data.child("overview").child("IDG1").child("breitengrad").getValue().toString(); //TODO Aron/Team: Idee für passende ID je nach zugreifendem Gerät ==> Hardcoded oder flexibel?
- String laengengradString = data.child("overview").child("IDG1").child("laengengrad").getValue().toString();
- breitengrad = Double.parseDouble(breitengradString);
- laengengrad = Double.parseDouble(laengengradString);
- }
-
- public void getDataBaseFailure (DatabaseError error)
- {
- System.out.println("Fehler");
- Log.w("Datenbankfehler", error.toException());
- }
-
-
- //TODO Edward: Hier ist eine beispielhafte Methode mit der du Werte in der Datenbank setzen kannst
- public void setDataBaseValues()
- {
- mDatenbank = FirebaseDatabase.getInstance().getReference();
- mDatenbank.child("overview").child("IDG1").child("ip").setValue("10.00.00.001");
- mDatenbank.child("overview").child("IDG1").child("vibration").setValue(true);
- mDatenbank.child("overview").child("IDG1").child("timestamp").setValue(currentTime); //aktueller Zeitstempel wird in Datenbank eingetragen
- mDatenbank.child("overview").child("IDG1").child("breitengrad").setValue(currentLocation.getLatitude()); //aktueller Breitengrad
- mDatenbank.child("overview").child("IDG1").child("laengengrad").setValue(currentLocation.getLongitude()); //aktueller Längergrad
- mDatenbank.child("overview").child("IDG1").child("amplitude").setValue(1001);
- }
- }
|