├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── drawable-hdpi
│ │ │ │ └── ic_stat.png
│ │ │ ├── drawable-mdpi
│ │ │ │ └── ic_stat.png
│ │ │ ├── drawable-xhdpi
│ │ │ │ └── ic_stat.png
│ │ │ ├── drawable-xxhdpi
│ │ │ │ └── ic_stat.png
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ │ └── ic_stat.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── values
│ │ │ │ ├── styles.xml
│ │ │ │ ├── arrays.xml
│ │ │ │ └── strings.xml
│ │ │ ├── layout
│ │ │ │ ├── dialog_aprsfilter.xml
│ │ │ │ ├── fragment_maps.xml
│ │ │ │ ├── rowlayout.xml
│ │ │ │ └── dialog_aircraft.xml
│ │ │ ├── menu
│ │ │ │ ├── manageid_menu.xml
│ │ │ │ └── main_menu.xml
│ │ │ └── xml
│ │ │ │ └── preferences.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── meisterschueler
│ │ │ │ └── ognviewer
│ │ │ │ ├── ui
│ │ │ │ ├── AircraftDialogCallback.java
│ │ │ │ ├── CustomAircraftDescriptorAdapter.java
│ │ │ │ ├── AircraftDialog.java
│ │ │ │ ├── ManageIDsFragment.java
│ │ │ │ └── PrefsFragment.java
│ │ │ │ ├── network
│ │ │ │ └── flightpath
│ │ │ │ │ ├── FlightPathApi.java
│ │ │ │ │ ├── FlightPath.java
│ │ │ │ │ └── AircraftPosition.java
│ │ │ │ ├── common
│ │ │ │ ├── entity
│ │ │ │ │ ├── AircraftBundle.java
│ │ │ │ │ ├── AircraftDataParcelable.java
│ │ │ │ │ └── Aircraft.java
│ │ │ │ ├── ReceiverBundle.java
│ │ │ │ ├── AircraftDescriptorProviderHelper.java
│ │ │ │ ├── Utils.java
│ │ │ │ ├── FlarmMessagePFLAUSenderTask.java
│ │ │ │ ├── AprsFilterManager.java
│ │ │ │ ├── FlarmMessageSenderTask.java
│ │ │ │ ├── AppConstants.java
│ │ │ │ ├── FlarmMessage.java
│ │ │ │ ├── CustomAircraftDescriptorProvider.java
│ │ │ │ └── ReceiverBeaconImplReplacement.java
│ │ │ │ ├── activity
│ │ │ │ ├── base
│ │ │ │ │ ├── KillBroadcastReceiver.java
│ │ │ │ │ └── BaseActivity.java
│ │ │ │ ├── ClosingActivity.java
│ │ │ │ ├── PrefsActivity.java
│ │ │ │ └── ManageIDsActivity.java
│ │ │ │ ├── CustomAircraftDescriptor.java
│ │ │ │ └── service
│ │ │ │ ├── TcpServer.java
│ │ │ │ └── OgnService.java
│ │ └── AndroidManifest.xml
│ ├── debug
│ │ └── res
│ │ │ └── values
│ │ │ └── google_maps_api.xml
│ ├── release
│ │ └── res
│ │ │ └── values
│ │ │ └── google_maps_api.xml
│ └── test
│ │ └── java
│ │ └── com
│ │ └── meisterschueler
│ │ └── ognviewer
│ │ ├── common
│ │ ├── UtilsTest.java
│ │ └── FlarmMessageTest.java
│ │ └── AprsFilterManagerTest.java
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── ic_stat.zip
├── logo_512.png
├── logo_1024x500.png
├── logo_512_abstand.png
├── logo_512_abstand.zip
├── ogn-logo-vector-2.eps
├── logo_512_transparent.png
├── res
├── drawable-hdpi
│ └── ic_stat.png
├── drawable-mdpi
│ └── ic_stat.png
├── drawable-xhdpi
│ └── ic_stat.png
├── drawable-xxhdpi
│ └── ic_stat.png
└── drawable-xxxhdpi
│ └── ic_stat.png
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .idea
├── runConfigurations.xml
├── gradle.xml
└── codeStyles
│ └── Project.xml
├── gradle.properties
├── LICENSE
├── README.md
├── release-notes.md
├── .gitignore
├── gradlew.bat
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/ic_stat.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/ic_stat.zip
--------------------------------------------------------------------------------
/logo_512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/logo_512.png
--------------------------------------------------------------------------------
/logo_1024x500.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/logo_1024x500.png
--------------------------------------------------------------------------------
/logo_512_abstand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/logo_512_abstand.png
--------------------------------------------------------------------------------
/logo_512_abstand.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/logo_512_abstand.zip
--------------------------------------------------------------------------------
/ogn-logo-vector-2.eps:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/ogn-logo-vector-2.eps
--------------------------------------------------------------------------------
/logo_512_transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/logo_512_transparent.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/res/drawable-hdpi/ic_stat.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/res/drawable-mdpi/ic_stat.png
--------------------------------------------------------------------------------
/res/drawable-xhdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/res/drawable-xhdpi/ic_stat.png
--------------------------------------------------------------------------------
/res/drawable-xxhdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/res/drawable-xxhdpi/ic_stat.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/res/drawable-xxxhdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/res/drawable-xxxhdpi/ic_stat.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/drawable-hdpi/ic_stat.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/drawable-mdpi/ic_stat.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/drawable-xhdpi/ic_stat.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_stat.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_stat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_stat.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meisterschueler/ogn-viewer-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/ui/AircraftDialogCallback.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.ui;
2 |
3 | public interface AircraftDialogCallback {
4 |
5 | public void notifyUpdated();
6 |
7 | }
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Dec 31 18:10:46 CET 2019
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/network/flightpath/FlightPathApi.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.network.flightpath;
2 |
3 | import retrofit2.Call;
4 | import retrofit2.http.GET;
5 | import retrofit2.http.Path;
6 |
7 | public interface FlightPathApi {
8 |
9 | @GET("flightpath/{address}")
10 | Call getFlightPath(@Path("address") String address);
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_aprsfilter.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
12 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/common/entity/AircraftBundle.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common.entity;
2 |
3 | import org.ogn.commons.beacon.AircraftBeacon;
4 | import org.ogn.commons.beacon.AircraftDescriptor;
5 |
6 | public class AircraftBundle {
7 | public AircraftBeacon aircraftBeacon;
8 | public AircraftDescriptor aircraftDescriptor;
9 |
10 | public AircraftBundle(AircraftBeacon aircraftBeacon, AircraftDescriptor aircraftDescriptor) {
11 | this.aircraftBeacon = aircraftBeacon;
12 | this.aircraftDescriptor = aircraftDescriptor;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/network/flightpath/FlightPath.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.network.flightpath;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.List;
6 |
7 | public class FlightPath {
8 |
9 | @SerializedName("address")
10 | private String address;
11 |
12 | @SerializedName("positions")
13 | private List positions;
14 |
15 |
16 | public String getAddress() {
17 | return address;
18 | }
19 |
20 | public List getPositions() {
21 | return positions;
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_maps.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/common/ReceiverBundle.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common;
2 |
3 | import org.ogn.commons.beacon.ReceiverBeacon;
4 |
5 | import java.util.ArrayList;
6 | import java.util.List;
7 |
8 | public class ReceiverBundle {
9 | public ReceiverBeacon receiverBeacon;
10 | public int beaconCount;
11 | static public int maxBeaconCounter;
12 | public List aircrafts;
13 | static public int maxAircraftCounter;
14 |
15 | public ReceiverBundle(ReceiverBeacon receiverBeacon) {
16 | this.receiverBeacon = receiverBeacon;
17 |
18 | this.beaconCount = 0;
19 | this.aircrafts = new ArrayList<>();
20 | }
21 | }
--------------------------------------------------------------------------------
/app/src/main/res/menu/manageid_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/konstantin/Development/android-sdk-macosx/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/network/flightpath/AircraftPosition.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.network.flightpath;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class AircraftPosition {
6 |
7 | @SerializedName("latitude")
8 | private double latitude;
9 |
10 | @SerializedName("longitude")
11 | private double longitude;
12 |
13 | @SerializedName("altitudeInMeters")
14 | private double altitudeInMeters;
15 |
16 |
17 | public double getLatitude() {
18 | return latitude;
19 | }
20 |
21 | public double getLongitude() {
22 | return longitude;
23 | }
24 |
25 | public double getAltitudeInMeters() {
26 | return altitudeInMeters;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/main_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/activity/base/KillBroadcastReceiver.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.activity.base;
2 |
3 | import android.app.Activity;
4 | import android.content.BroadcastReceiver;
5 | import android.content.Context;
6 | import android.content.Intent;
7 |
8 | public class KillBroadcastReceiver extends BroadcastReceiver{
9 | // idea from https://stackoverflow.com/questions/5453206/how-to-close-all-the-activities-of-my-application/5453228#5453228
10 | Activity callbackActivity;
11 |
12 | public KillBroadcastReceiver(Activity activity) {
13 | this.callbackActivity = activity;
14 | }
15 |
16 | @Override
17 | public void onReceive(Context context, Intent intent) {
18 | if (callbackActivity != null) {
19 | callbackActivity.finish();
20 | }
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/debug/res/values/google_maps_api.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 | AIzaSyClTQaIqL0dM-hPs7stZZkWxCiILUmrVQ0
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/release/res/values/google_maps_api.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 | AIzaSyAOVkp9UR_gKUeHDrLaRx71bOp9rfXPjL4
17 |
18 |
19 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 | android.enableJetifier=true
20 | android.useAndroidX=true
21 | org.gradle.jvmargs=-Xmx1536M
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/common/entity/AircraftDataParcelable.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common.entity;
2 |
3 | import android.os.Parcel;
4 | import android.os.Parcelable;
5 |
6 | /**
7 | * Created by Dominik on 20.08.2017.
8 | */
9 |
10 | public class AircraftDataParcelable implements Parcelable {
11 |
12 | protected AircraftDataParcelable(Parcel in) {
13 | }
14 |
15 | public static final Creator CREATOR = new Creator() {
16 | @Override
17 | public AircraftDataParcelable createFromParcel(Parcel in) {
18 | return new AircraftDataParcelable(in);
19 | }
20 |
21 | @Override
22 | public AircraftDataParcelable[] newArray(int size) {
23 | return new AircraftDataParcelable[size];
24 | }
25 | };
26 |
27 | @Override
28 | public int describeContents() {
29 | return 0;
30 | }
31 |
32 | @Override
33 | public void writeToParcel(Parcel dest, int flags) {
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/test/java/com/meisterschueler/ognviewer/common/UtilsTest.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common;
2 |
3 | import com.meisterschueler.ognviewer.common.Utils;
4 |
5 | import org.junit.Assert;
6 | import org.junit.Test;
7 |
8 | public class UtilsTest {
9 | @Test
10 | public void getHue() {
11 | float hue = Utils.getHue(0, 0, 100, 120, 360);
12 | Assert.assertEquals(hue, 120, 0.1);
13 |
14 | hue = Utils.getHue(4, 1, 7, 90, 180);
15 | Assert.assertEquals(hue, 135, 0.1);
16 | }
17 |
18 | @Test
19 | public void getHue_exceed() {
20 | float hue = Utils.getHue(1, 2, 3, 0, 90);
21 | Assert.assertEquals(hue, 0, 0.1);
22 |
23 | hue = Utils.getHue(2, 0, 1, 0, 90);
24 | Assert.assertEquals(hue, 90, 0.1);
25 | }
26 |
27 | @Test
28 | public void getHue_invalid() {
29 | float hue = Utils.getHue(1, 0, 0, 0, 360);
30 | Assert.assertEquals(hue, 0, 0.1);
31 |
32 | hue = Utils.getHue(1, 0, 1, 0, 360);
33 | Assert.assertEquals(hue, 0, 0.1);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/activity/base/BaseActivity.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.activity.base;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.IntentFilter;
5 | import android.os.Bundle;
6 |
7 | import androidx.annotation.Nullable;
8 | import androidx.appcompat.app.AppCompatActivity;
9 |
10 | import com.meisterschueler.ognviewer.common.AppConstants;
11 |
12 | @SuppressLint("Registered")
13 | public class BaseActivity extends AppCompatActivity {
14 |
15 | KillBroadcastReceiver killBroadcastReceiver;
16 |
17 |
18 | @Override
19 | protected void onCreate(@Nullable Bundle savedInstanceState) {
20 | super.onCreate(savedInstanceState);
21 |
22 | killBroadcastReceiver = new KillBroadcastReceiver(this);
23 | registerReceiver(killBroadcastReceiver, new IntentFilter(AppConstants.EMERGENCY_EXIT_INTENT_ACTION_NAME));
24 | }
25 |
26 | @Override
27 | protected void onDestroy() {
28 | super.onDestroy();
29 |
30 | unregisterReceiver(killBroadcastReceiver);
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/common/AircraftDescriptorProviderHelper.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common;
2 |
3 |
4 | import org.ogn.client.OgnClient;
5 | import org.ogn.client.OgnClientFactory;
6 | import org.ogn.commons.beacon.descriptor.AircraftDescriptorProvider;
7 | import org.ogn.commons.db.FileDbDescriptorProvider;
8 | import org.ogn.commons.db.ogn.OgnDb;
9 |
10 | import java.util.Arrays;
11 |
12 | public enum AircraftDescriptorProviderHelper {
13 | INSTANCE;
14 |
15 | private static final AircraftDescriptorProvider adp1 = new CustomAircraftDescriptorProvider();
16 | private static final AircraftDescriptorProvider adp2 = new FileDbDescriptorProvider<>(OgnDb.class);
17 |
18 | public static final AircraftDescriptorProvider getCustomDbAircraftDescriptorProvider() {
19 | return adp1;
20 | }
21 |
22 | public static final AircraftDescriptorProvider getOgnDbAircraftDescriptorProvider() {
23 | return adp2;
24 | }
25 |
26 | public static final OgnClient getOgnClient(String serverName) {
27 | //String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; //TODO: find a workaround 2018-08-26
28 | return OgnClientFactory.getBuilder().descriptorProviders(Arrays.asList(adp1, adp2))
29 | .serverName(serverName).appName("ogn-viewer").appVersion("1.4.5").build();
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/activity/ClosingActivity.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.activity;
2 |
3 | import android.app.Activity;
4 | import android.content.ComponentName;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.content.ServiceConnection;
8 | import android.os.IBinder;
9 |
10 | import com.meisterschueler.ognviewer.common.AppConstants;
11 | import com.meisterschueler.ognviewer.service.OgnService;
12 |
13 | public class ClosingActivity extends Activity {
14 |
15 | private ServiceConnection mConnection = new ServiceConnection() {
16 | public void onServiceConnected(ComponentName className, IBinder binder) {
17 | stopService(new Intent(getBaseContext(), OgnService.class));
18 | Intent exitIntent = new Intent(AppConstants.EMERGENCY_EXIT_INTENT_ACTION_NAME);
19 | sendBroadcast(exitIntent);
20 | finish();
21 | }
22 |
23 | public void onServiceDisconnected(ComponentName className) {
24 | //this only happens when something goes wrong
25 | //it does not happen when activity is paused or destroyed
26 | finish();
27 | }
28 | };
29 |
30 | @Override
31 | protected void onResume() {
32 | super.onResume();
33 | bindService(new Intent(this, OgnService.class), mConnection, Context.BIND_AUTO_CREATE);
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/common/Utils.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common;
2 |
3 | public class Utils {
4 | private final static float METERS_TO_FEET = 3.2808398950131f;
5 | private final static float KMH_TO_MPH = 0.62137119223733f;
6 | private final static float KMH_TO_KT = 0.53995680346039f;
7 | private final static float MS_TO_FPM = 196.8504f;
8 |
9 | public static float getHue(float value, float min, float max, int minColor, int maxColor) {
10 | float hue;
11 | if (min == max || value <= min) {
12 | hue = minColor;
13 | } else if (value > max) {
14 | hue = maxColor;
15 | } else {
16 | float colorValue = (value - min) / (max - min); // from 0.0 to 1.0
17 | hue = minColor + colorValue * (maxColor - minColor);
18 | }
19 |
20 | float result = hue % 360.0f;
21 | if (result >= 360.0 || result < 0) {
22 | result = 0;
23 | }
24 |
25 | return result;
26 | }
27 |
28 | public static float metersToFeet(float meters) {
29 | return meters * METERS_TO_FEET;
30 | }
31 |
32 | public static float kmhToMph(float kmh) {
33 | return kmh * KMH_TO_MPH;
34 | }
35 |
36 | public static float kmhToKt(float kmh) {
37 | return kmh * KMH_TO_KT;
38 | }
39 |
40 | public static float msToFpm(float ms) {
41 | return ms * MS_TO_FPM;
42 | }
43 | }
44 |
45 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/rowlayout.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
15 |
21 |
22 |
23 |
29 |
30 |
31 |
37 |
38 |
39 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/app/src/test/java/com/meisterschueler/ognviewer/AprsFilterManagerTest.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer;
2 |
3 | import com.meisterschueler.ognviewer.common.AprsFilterManager;
4 |
5 | import org.junit.Test;
6 |
7 | import static org.junit.Assert.assertEquals;
8 | import static org.junit.Assert.assertNull;
9 |
10 | public class AprsFilterManagerTest {
11 |
12 | private static final double DELTA = 1e-15;
13 |
14 | @Test
15 | public void simpleIntegers() {
16 | AprsFilterManager.Circle result = AprsFilterManager.parse("r/52/13/100");
17 | assertEquals(result.getLat(), 52, DELTA);
18 | assertEquals(result.getLon(), 13, DELTA);
19 | assertEquals(result.getRadius(), 100, DELTA);
20 | }
21 |
22 | @Test
23 | public void simpleFloats() {
24 | AprsFilterManager.Circle result = AprsFilterManager.parse("r/+52.513/-13.500/100.041");
25 | assertEquals(result.getLat(), 52.513, DELTA);
26 | assertEquals(result.getLon(), -13.500, DELTA);
27 | assertEquals(result.getRadius(), 100.041, DELTA);
28 | }
29 |
30 | @Test
31 | public void uglyFloats() {
32 | AprsFilterManager.Circle result = AprsFilterManager.parse("r/+052./-.500/100");
33 | assertEquals(result.getLat(), 52.0, DELTA);
34 | assertEquals(result.getLon(), -0.500, DELTA);
35 | assertEquals(result.getRadius(), 100.0, DELTA);
36 | }
37 |
38 | @Test
39 | public void invalidFloat() {
40 | AprsFilterManager.Circle result = AprsFilterManager.parse("r//13/100");
41 | assertNull(result);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 29
5 | buildToolsVersion "28.0.3"
6 |
7 | defaultConfig {
8 | applicationId "com.meisterschueler.ognviewer"
9 | minSdkVersion 19
10 | targetSdkVersion 29
11 | versionCode 47
12 | versionName "1.4.5"
13 | }
14 |
15 | buildTypes {
16 | release {
17 | minifyEnabled false
18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19 | }
20 | }
21 | }
22 |
23 | dependencies {
24 | implementation fileTree(include: ['*.jar'], dir: 'libs')
25 | implementation 'com.google.android.gms:play-services-maps:17.0.0'
26 | implementation 'com.google.android.gms:play-services-location:17.0.0'
27 | implementation 'org.ogn:ogn-commons-java:2.0.0-SNAPSHOT'
28 | implementation 'org.ogn:ogn-client-java:1.0.0-SNAPSHOT'
29 | implementation 'com.google.maps.android:android-maps-utils:0.5'
30 | implementation 'co.uk.rushorm:rushandroid:1.2.0' // leave at 1.2.0 to avoid issues 2018-05-15
31 | testImplementation 'junit:junit:4.12'
32 | testImplementation 'org.robolectric:robolectric:4.2.1'
33 | implementation 'com.jakewharton.timber:timber:4.7.1'
34 | implementation "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
35 | implementation "androidx.preference:preference:1.1.0"
36 |
37 | implementation 'com.squareup.retrofit2:retrofit:2.5.0'
38 | implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
39 |
40 | implementation "org.apache.commons:commons-csv:1.5"
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/meisterschueler/ognviewer/common/FlarmMessagePFLAUSenderTask.java:
--------------------------------------------------------------------------------
1 | package com.meisterschueler.ognviewer.common;
2 |
3 | import android.os.AsyncTask;
4 |
5 | import java.io.DataOutputStream;
6 | import java.io.IOException;
7 | import java.net.Socket;
8 |
9 |
10 | public class FlarmMessagePFLAUSenderTask extends AsyncTask