eu.geopaparazzi.core.ui.dialogs.GpsInfoDialogFragment.java Source code

Java tutorial

Introduction

Here is the source code for eu.geopaparazzi.core.ui.dialogs.GpsInfoDialogFragment.java

Source

/*
 * 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");
        }
    }

}