Untitled
unknown
plain_text
3 years ago
14 kB
10
Indexable
package com.example.androidstudio.FittnessApp.ui.main.WindSurf; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.graphics.Color; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import androidx.activity.OnBackPressedCallback; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.view.View; import android.widget.ImageView; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.navigation.fragment.NavHostFragment; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import com.example.androidstudio.FittnessApp.R; public class SurfFragment extends Fragment implements View.OnClickListener, LocationListener , SensorEventListener{ private static final String TAG = "hsfWindFragment"; private Button startBtn; private Button resBtn; /// Location lastloc; //* //**************************** compass ImageView compass_img; TextView txt_compass; int mAzimuth; private SensorManager mSensorManager; private Sensor mRotationV, mAccelerometer, mMagnetometer; boolean haveSensor = false, haveSensor2 = false; float[] rMat = new float[9]; float[] orientation = new float[3]; private float[] mLastAccelerometer = new float[3]; private float[] mLastMagnetometer = new float[3]; private boolean mLastAccelerometerSet = false; private boolean mLastMagnetometerSet = false; //***********************************End compass private TextView speed1 ; private TextView avkurs; private TextView averagespeed; private TextView weg; private TextView timepassed; private TextView kurs; private float speed2 ; double wegtraveled = 0 ; private int sec = 0; private int sse = sec / 15 ; boolean timeStart = false; LocationManager locManager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView(): "); View view = inflater.inflate(R.layout.surf_fragment, container, false); //***************************************** compass mSensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE); compass_img = (ImageView) view.findViewById(R.id.img_compass); txt_compass = (TextView) view.findViewById(R.id.txt_azimuth); startcompass(); //***********************************************************************************************************////****** //********************************************************************************************************************* startBtn = (Button) view.findViewById(R.id.startbtn1); averagespeed = (TextView) view.findViewById(R.id.avaregespeedText); avkurs = (TextView) view.findViewById(R.id.avaregespeedText); weg = (TextView) view.findViewById(R.id.destanceText); timepassed = (TextView) view.findViewById(R.id.durationsurf); resBtn = (Button) view.findViewById(R.id.resetbtn); speed1 = (TextView) view.findViewById(R.id.txtspeed); startBtn.setOnClickListener(this); resBtn.setOnClickListener(this); kurs = (TextView) view.findViewById(R.id.txt_azimuth); OnBackPressedCallback callback = new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { Log.d(TAG, "onBackPressed"); AlertDialog.Builder backAlert = new AlertDialog.Builder(getActivity()); backAlert.setTitle("Training Stop ?"); backAlert.setMessage("would you like to stop surfing ?"); backAlert.setPositiveButton("Yup", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Log.v(TAG, "going back to home"); NavHostFragment.findNavController(getParentFragment()).navigate(R.id.action_action_homeFragment_to_surfFragment_to_homeFragment); } }); backAlert.setNeutralButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); backAlert.show(); } }; requireActivity().getOnBackPressedDispatcher().addCallback(getActivity(), callback); // startTimer(); locManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); // lastLoc = new Location(); return view; } private void startTimer() { final Handler handler = new Handler(); handler.post(new Runnable() { public void run() { int hours = sec / 3600; int mints = (sec % 3600) / 60; int secs = sec % 60; String time = String.format("%02d, %02d, %02d", hours, mints, secs); timepassed.setText(time); if(timeStart){ sec++;} handler.postDelayed(this, 1000); } }); } //********************************compass public void startcompass() { if (mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) == null) { if ((mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) == null) || (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) == null)) { txt_compass.setText("no sensor"); } else { mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); haveSensor = mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI); haveSensor2 = mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_UI); } } else{ mRotationV = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); haveSensor = mSensorManager.registerListener(this, mRotationV, SensorManager.SENSOR_DELAY_UI); } } public void stopCompass() { // sensor if(haveSensor && haveSensor2){ mSensorManager.unregisterListener(this,mAccelerometer); mSensorManager.unregisterListener(this,mMagnetometer); } else{ if(haveSensor) mSensorManager.unregisterListener(this,mRotationV); } } private void stopSensor(){ mSensorManager.unregisterListener(this, mAccelerometer); mSensorManager.unregisterListener(this, mMagnetometer); } @Override public void onLocationChanged(Location location) { if (timeStart) { Log.v(TAG, "onLocationChanged"); getSpeed(location); getDistance(location); } } //****************************** public void getSpeed(Location location) { speed2 = (location.getSpeed() * 3600 / 1000); String convertedSpeed = String.format("%.2f", speed2); speed1.setText(convertedSpeed); } public void onClick(View view){ switch (view.getId()) { case R.id.startbtn1: Log.d(TAG, "onClick.startStop"); if (timeStart == false) { timeStart = true; startBtn.setText("Stop"); startBtn.setBackgroundColor(Color.RED); if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, SurfFragment.this); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// startcompass();//r } } else { timeStart = false; startBtn.setText("Start"); startBtn.setBackgroundColor(Color.BLUE); stopCompass(); } break; case R.id.resetbtn: Log.d(TAG, "onClick.reset"); AlertDialog.Builder resetAlert = new AlertDialog.Builder(getActivity()); resetAlert.setTitle("reset?"); resetAlert.setMessage("Are you SURE You want to reset ?"); resetAlert.setPositiveButton("YUP", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Log.d(TAG, "reset all values"); resetall(); wegtraveled=0; stopSensor(); } }); resetAlert.setNeutralButton("Cancell", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); resetAlert.show(); break; } } public void getDistance(Location userloc) { //ausrechnen der Distanz von der letzten location zur aktuellen location und addieren zur insgesamt zurückgelegten Distanz if(lastloc != null) { // lastloc = new Location(""); //c = currentLocation.getLatitude(); // d = currentLocation.getLongitude(); // wegtraveled += userloc.distanceTo(lastloc) / 100.0; } lastloc =new Location(""); lastloc= userloc; //lastloc.setLatitude(0.0d); // lastloc.setLongitude(0.0d); wegtraveled = (CalculationByDistance( lastloc.getLatitude() , lastloc.getLongitude() ,userloc.getLatitude() , userloc.getLongitude() )) ; weg.setText("" + lastloc.getLatitude()+"" ); } public double CalculationByDistance(double lat1, double lon1, double lat2, double lon2){ final double DEG_RAD = 0.01745329251994; final double R_EARTH = 6367.45; double haversine, distance; double dLat, dLon; dLat = (lat2 - lat1) * DEG_RAD; dLon = (lon2 - lon1) * DEG_RAD; haversine = Math.sin(dLat * 0.5) * Math.sin(dLat * 0.5) + Math.sin(dLon * 0.5) * Math.sin(dLon * 0.5) * Math.cos(lat1 * DEG_RAD) * Math.cos(lat2* DEG_RAD); distance = Math.asin(Math.sqrt(haversine)) * R_EARTH * 2.0; return distance; } // private void resetall() { timeStart = false; sec = 0; wegtraveled = 0; speed1.setText("0"); weg.setText("0"); averagespeed.setText("0"); startBtn.setText("Start"); startBtn.setBackgroundColor(Color.BLUE); } //******************************************compass @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { SensorManager.getRotationMatrixFromVector(rMat, event.values); mAzimuth = (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360; } if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length); mLastAccelerometerSet = true; } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length); mLastMagnetometerSet = true; } if (mLastAccelerometerSet && mLastMagnetometerSet) { SensorManager.getRotationMatrix(rMat, null, mLastAccelerometer, mLastMagnetometer); SensorManager.getOrientation(rMat, orientation); mAzimuth = (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360; } mAzimuth = Math.round(mAzimuth); compass_img.setRotation(-mAzimuth); String where = "NW"; if (mAzimuth >= 350 || mAzimuth <= 10) where = "N"; if (mAzimuth < 350 && mAzimuth > 280) where = "NW"; if (mAzimuth <= 280 && mAzimuth > 260) where = "W"; if (mAzimuth <= 260 && mAzimuth > 190) where = "SW"; if (mAzimuth <= 190 && mAzimuth > 170) where = "S"; if (mAzimuth <= 170 && mAzimuth > 100) where = "SE"; if (mAzimuth <= 100 && mAzimuth > 80) where = "E"; if (mAzimuth <= 80 && mAzimuth > 10) where = "NE"; txt_compass.setText(mAzimuth + "° " + where); } @Override public void onAccuracyChanged(Sensor sensor, int i) { } //******************************************************** }
Editor is loading...