X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FTracker.java;fp=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FTracker.java;h=72042e65750acd4fde90da9e8ae60203a87d603d;hp=0000000000000000000000000000000000000000;hb=79f2677143f85a2807b8d4e297f3617aafbd34da;hpb=6e3c4493cfa8d92d96808d14d1c12abb35ecb442 diff --git a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/Tracker.java b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/Tracker.java new file mode 100644 index 00000000..72042e65 --- /dev/null +++ b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/Tracker.java @@ -0,0 +1,201 @@ +/* + * Copyright © 2020 Keith Packard + * + * 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 2 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, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.AltosDroid; + +import java.lang.ref.WeakReference; +import java.util.*; + +import android.Manifest; +import android.app.Activity; +import android.app.PendingIntent; +import android.bluetooth.BluetoothAdapter; +import android.content.Intent; +import android.content.Context; +import android.content.ComponentName; +import android.content.ServiceConnection; +import android.content.DialogInterface; +import android.os.IBinder; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.os.Parcelable; +import android.os.Parcel; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import android.view.*; +import android.widget.*; +import android.app.AlertDialog; +import android.location.Location; +import android.location.LocationManager; +import android.location.LocationListener; +import android.hardware.usb.*; +import android.content.pm.PackageManager; +import androidx.core.app.ActivityCompat; +import org.altusmetrum.altoslib_13.*; + +public class Tracker implements CharSequence, Comparable, Parcelable { + int serial; + String call; + double frequency; + long received_time; + String display; + + private void make_display() { + if (frequency == 0.0) + display = "Auto"; + else if (frequency == AltosLib.MISSING) { + display = String.format("%-8.8s %6d", call, serial); + } else { + display = String.format("%-8.8s %7.3f %6d", call, frequency, serial); + } + } + + public Tracker(int serial, String call, double frequency, long received_time) { + if (call == null) + call = "none"; + + this.serial = serial; + this.call = call; + this.frequency = frequency; + this.received_time = received_time; + make_display(); + } + + public Tracker(int serial, String call, double frequency) { + this(serial, call, frequency, 0); + } + + public Tracker(AltosState s) { + this(s == null ? 0 : s.cal_data().serial, + s == null ? null : s.cal_data().callsign, + s == null ? 0.0 : s.frequency, + s == null ? 0 : s.received_time); + } + + /* CharSequence */ + public char charAt(int index) { + return display.charAt(index); + } + + public int length() { + return display.length(); + } + + public CharSequence subSequence(int start, int end) throws IndexOutOfBoundsException { + return display.subSequence(start, end); + } + + public String toString() { + return display.toString(); + } + + /* Comparable */ + public int compareTo (Object other) { + Tracker o = (Tracker) other; + if (frequency == 0.0) { + if (o.frequency == 0.0) + return 0; + return -1; + } + if (o.frequency == 0.0) + return 1; + + int a = serial - o.serial; + int b = call.compareTo(o.call); + int c = (int) Math.signum(frequency - o.frequency); + + if (b != 0) + return b; + if (c != 0) + return c; + return a; + } + + /* Parcelable */ + + public int describeContents() { + AltosDebug.debug("describe contents %d", serial); + return 0; + } + + public void writeToParcel(Parcel out, int flags) { + AltosDebug.debug("write to parcel %s", display); + out.writeInt(serial); + out.writeString(call); + out.writeDouble(frequency); + out.writeLong(received_time); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public Tracker createFromParcel(Parcel in) { + AltosDebug.debug("createFromParcel"); + return new Tracker(in); + } + + public Tracker[] newArray(int size) { + AltosDebug.debug("newArray %d", size); + return new Tracker[size]; + } + }; + + /* newer (-1), same (0), older(1) */ + public int compareAge(Tracker o) { + if (received_time == o.received_time) + return 0; + if (received_time == 0) + return -1; + if (o.received_time == 0) + return 1; + if (received_time > o.received_time) + return -1; + return 1; + } + + public int compareCall(Tracker o) { + int v = call.compareTo(o.call); + if (v == 0) + return v; + if (call.equals("auto")) + return -1; + if (o.call.equals("auto")) + return 1; + return v; + } + + public int compareSerial(Tracker o) { + return serial - o.serial; + } + + public int compareFrequency(Tracker o) { + return (int) Math.signum(frequency - o.frequency); + } + + private Tracker(Parcel in) { + serial = in.readInt(); + call = in.readString(); + frequency = in.readDouble(); + received_time = in.readLong(); + make_display(); + AltosDebug.debug("Create from parcel %s", display); + } +} +