/* * Geopaparazzi - Digital field mapping on Android based devices * Copyright (C) 2016 HydroloGIS (www.hydrologis.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package eu.geopaparazzi.core.ui.dialogs; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.hardware.SensorManager; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.View; import android.widget.TextView; import java.text.DecimalFormat; import java.util.Date; import eu.geopaparazzi.library.gps.GpsLoggingStatus; import eu.geopaparazzi.library.gps.GpsServiceStatus; import eu.geopaparazzi.library.gps.GpsServiceUtilities; import eu.geopaparazzi.library.sensors.OrientationSensor; import eu.geopaparazzi.library.util.TimeUtilities; import eu.geopaparazzi.mapsforge.BaseMapSourcesManager; import eu.geopaparazzi.spatialite.database.spatial.core.tables.AbstractSpatialTable; import eu.geopaparazzi.core.R; /** * Dialog to show some gps info and update it. * * @author hydrologis */ public class GpsInfoDialogFragment extends DialogFragment { private TextView gpsInfoTextview; private OrientationSensor orientationSensor; private BroadcastReceiver gpsServiceBroadcastReceiver; @Override public Dialog onCreateDialog(Bundle bundle) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); View gpsinfoDialogView = getActivity().getLayoutInflater().inflate( R.layout.fragment_dialog_gpsinfo, null); builder.setView(gpsinfoDialogView); builder.setTitle(R.string.gps_info_dialog_title); gpsInfoTextview = (TextView) gpsinfoDialogView.findViewById( R.id.gpsinfoTextview); builder.setPositiveButton(R.string.open_gps_settings, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(gpsOptionsIntent); } } ); return builder.create(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); SensorManager sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE); orientationSensor = new OrientationSensor(sensorManager, null); orientationSensor.register(getActivity(), SensorManager.SENSOR_DELAY_NORMAL); gpsServiceBroadcastReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { onGpsServiceUpdate(intent); } }; GpsServiceUtilities.registerForBroadcasts(getActivity(), gpsServiceBroadcastReceiver); GpsServiceUtilities.triggerBroadcast(getActivity()); } @Override public void onDetach() { super.onDetach(); orientationSensor.unregister(); GpsServiceUtilities.unregisterFromBroadcasts(getActivity(), gpsServiceBroadcastReceiver); } private void onGpsServiceUpdate(Intent intent) { GpsServiceStatus lastGpsServiceStatus = GpsServiceUtilities.getGpsServiceStatus(intent); GpsLoggingStatus lastGpsLoggingStatus = GpsServiceUtilities.getGpsLoggingStatus(intent); double[] lastGpsPosition = GpsServiceUtilities.getPosition(intent); float[] lastGpsPositionExtras = GpsServiceUtilities.getPositionExtras(intent); int[] lastGpsStatusExtras = GpsServiceUtilities.getGpsStatusExtras(intent); long lastPositiontime = GpsServiceUtilities.getPositionTime(intent); Context context = getActivity(); String timeString = context.getString(R.string.utctime); String lonString = context.getString(R.string.lon); String latString = context.getString(R.string.lat); String altimString = context.getString(R.string.altim); String azimString = context.getString(R.string.azimuth); String loggingString = context.getString(R.string.text_logging); String acquirefixString = context.getString(R.string.gps_searching_fix); String satellitesString = context.getString(R.string.satellites); String gpsAccuracyString = context.getString(R.string.accuracy_colon); String gpsUnits = " m"; String gpsStatusString = context.getString(R.string.gps_status); String mapString = context.getString(R.string.map); String pathString = context.getString(R.string.path_lc); String boundsString = context.getString(R.string.bounds); String indent = " "; double azimuth = orientationSensor.getAzimuthDegrees(); StringBuilder sb = new StringBuilder(); AbstractSpatialTable selectedMapTable = BaseMapSourcesManager.INSTANCE.getSelectedBaseMapTable(); if (selectedMapTable != null) { String path = selectedMapTable.getDatabasePath(); float[] bounds = selectedMapTable.getTableBounds(); String mapType = selectedMapTable.getMapType(); sb.append(mapString).append(":\n"); sb.append(pathString).append(": ").append(path).append("\n"); sb.append(boundsString).append(":\n"); sb.append(indent).append("s = ").append(bounds[1]).append("\n"); sb.append(indent).append("n = ").append(bounds[0]).append("\n"); sb.append(indent).append("w = ").append(bounds[3]).append("\n"); sb.append(indent).append("e = ").append(bounds[2]).append("\n\n"); } if (lastGpsServiceStatus == GpsServiceStatus.GPS_OFF) { // sb.append(indent).append(nodataString).append("\n"); } else if (lastGpsServiceStatus == GpsServiceStatus.GPS_LISTENING__NO_FIX) { sb.append(gpsStatusString).append(":\n"); sb.append(indent).append(acquirefixString); // if (lastGpsServiceStatus != GpsServiceStatus.GPS_FIX) { // } else { // sb.append(indent).append(gpsonString); // sb.append(": ").append(lastGpsServiceStatus == GpsServiceStatus.GPS_OFF); //$NON-NLS-1$ // } sb.append("\n"); addGpsStatusInfo(lastGpsStatusExtras, sb, satellitesString, indent); } else { sb.append(gpsStatusString).append(":\n"); String lat; String lon; String elev; String time; String acc; if (lastGpsPositionExtras != null) { acc = String.valueOf(lastGpsPositionExtras[0]); } else { acc = " - "; } if (lastGpsPosition != null) { DecimalFormat formatter = new DecimalFormat("0.00000"); //$NON-NLS-1$ lat = formatter.format(lastGpsPosition[1]); lon = formatter.format(lastGpsPosition[0]); elev = String.valueOf((int) lastGpsPosition[2]); time = TimeUtilities.INSTANCE.TIME_FORMATTER_LOCAL.format(new Date(lastPositiontime)); } else { time = " - "; lat = " - "; lon = " - "; elev = " - "; } sb.append(indent).append(timeString); sb.append(" ").append(time); //$NON-NLS-1$ sb.append("\n"); sb.append(indent).append(latString); sb.append(" ").append(lat); //$NON-NLS-1$ sb.append("\n"); sb.append(indent).append(lonString); sb.append(" ").append(lon); //$NON-NLS-1$ sb.append("\n"); sb.append(indent).append(gpsAccuracyString); sb.append(" ").append(acc).append(gpsUnits); //$NON-NLS-1$ sb.append("\n"); sb.append(indent).append(altimString); sb.append(" ").append(elev).append(gpsUnits); //$NON-NLS-1$ sb.append("\n"); sb.append(indent).append(loggingString); sb.append(": ").append(lastGpsLoggingStatus == GpsLoggingStatus.GPS_DATABASELOGGING_ON); //$NON-NLS-1$ sb.append("\n"); addGpsStatusInfo(lastGpsStatusExtras, sb, satellitesString, indent); } sb.append(indent).append(azimString); sb.append(" ").append((int) azimuth); //$NON-NLS-1$ sb.append("\n"); gpsInfoTextview.setText(sb.toString()); } private void addGpsStatusInfo(int[] lastGpsStatusExtras, StringBuilder sb, String satellitesString, String indent) { if (lastGpsStatusExtras != null) { int satForFixCount = lastGpsStatusExtras[2]; int satCount = lastGpsStatusExtras[1]; sb.append(indent).append(satellitesString).append(": ")// .append(satForFixCount).append("/").append(satCount).append("\n"); // sb.append("used for fix: ").append(satForFixCount).append("\n"); } } }