├── .gitignore ├── .gitmodules ├── AUTHORS ├── COPYING ├── LICENSES ├── README.md ├── app ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── audio │ │ └── gong.mp3 │ ├── images │ │ ├── antenna.png │ │ ├── basic_blue.png │ │ ├── basic_green.png │ │ ├── basic_red.png │ │ ├── basic_turquoise.png │ │ ├── basic_yellow.png │ │ ├── container-ship-top.png │ │ ├── flags │ │ │ ├── ab.png │ │ │ ├── ad.png │ │ │ ├── ae.png │ │ │ ├── af.png │ │ │ ├── ag.png │ │ │ ├── ai.png │ │ │ ├── al.png │ │ │ ├── am.png │ │ │ ├── ao.png │ │ │ ├── aq.png │ │ │ ├── ar.png │ │ │ ├── as.png │ │ │ ├── at.png │ │ │ ├── au.png │ │ │ ├── aw.png │ │ │ ├── ax.png │ │ │ ├── az.png │ │ │ ├── ba.png │ │ │ ├── bb.png │ │ │ ├── bd.png │ │ │ ├── be.png │ │ │ ├── bf.png │ │ │ ├── bg.png │ │ │ ├── bh.png │ │ │ ├── bi.png │ │ │ ├── bj.png │ │ │ ├── bl.png │ │ │ ├── bm.png │ │ │ ├── bn.png │ │ │ ├── bo.png │ │ │ ├── bq.png │ │ │ ├── br.png │ │ │ ├── bs.png │ │ │ ├── bt.png │ │ │ ├── bv.png │ │ │ ├── bw.png │ │ │ ├── by.png │ │ │ ├── bz.png │ │ │ ├── ca.png │ │ │ ├── cc.png │ │ │ ├── cd.png │ │ │ ├── cf.png │ │ │ ├── cg.png │ │ │ ├── ch.png │ │ │ ├── ci.png │ │ │ ├── ck.png │ │ │ ├── cl.png │ │ │ ├── cm.png │ │ │ ├── cn.png │ │ │ ├── co.png │ │ │ ├── cr.png │ │ │ ├── cu.png │ │ │ ├── cv.png │ │ │ ├── cw.png │ │ │ ├── cx.png │ │ │ ├── cy.png │ │ │ ├── cz.png │ │ │ ├── de.png │ │ │ ├── dj.png │ │ │ ├── dk.png │ │ │ ├── dm.png │ │ │ ├── do.png │ │ │ ├── dz.png │ │ │ ├── ec.png │ │ │ ├── ee.png │ │ │ ├── eg.png │ │ │ ├── eh.png │ │ │ ├── er.png │ │ │ ├── es.png │ │ │ ├── et.png │ │ │ ├── fi.png │ │ │ ├── fj.png │ │ │ ├── fk.png │ │ │ ├── fm.png │ │ │ ├── fo.png │ │ │ ├── fr.png │ │ │ ├── ga.png │ │ │ ├── gb.png │ │ │ ├── gd.png │ │ │ ├── ge.png │ │ │ ├── gf.png │ │ │ ├── gg.png │ │ │ ├── gh.png │ │ │ ├── gi.png │ │ │ ├── gl.png │ │ │ ├── gm.png │ │ │ ├── gn.png │ │ │ ├── gp.png │ │ │ ├── gq.png │ │ │ ├── gr.png │ │ │ ├── gs.png │ │ │ ├── gt.png │ │ │ ├── gu.png │ │ │ ├── gw.png │ │ │ ├── gy.png │ │ │ ├── hk.png │ │ │ ├── hm.png │ │ │ ├── hn.png │ │ │ ├── hr.png │ │ │ ├── ht.png │ │ │ ├── hu.png │ │ │ ├── id.png │ │ │ ├── ie.png │ │ │ ├── il.png │ │ │ ├── im.png │ │ │ ├── in.png │ │ │ ├── io.png │ │ │ ├── iq.png │ │ │ ├── ir.png │ │ │ ├── is.png │ │ │ ├── it.png │ │ │ ├── je.png │ │ │ ├── jm.png │ │ │ ├── jo.png │ │ │ ├── jp.png │ │ │ ├── ke.png │ │ │ ├── kg.png │ │ │ ├── kh.png │ │ │ ├── ki.png │ │ │ ├── km.png │ │ │ ├── kn.png │ │ │ ├── kp.png │ │ │ ├── kr.png │ │ │ ├── kw.png │ │ │ ├── ky.png │ │ │ ├── kz.png │ │ │ ├── la.png │ │ │ ├── lb.png │ │ │ ├── lc.png │ │ │ ├── li.png │ │ │ ├── lk.png │ │ │ ├── lr.png │ │ │ ├── ls.png │ │ │ ├── lt.png │ │ │ ├── lu.png │ │ │ ├── lv.png │ │ │ ├── ly.png │ │ │ ├── ma.png │ │ │ ├── mc.png │ │ │ ├── md.png │ │ │ ├── me.png │ │ │ ├── mf.png │ │ │ ├── mg.png │ │ │ ├── mh.png │ │ │ ├── mk.png │ │ │ ├── ml.png │ │ │ ├── mm.png │ │ │ ├── mn.png │ │ │ ├── mo.png │ │ │ ├── mp.png │ │ │ ├── mq.png │ │ │ ├── mr.png │ │ │ ├── ms.png │ │ │ ├── mt.png │ │ │ ├── mu.png │ │ │ ├── mv.png │ │ │ ├── mw.png │ │ │ ├── mx.png │ │ │ ├── my.png │ │ │ ├── mz.png │ │ │ ├── na.png │ │ │ ├── nc.png │ │ │ ├── ne.png │ │ │ ├── nf.png │ │ │ ├── ng.png │ │ │ ├── ni.png │ │ │ ├── nl.png │ │ │ ├── no.png │ │ │ ├── np.png │ │ │ ├── nr.png │ │ │ ├── nu.png │ │ │ ├── nz.png │ │ │ ├── om.png │ │ │ ├── pa.png │ │ │ ├── pe.png │ │ │ ├── pf.png │ │ │ ├── pg.png │ │ │ ├── ph.png │ │ │ ├── pk.png │ │ │ ├── pl.png │ │ │ ├── pm.png │ │ │ ├── pn.png │ │ │ ├── pr.png │ │ │ ├── ps.png │ │ │ ├── pt.png │ │ │ ├── pw.png │ │ │ ├── py.png │ │ │ ├── qa.png │ │ │ ├── re.png │ │ │ ├── ro.png │ │ │ ├── rs.png │ │ │ ├── ru.png │ │ │ ├── rw.png │ │ │ ├── sa.png │ │ │ ├── sb.png │ │ │ ├── sc.png │ │ │ ├── sd.png │ │ │ ├── se.png │ │ │ ├── sg.png │ │ │ ├── sh.png │ │ │ ├── si.png │ │ │ ├── sj.png │ │ │ ├── sk.png │ │ │ ├── sl.png │ │ │ ├── sm.png │ │ │ ├── sn.png │ │ │ ├── so.png │ │ │ ├── sr.png │ │ │ ├── ss.png │ │ │ ├── st.png │ │ │ ├── sv.png │ │ │ ├── sx.png │ │ │ ├── sy.png │ │ │ ├── sz.png │ │ │ ├── tc.png │ │ │ ├── td.png │ │ │ ├── tf.png │ │ │ ├── tg.png │ │ │ ├── th.png │ │ │ ├── tj.png │ │ │ ├── tk.png │ │ │ ├── tl.png │ │ │ ├── tm.png │ │ │ ├── tn.png │ │ │ ├── to.png │ │ │ ├── tr.png │ │ │ ├── tt.png │ │ │ ├── tv.png │ │ │ ├── tw.png │ │ │ ├── tz.png │ │ │ ├── ua.png │ │ │ ├── ug.png │ │ │ ├── um.png │ │ │ ├── us.png │ │ │ ├── uy.png │ │ │ ├── uz.png │ │ │ ├── va.png │ │ │ ├── vc.png │ │ │ ├── ve.png │ │ │ ├── vg.png │ │ │ ├── vi.png │ │ │ ├── vn.png │ │ │ ├── vu.png │ │ │ ├── wf.png │ │ │ ├── ws.png │ │ │ ├── xk.png │ │ │ ├── ye.png │ │ │ ├── yt.png │ │ │ ├── za.png │ │ │ ├── zm.png │ │ │ └── zw.png │ │ ├── house.png │ │ ├── passenger.png │ │ ├── sailboat-black-side.png │ │ ├── sailing-yacht_1.png │ │ ├── sailing-yacht_2.png │ │ ├── yacht_1.png │ │ ├── yacht_2.png │ │ ├── yacht_3.png │ │ ├── yacht_4.png │ │ └── yellow_dot.png │ ├── index.html │ ├── openstreetmap │ │ ├── OpenLayers.js │ │ ├── OpenStreetMap.js │ │ ├── extra.css │ │ ├── img │ │ │ ├── blank.gif │ │ │ ├── close.gif │ │ │ ├── cloud-popup-relative.png │ │ │ ├── drag-rectangle-off.png │ │ │ ├── drag-rectangle-on.png │ │ │ ├── east-mini.png │ │ │ ├── layer-switcher-maximize.png │ │ │ ├── layer-switcher-minimize.png │ │ │ ├── marker-blue.png │ │ │ ├── marker-gold.png │ │ │ ├── marker-green.png │ │ │ ├── marker.png │ │ │ ├── measuring-stick-off.png │ │ │ ├── measuring-stick-on.png │ │ │ ├── north-mini.png │ │ │ ├── panning-hand-off.png │ │ │ ├── panning-hand-on.png │ │ │ ├── slider.png │ │ │ ├── south-mini.png │ │ │ ├── west-mini.png │ │ │ ├── zoom-minus-mini.png │ │ │ ├── zoom-plus-mini.png │ │ │ ├── zoom-world-mini.png │ │ │ └── zoombar.png │ │ ├── jquery-3.6.0.min.js │ │ ├── readme.txt │ │ ├── style.css │ │ └── theme │ │ │ └── default │ │ │ └── style.css │ └── ships.js │ ├── ic_launcher-web.png │ ├── java │ ├── dk │ │ └── dma │ │ │ ├── ais │ │ │ ├── binary │ │ │ │ ├── BinArray.java │ │ │ │ ├── SixbitEncoder.java │ │ │ │ └── SixbitException.java │ │ │ ├── message │ │ │ │ ├── AisBinaryMessage.java │ │ │ │ ├── AisMessage.java │ │ │ │ ├── AisMessage1.java │ │ │ │ ├── AisMessage10.java │ │ │ │ ├── AisMessage12.java │ │ │ │ ├── AisMessage13.java │ │ │ │ ├── AisMessage14.java │ │ │ │ ├── AisMessage17.java │ │ │ │ ├── AisMessage18.java │ │ │ │ ├── AisMessage19.java │ │ │ │ ├── AisMessage2.java │ │ │ │ ├── AisMessage21.java │ │ │ │ ├── AisMessage24.java │ │ │ │ ├── AisMessage27.java │ │ │ │ ├── AisMessage3.java │ │ │ │ ├── AisMessage4.java │ │ │ │ ├── AisMessage5.java │ │ │ │ ├── AisMessage6.java │ │ │ │ ├── AisMessage7.java │ │ │ │ ├── AisMessage8.java │ │ │ │ ├── AisMessage9.java │ │ │ │ ├── AisMessageException.java │ │ │ │ ├── AisPosition.java │ │ │ │ ├── AisPositionMessage.java │ │ │ │ ├── AisStaticCommon.java │ │ │ │ ├── AisTargetType.java │ │ │ │ ├── AisUnsupportedMessageType.java │ │ │ │ ├── IPositionMessage.java │ │ │ │ ├── IVesselPositionMessage.java │ │ │ │ ├── NavigationalStatus.java │ │ │ │ ├── ShipTypeCargo.java │ │ │ │ ├── ShipTypeColor.java │ │ │ │ └── binary │ │ │ │ │ ├── AddressedAreaNotice.java │ │ │ │ │ ├── AddressedRouteInformation.java │ │ │ │ │ ├── AisApplicationMessage.java │ │ │ │ │ ├── AreaNotice.java │ │ │ │ │ ├── AsmAcknowledge.java │ │ │ │ │ ├── BroadcastAreaNotice.java │ │ │ │ │ ├── BroadcastIntendedRoute.java │ │ │ │ │ ├── BroadcastRouteInformation.java │ │ │ │ │ ├── Capability.java │ │ │ │ │ ├── MetHyd11.java │ │ │ │ │ ├── RouteExchange.java │ │ │ │ │ ├── RouteInformation.java │ │ │ │ │ ├── RouteMessage.java │ │ │ │ │ ├── RouteSuggestion.java │ │ │ │ │ ├── RouteSuggestionReply.java │ │ │ │ │ ├── SubArea.java │ │ │ │ │ └── UnknownAsm.java │ │ │ ├── packet │ │ │ │ ├── AisPacket.java │ │ │ │ ├── AisPacketParser.java │ │ │ │ └── AisPacketTags.java │ │ │ ├── proprietary │ │ │ │ ├── GatehouseFactory.java │ │ │ │ ├── GatehouseSourceTag.java │ │ │ │ ├── IProprietarySourceTag.java │ │ │ │ ├── IProprietaryTag.java │ │ │ │ └── ProprietaryFactory.java │ │ │ └── sentence │ │ │ │ ├── Abk.java │ │ │ │ ├── Abm.java │ │ │ │ ├── AnySentence.java │ │ │ │ ├── Bbm.java │ │ │ │ ├── CommentBlock.java │ │ │ │ ├── CommentBlockException.java │ │ │ │ ├── CommentBlockLine.java │ │ │ │ ├── EncapsulatedSentence.java │ │ │ │ ├── ParametricSentence.java │ │ │ │ ├── SendSentence.java │ │ │ │ ├── Sentence.java │ │ │ │ ├── SentenceException.java │ │ │ │ ├── SentenceLine.java │ │ │ │ └── Vdm.java │ │ │ └── enav │ │ │ └── model │ │ │ ├── Country.java │ │ │ └── geometry │ │ │ └── Position.java │ └── net │ │ └── videgro │ │ ├── analytics │ │ └── MyFirebaseAnalytics.java │ │ ├── ships │ │ ├── Analytics.java │ │ ├── MyFirebaseMessagingRepeater.java │ │ ├── Notifications.java │ │ ├── Repeater.java │ │ ├── SettingsUtils.java │ │ ├── StartRtlSdrRequest.java │ │ ├── Utils.java │ │ ├── activities │ │ │ ├── AugmentedRealityLocationActivity.kt │ │ │ ├── HelpActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── OpenDeviceActivity.java │ │ │ └── SettingsActivity.java │ │ ├── adapters │ │ │ └── ShipsTableDataAdapter.java │ │ ├── ar │ │ │ └── utils │ │ │ │ ├── AugmentedRealityLocationUtils.kt │ │ │ │ └── PermissionUtils.kt │ │ ├── bridge │ │ │ └── NativeRtlSdr.java │ │ ├── fragments │ │ │ ├── CalibrateFragment.java │ │ │ ├── DeviceDialogFragment.java │ │ │ ├── HelpFragment.java │ │ │ ├── SettingsFragment.java │ │ │ ├── ShowMapFragment.java │ │ │ └── internal │ │ │ │ ├── FragmentUtils.java │ │ │ │ ├── IndicatorAnimation.java │ │ │ │ ├── OpenDeviceResult.java │ │ │ │ └── ShipsTableManager.java │ │ ├── listeners │ │ │ ├── CalibrateListener.java │ │ │ ├── ImagePopupListener.java │ │ │ ├── NmeaReceivedListener.java │ │ │ ├── OwnLocationReceivedListener.java │ │ │ └── ShipReceivedListener.java │ │ ├── nmea2ship │ │ │ ├── AisParser.java │ │ │ ├── Nmea2Ship.java │ │ │ └── domain │ │ │ │ ├── Mid.java │ │ │ │ └── Ship.java │ │ ├── preferences │ │ │ └── PromoPreferenceRateMe.java │ │ ├── services │ │ │ ├── MyFirebaseMessagingService.java │ │ │ ├── NmeaClientService.java │ │ │ ├── RtlSdrAisService.java │ │ │ ├── RtlSdrService.java │ │ │ ├── TrackService.java │ │ │ └── internal │ │ │ │ └── NmeaMessagesCache.java │ │ ├── tasks │ │ │ ├── CalibrateTask.java │ │ │ ├── HttpCacheFifoTask.java │ │ │ ├── NmeaFirebaseMessagingClientTask.java │ │ │ ├── NmeaUdpClientTask.java │ │ │ ├── ProcessCachedMessagesTask.java │ │ │ └── domain │ │ │ │ └── DatagramSocketConfig.java │ │ └── tools │ │ │ └── HttpCacheTileServer.java │ │ └── usb │ │ ├── SupportedDevice.java │ │ ├── UsbUtils.java │ │ └── rtlsdr │ │ ├── RtlSdrDevice.java │ │ ├── RtlSdrDeviceProvider.java │ │ └── RtlSdrDeviceProviderImpl.java │ ├── jni │ ├── CMakeLists.txt │ ├── NativeRtlSdr.cpp │ ├── NativeRtlSdr.h │ ├── NativeRtlSdrUtils.cpp │ ├── NativeRtlSdrUtils.h │ └── native2android.h │ └── res │ ├── drawable-hdpi │ ├── ic_launcher.png │ ├── ic_menu_ar.png │ ├── ic_stat_notification.png │ └── ic_stat_usb.png │ ├── drawable-mdpi │ ├── but_google_play_rate.png │ ├── ic_green_sphere.png │ ├── ic_information.png │ ├── ic_information_ships.png │ ├── ic_launcher.png │ ├── ic_menu_ar.png │ ├── ic_stat_notification.png │ ├── ic_stat_usb.png │ ├── rtlsdr.png │ ├── thumbs_down_circle.png │ ├── thumbs_up_circle.png │ └── warning_icon.png │ ├── drawable-xhdpi │ ├── ic_launcher.png │ ├── ic_menu_ar.png │ ├── ic_stat_notification.png │ └── ic_stat_usb.png │ ├── drawable-xxhdpi │ ├── ic_launcher.png │ ├── ic_menu_ar.png │ ├── ic_stat_notification.png │ └── ic_stat_usb.png │ ├── drawable-xxxhdpi │ ├── ic_launcher.png │ └── ic_menu_ar.png │ ├── drawable │ ├── ar_marker.png │ └── ic_menu_ar.png │ ├── layout │ ├── activity_augmented_reality_location.xml │ ├── activity_main.xml │ ├── augmented_reality_location.xml │ ├── fragment_calibrate.xml │ ├── fragment_help.xml │ ├── fragment_main.xml │ ├── fragment_map.xml │ ├── loading_dialog.xml │ ├── progress.xml │ └── promo_rate_me.xml │ ├── menu │ └── main.xml │ ├── values-v11 │ └── styles.xml │ ├── values-v14 │ └── styles.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ ├── network_security_config.xml │ ├── preferences.xml │ ├── provider_paths.xml │ └── supported_devices.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | # Initial version downloaded from: https://github.com/github/gitignore/blob/master/Android.gitignore (0d8b5f8) 3 | # 4 | # Built application files 5 | *.apk 6 | *.ap_ 7 | 8 | # Files for the ART/Dalvik VM 9 | *.dex 10 | 11 | # Java class files 12 | *.class 13 | 14 | # Generated files 15 | bin/ 16 | gen/ 17 | out/ 18 | 19 | # Gradle files 20 | .gradle/ 21 | build/ 22 | 23 | # Local configuration file (sdk path, etc) 24 | local.properties 25 | 26 | # Proguard folder generated by Eclipse 27 | proguard/ 28 | 29 | # Log Files 30 | *.log 31 | 32 | # Android Studio Navigation editor temp files 33 | .navigation/ 34 | 35 | # Android Studio captures folder 36 | captures/ 37 | 38 | # Intellij 39 | *.iml 40 | .idea/workspace.xml 41 | .idea/tasks.xml 42 | .idea/gradle.xml 43 | .idea/libraries 44 | 45 | # Keystore files 46 | *.jks 47 | 48 | # External native build folder generated in Android Studio 2.2 and later 49 | .externalNativeBuild 50 | 51 | # Google Services (e.g. APIs or Firebase) 52 | google-services.json 53 | 54 | # Freeline 55 | freeline.py 56 | freeline/ 57 | freeline_project_description.json 58 | 59 | # Own additions 60 | /DOWNLOADS/ 61 | /DOC/ 62 | /bin/ 63 | /gen/ 64 | obj/ 65 | *.so 66 | .classpath 67 | .project 68 | .settings 69 | lint.xml 70 | project.properties 71 | private.xml 72 | analytics.xml 73 | .idea 74 | .cxx 75 | 76 | # Crypto keys 77 | /app/src/main/res/raw/*_key 78 | 79 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "app/src/main/jni/rtl-ais"] 2 | path = app/src/main/jni/rtl-ais 3 | url = https://github.com/dgiardini/rtl-ais.git 4 | [submodule "app/src/main/jni/libusb"] 5 | path = app/src/main/jni/libusb 6 | url = https://github.com/libusb/libusb.git 7 | [submodule "app/src/main/jni/rtl-sdr"] 8 | path = app/src/main/jni/rtl-sdr 9 | url = https://github.com/keenerd/rtl-sdr.git 10 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Vincent de Groot 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ships 2 | 3 | VIDEGROs Ships is an Android application which allows you to receive AIS information directly from ships in your neighbourhood using a cheap DVB-T-DAB-FM / RTL-SDR receiver. 4 | 5 | IMPORTANT: You need to have an OTG capable Android device and a DVB-T-DAB-FM / RTL-SDR receiver, otherwise this application is useless. 6 | 7 | It is an all in one application. This means that these 3 features are combined in one: 8 | - Find the parts per million offset (PPM) of your DVB-T-DAB-FM receiver; 9 | - Receive the AIS data from air; 10 | - Plot ships data onto a map (or send it to another application). 11 | 12 | More information: http://blog.videgro.net/2017/01/ships/ 13 | -------------------------------------------------------------------------------- /app/src/main/assets/audio/gong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/audio/gong.mp3 -------------------------------------------------------------------------------- /app/src/main/assets/images/antenna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/antenna.png -------------------------------------------------------------------------------- /app/src/main/assets/images/basic_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/basic_blue.png -------------------------------------------------------------------------------- /app/src/main/assets/images/basic_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/basic_green.png -------------------------------------------------------------------------------- /app/src/main/assets/images/basic_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/basic_red.png -------------------------------------------------------------------------------- /app/src/main/assets/images/basic_turquoise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/basic_turquoise.png -------------------------------------------------------------------------------- /app/src/main/assets/images/basic_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/basic_yellow.png -------------------------------------------------------------------------------- /app/src/main/assets/images/container-ship-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/container-ship-top.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ab.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ad.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ae.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/af.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ag.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ai.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/al.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/am.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ao.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/aq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/aq.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ar.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/as.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/as.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/at.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/au.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/au.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/aw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/aw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ax.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/az.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/az.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ba.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bb.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bd.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/be.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/be.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bh.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bi.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bj.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bo.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bq.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/br.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bs.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bv.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/by.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/by.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/bz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/bz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ca.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cd.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ch.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ci.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ck.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/co.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/co.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cv.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cx.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cy.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/cz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/cz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/de.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/dj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/dj.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/dk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/dk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/dm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/do.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/do.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/dz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/dz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ec.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ee.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/eg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/eg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/eh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/eh.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/er.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/er.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/es.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/et.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/et.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/fi.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/fj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/fj.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/fk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/fk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/fm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/fm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/fo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/fo.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/fr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ga.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gb.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gd.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ge.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gh.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gi.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gp.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gq.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gs.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/gy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/gy.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/hk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/hk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/hm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/hm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/hn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/hr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/hr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ht.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/hu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/hu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/id.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ie.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/il.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/il.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/im.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/im.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/in.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/io.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/iq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/iq.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ir.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/is.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/it.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/je.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/je.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/jm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/jm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/jo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/jo.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/jp.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ke.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kh.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ki.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/km.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kp.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ky.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/kz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/kz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/la.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/la.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lb.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/li.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/li.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ls.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/lv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/lv.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ly.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ma.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/md.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/me.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mh.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ml.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mo.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mp.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mq.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ms.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mv.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mx.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/my.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/mz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/na.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/na.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/nc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/nc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ne.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/nf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/nf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ng.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ni.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/nl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/nl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/no.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/np.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/np.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/nr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/nr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/nu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/nu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/nz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/nz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/om.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/om.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pa.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pe.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ph.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ps.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/pw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/py.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/qa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/qa.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/re.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/re.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ro.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/rs.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ru.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/rw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sa.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sb.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sd.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/se.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sh.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/si.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/si.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sj.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/so.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/so.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ss.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/st.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sv.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sx.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sy.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/sz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/sz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/td.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/td.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/th.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tj.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tl.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/to.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tr.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tv.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/tz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/tz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ua.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ug.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/um.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/us.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/uy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/uy.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/uz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/uz.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/va.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/va.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/vc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/vc.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ve.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/vg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/vg.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/vi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/vi.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/vn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/vn.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/vu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/vu.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/wf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/wf.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ws.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/xk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/xk.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/ye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/ye.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/yt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/yt.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/za.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/za.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/zm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/zm.png -------------------------------------------------------------------------------- /app/src/main/assets/images/flags/zw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/flags/zw.png -------------------------------------------------------------------------------- /app/src/main/assets/images/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/house.png -------------------------------------------------------------------------------- /app/src/main/assets/images/passenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/passenger.png -------------------------------------------------------------------------------- /app/src/main/assets/images/sailboat-black-side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/sailboat-black-side.png -------------------------------------------------------------------------------- /app/src/main/assets/images/sailing-yacht_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/sailing-yacht_1.png -------------------------------------------------------------------------------- /app/src/main/assets/images/sailing-yacht_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/sailing-yacht_2.png -------------------------------------------------------------------------------- /app/src/main/assets/images/yacht_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/yacht_1.png -------------------------------------------------------------------------------- /app/src/main/assets/images/yacht_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/yacht_2.png -------------------------------------------------------------------------------- /app/src/main/assets/images/yacht_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/yacht_3.png -------------------------------------------------------------------------------- /app/src/main/assets/images/yacht_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/yacht_4.png -------------------------------------------------------------------------------- /app/src/main/assets/images/yellow_dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/images/yellow_dot.png -------------------------------------------------------------------------------- /app/src/main/assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ship tracking 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 |
19 |
20 | 21 |
22 | 23 |
24 | 25 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/extra.css: -------------------------------------------------------------------------------- 1 | .olImageLoadError { 2 | /* when OL encounters a 404, don't display the pink image */ 3 | display: none !important; 4 | } 5 | .flag { 6 | width: 20px; 7 | } 8 | 9 | body { 10 | margin: 0; 11 | padding: 0; 12 | } 13 | 14 | /** 15 | * Layer switcher 16 | */ 17 | .olControlLayerSwitcher { 18 | font-size: large; 19 | } 20 | .olAlphaImg{ 21 | width: 30px; 22 | height: 30px; 23 | right: 10px; 24 | } 25 | .olControlAttribution { 26 | bottom: 0em; 27 | } -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/blank.gif -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/close.gif -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/cloud-popup-relative.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/cloud-popup-relative.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/drag-rectangle-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/drag-rectangle-off.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/drag-rectangle-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/drag-rectangle-on.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/east-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/east-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/layer-switcher-maximize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/layer-switcher-maximize.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/layer-switcher-minimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/layer-switcher-minimize.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/marker-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/marker-blue.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/marker-gold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/marker-gold.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/marker-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/marker-green.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/marker.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/measuring-stick-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/measuring-stick-off.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/measuring-stick-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/measuring-stick-on.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/north-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/north-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/panning-hand-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/panning-hand-off.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/panning-hand-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/panning-hand-on.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/slider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/slider.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/south-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/south-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/west-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/west-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/zoom-minus-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/zoom-minus-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/zoom-plus-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/zoom-plus-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/zoom-world-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/zoom-world-mini.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/img/zoombar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/img/zoombar.png -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/readme.txt: -------------------------------------------------------------------------------- 1 | Downloaded from: 2 | 3 | wget http://code.jquery.com/jquery-3.1.1.min.js 4 | wget http://openlayers.org/api/theme/default/style.css 5 | wget http://www.openlayers.org/api/OpenLayers.js 6 | 7 | In 'img'-subdirectory: 8 | 9 | wget http://www.openstreetmap.org/openlayers/img/blank.gif 10 | wget http://www.openstreetmap.org/openlayers/img/cloud-popup-relative.png 11 | wget http://www.openstreetmap.org/openlayers/img/drag-rectangle-off.png 12 | wget http://www.openstreetmap.org/openlayers/img/drag-rectangle-on.png 13 | wget http://www.openstreetmap.org/openlayers/img/east-mini.png 14 | wget http://www.openstreetmap.org/openlayers/img/layer-switcher-maximize.png 15 | wget http://www.openstreetmap.org/openlayers/img/layer-switcher-minimize.png 16 | wget http://www.openstreetmap.org/openlayers/img/marker.png 17 | wget http://www.openstreetmap.org/openlayers/img/marker-blue.png 18 | wget http://www.openstreetmap.org/openlayers/img/marker-gold.png 19 | wget http://www.openstreetmap.org/openlayers/img/marker-green.png 20 | wget http://www.openstreetmap.org/openlayers/img/measuring-stick-off.png 21 | wget http://www.openstreetmap.org/openlayers/img/measuring-stick-on.png 22 | wget http://www.openstreetmap.org/openlayers/img/north-mini.png 23 | wget http://www.openstreetmap.org/openlayers/img/panning-hand-off.png 24 | wget http://www.openstreetmap.org/openlayers/img/panning-hand-on.png 25 | wget http://www.openstreetmap.org/openlayers/img/slider.png 26 | wget http://www.openstreetmap.org/openlayers/img/south-mini.png 27 | wget http://www.openstreetmap.org/openlayers/img/west-mini.png 28 | wget http://www.openstreetmap.org/openlayers/img/zoombar.png 29 | wget http://www.openstreetmap.org/openlayers/img/zoom-minus-mini.png 30 | wget http://www.openstreetmap.org/openlayers/img/zoom-plus-mini.png 31 | wget http://www.openstreetmap.org/openlayers/img/zoom-world-mini.png 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/assets/openstreetmap/theme/default/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/assets/openstreetmap/theme/default/style.css -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/binary/SixbitException.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.binary; 16 | 17 | /** 18 | * Exception class for six bit related errors 19 | */ 20 | public class SixbitException extends Exception { 21 | 22 | private static final long serialVersionUID = 1L; 23 | 24 | public SixbitException(String msg) { 25 | super(msg); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisMessage13.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | import dk.dma.ais.binary.SixbitException; 19 | import dk.dma.ais.sentence.Vdm; 20 | 21 | /** 22 | * AIS message 13 23 | * 24 | * Acknowledge message as defined by ITU-R M.1371-4 25 | * 26 | */ 27 | public class AisMessage13 extends AisMessage7 { 28 | 29 | /** serialVersionUID. */ 30 | private static final long serialVersionUID = 1L; 31 | 32 | public AisMessage13() { 33 | super(13); 34 | } 35 | 36 | public AisMessage13(Vdm vdm) throws AisMessageException, SixbitException { 37 | super(vdm); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisMessage14.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | import dk.dma.ais.binary.BinArray; 19 | import dk.dma.ais.binary.SixbitEncoder; 20 | import dk.dma.ais.binary.SixbitException; 21 | import dk.dma.ais.sentence.Vdm; 22 | 23 | /** 24 | * Safety related broadcast message as defined by ITU-R M.1371-4 25 | */ 26 | public class AisMessage14 extends AisMessage { 27 | 28 | /** serialVersionUID. */ 29 | private static final long serialVersionUID = 1L; 30 | 31 | private int spare; // 2 bit: Spare 32 | private String message; // Max 968 bit - 161 characters 33 | 34 | public AisMessage14() { 35 | super(14); 36 | } 37 | 38 | public AisMessage14(Vdm vdm) throws AisMessageException, SixbitException { 39 | super(vdm); 40 | parse(); 41 | } 42 | 43 | public void parse() throws AisMessageException, SixbitException { 44 | BinArray binArray = vdm.getBinArray(); 45 | if (binArray.getLength() < 40 || binArray.getLength() > 1008) { 46 | throw new AisMessageException("Message " + msgId + " wrong length: " + binArray.getLength()); 47 | } 48 | super.parse(binArray); 49 | this.spare = (int) binArray.getVal(2); 50 | this.message = binArray.getString((binArray.getLength() - 40) / 6); 51 | } 52 | 53 | @Override 54 | public SixbitEncoder getEncoded() { 55 | SixbitEncoder encoder = super.encode(); 56 | encoder.addVal(spare, 2); 57 | encoder.addString(message); 58 | return encoder; 59 | } 60 | 61 | /** 62 | * Set message from a binary array 63 | * 64 | * @param binArray 65 | * @throws SixbitException 66 | */ 67 | public void setMessage(BinArray binArray) throws SixbitException { 68 | message = binArray.getString(binArray.getLength() / 6); 69 | } 70 | 71 | public int getSpare() { 72 | return spare; 73 | } 74 | 75 | public String getMessage() { 76 | return message; 77 | } 78 | 79 | @Override 80 | public String toString() { 81 | StringBuilder builder = new StringBuilder(); 82 | builder.append(super.toString()); 83 | builder.append(", message="); 84 | builder.append(message); 85 | builder.append(", spare="); 86 | builder.append(spare); 87 | builder.append("]"); 88 | return builder.toString(); 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisMessage2.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | import dk.dma.ais.binary.SixbitException; 19 | import dk.dma.ais.sentence.Vdm; 20 | 21 | /** 22 | * AIS message 2 23 | * 24 | * Assigned scheduled position report 25 | * 26 | * This class handles the content of an AIS class A transponders general position report as defined by ITU-R M.1371-4. 27 | * 28 | */ 29 | public class AisMessage2 extends AisMessage1 { 30 | 31 | /** serialVersionUID. */ 32 | private static final long serialVersionUID = 1L; 33 | 34 | public AisMessage2() { 35 | super(2); 36 | } 37 | 38 | public AisMessage2(Vdm vdm) throws AisMessageException, SixbitException { 39 | super(vdm); 40 | } 41 | 42 | @Override 43 | public String toString() { 44 | StringBuilder builder = new StringBuilder(); 45 | builder.append(super.toString()); 46 | builder.append("]"); 47 | return builder.toString(); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisMessage8.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | import dk.dma.ais.binary.BinArray; 19 | import dk.dma.ais.binary.SixbitEncoder; 20 | import dk.dma.ais.binary.SixbitException; 21 | import dk.dma.ais.sentence.Vdm; 22 | 23 | /** 24 | * AIS message 8 25 | * 26 | * Binary broadcast message as defined by ITU-R M.1371-4 27 | * 28 | */ 29 | public class AisMessage8 extends AisBinaryMessage { 30 | 31 | /** serialVersionUID. */ 32 | private static final long serialVersionUID = 1L; 33 | 34 | public AisMessage8() { 35 | super(8); 36 | } 37 | 38 | public AisMessage8(Vdm vdm) throws AisMessageException, SixbitException { 39 | super(vdm); 40 | parse(); 41 | } 42 | 43 | public void parse() throws AisMessageException, SixbitException { 44 | BinArray binArray = vdm.getBinArray(); 45 | if (binArray.getLength() < 56 || binArray.getLength() > 1008) { 46 | throw new AisMessageException("Message " + msgId + " wrong length: " + binArray.getLength()); 47 | } 48 | super.parse(binArray); 49 | this.spare = (int) binArray.getVal(2); 50 | this.dac = (int) binArray.getVal(10); 51 | this.fi = (int) binArray.getVal(6); 52 | this.data = binArray; 53 | } 54 | 55 | @Override 56 | public SixbitEncoder getEncoded() { 57 | SixbitEncoder encoder = super.encode(); 58 | encoder.addVal(spare, 2); 59 | encoder.addVal(dac, 10); 60 | encoder.addVal(fi, 6); 61 | encoder.append(appMessage.getEncoded()); 62 | return encoder; 63 | } 64 | 65 | @Override 66 | public String toString() { 67 | StringBuilder builder = new StringBuilder(); 68 | builder.append(super.toString()); 69 | builder.append("]"); 70 | return builder.toString(); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisMessageException.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | /** 18 | * Exception class relating to AIS message exceptions 19 | */ 20 | public class AisMessageException extends Exception { 21 | 22 | private static final long serialVersionUID = 1L; 23 | 24 | public AisMessageException() {} 25 | 26 | public AisMessageException(String msg) { 27 | super(msg); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisTargetType.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | /** 19 | * An AIS target type 20 | * 21 | * @author Kasper Nielsen 22 | */ 23 | public enum AisTargetType { 24 | 25 | /** A Class A target type. */ 26 | A, 27 | 28 | /** A Class B target type. */ 29 | B, 30 | 31 | /** A Basestation. */ 32 | BS, 33 | 34 | /** Aid To Navigation target. */ 35 | ATON, 36 | 37 | /** A search and rescue target. */ 38 | SART; 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/AisUnsupportedMessageType.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | import dk.dma.ais.binary.SixbitEncoder; 19 | import dk.dma.ais.binary.SixbitException; 20 | import dk.dma.ais.sentence.Vdm; 21 | 22 | /** 23 | * Class to fill in for AIS message classes not yet implemented 24 | */ 25 | public class AisUnsupportedMessageType extends AisMessage { 26 | 27 | /** serialVersionUID. */ 28 | private static final long serialVersionUID = 1L; 29 | 30 | public AisUnsupportedMessageType(Vdm vdm) throws AisMessageException, SixbitException { 31 | super(vdm); 32 | parse(vdm.getBinArray()); 33 | } 34 | 35 | @Override 36 | public SixbitEncoder getEncoded() { 37 | throw new UnsupportedOperationException(); 38 | } 39 | 40 | @Override 41 | public String toString() { 42 | StringBuilder builder = new StringBuilder(); 43 | builder.append(super.toString()); 44 | builder.append(" TO BE IMPLEMENTED "); 45 | builder.append("]"); 46 | return builder.toString(); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/IPositionMessage.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | 18 | /** 19 | * Interface for all messages carrying a the position of the sending target. 20 | */ 21 | public interface IPositionMessage { 22 | 23 | /** 24 | * Get position 25 | * 26 | * @return 27 | */ 28 | AisPosition getPos(); 29 | 30 | /** 31 | * Position accuracy 32 | * 33 | * @return 34 | */ 35 | int getPosAcc(); 36 | 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/IVesselPositionMessage.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | import dk.dma.enav.model.geometry.Position; 18 | 19 | 20 | /** 21 | * Interface to capture the communalities between message 1,2,3 and 18 22 | */ 23 | public interface IVesselPositionMessage extends IPositionMessage { 24 | 25 | /** 26 | * Speed over ground 27 | * 28 | * @return 29 | */ 30 | int getSog(); 31 | 32 | /** 33 | * Course over ground 34 | */ 35 | int getCog(); 36 | 37 | /** 38 | * True heading 39 | * 40 | * @return 41 | */ 42 | int getTrueHeading(); 43 | 44 | /** 45 | * Returns a valid position if this message has a valid position, otherwise null. 46 | * 47 | * @return a valid position if this message has a valid position, otherwise null 48 | */ 49 | Position getValidPosition(); 50 | 51 | /** 52 | * UTC sec 53 | * 54 | * @return 55 | */ 56 | int getUtcSec(); 57 | 58 | /** 59 | * Determine if position is valid 60 | * 61 | * @return 62 | */ 63 | boolean isPositionValid(); 64 | 65 | /** 66 | * Course over ground valid 67 | * 68 | * @return 69 | */ 70 | boolean isCogValid(); 71 | 72 | /** 73 | * Speed over ground valid 74 | * 75 | * @return 76 | */ 77 | boolean isSogValid(); 78 | 79 | /** 80 | * Heading valid 81 | * 82 | * @return 83 | */ 84 | boolean isHeadingValid(); 85 | 86 | /** 87 | * Get raim 88 | * 89 | * @return 90 | */ 91 | int getRaim(); 92 | 93 | } 94 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/NavigationalStatus.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | /** 18 | * Navigational status as used in AisMessages of type 1, 2, and 3 and 19 | * defined in Rec. ITU-R M.1371-4, table 45. 20 | * 21 | * 22 | * 0 = under way using engine, 23 | * 1 = at anchor, 24 | * 2 = not under command, 25 | * 3 = restricted manoeuvrability 26 | * 4 = constrained by her draught, 27 | * 5 = moore 28 | * 6 = aground 29 | * 7 = engaged in fishing 30 | * 8 = under way sailing 31 | * 9 = reserved for future amendment of navigational status for ships carrying DG, HS, or MP, or IMO hazard or pollutant category C, high speed craft (HSC), 32 | * 10 = reserved for future amendment of navigational status for ships carrying dangerous goods (DG), harmful substances (HS) or marine pollutants (MP), or IMO hazard or pollutant category A, wing in grand (WIG); 33 | * 11-13 = reserved for future use, 34 | * 14 = AIS-SART (active), 35 | * 15 = not defined = default (also used by AIS-SART under test) 36 | */ 37 | public enum NavigationalStatus { 38 | 39 | UNDER_WAY_USING_ENGINE(0), 40 | AT_ANCHOR(1), 41 | NOT_UNDER_COMMAND(2), 42 | RESTRICTED_MANOEUVRABILITY(3), 43 | CONSTRAINED_BY_HER_DRAUGHT(4), 44 | MOORED(5), 45 | AGROUND(6), 46 | ENGAGED_IN_FISHING(7), 47 | UNDER_WAY(8), 48 | UNDEFINED(15), 49 | AIS_SART(14) 50 | { 51 | public String prettyStatus() { 52 | return name().replace("_", "-"); 53 | } 54 | }; 55 | 56 | private final int code; 57 | 58 | NavigationalStatus(int code) { 59 | this.code = code; 60 | } 61 | 62 | public int getCode() { 63 | return code; 64 | } 65 | 66 | public static NavigationalStatus get(int intNavigationalStatus) { 67 | for (NavigationalStatus navigationalStatus : NavigationalStatus.values()) { 68 | if (intNavigationalStatus == navigationalStatus.code) { 69 | return navigationalStatus; 70 | } 71 | } 72 | return UNDEFINED; 73 | } 74 | 75 | public String prettyStatus() { 76 | String navStat = name().replace("_", " "); 77 | return navStat.substring(0, 1) + navStat.substring(1).toLowerCase(); 78 | } 79 | 80 | @Override 81 | public String toString() { 82 | return prettyStatus(); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/ShipTypeColor.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message; 16 | 17 | import static java.util.Objects.requireNonNull; 18 | 19 | import java.util.HashMap; 20 | 21 | import dk.dma.ais.message.ShipTypeCargo.ShipType; 22 | 23 | /** 24 | * @author Kasper Nielsen 25 | */ 26 | public enum ShipTypeColor { 27 | BLUE(ShipType.PASSENGER), 28 | GREY(ShipType.UNDEFINED, ShipType.UNKNOWN), 29 | GREEN(ShipType.CARGO), 30 | ORANGE(ShipType.FISHING), 31 | PURPLE(ShipType.SAILING, ShipType.PLEASURE), 32 | RED(ShipType.TANKER), 33 | TURQUOISE, 34 | YELLOW(ShipType.HSC, ShipType.WIG); 35 | 36 | private static final HashMap REVERSE_LOOKUP = new HashMap(); 37 | private final ShipType[] shipTypes; 38 | 39 | static { 40 | for (ShipTypeColor shipTypeColor : ShipTypeColor.values()) { 41 | for (ShipType shipType : shipTypeColor.shipTypes) { 42 | REVERSE_LOOKUP.put(shipType, shipTypeColor); 43 | } 44 | } 45 | } 46 | 47 | private ShipTypeColor(ShipType... shipTypes) { 48 | this.shipTypes = shipTypes; 49 | } 50 | 51 | public ShipType[] getShipTypes() { 52 | return shipTypes; 53 | } 54 | 55 | public static ShipTypeColor getColor(ShipType type) { 56 | //ShipTypeColor c = REVERSE_LOOKUP.get(requireNonNull(type)); // Min API level 19 57 | final ShipTypeColor c = type==null ? null : REVERSE_LOOKUP.get(type); 58 | return c == null ? ShipTypeColor.TURQUOISE : c; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/AddressedAreaNotice.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | import dk.dma.ais.binary.BinArray; 18 | import dk.dma.ais.binary.SixbitException; 19 | 20 | /** 21 | * Addressed area notice ASM 22 | */ 23 | public class AddressedAreaNotice extends AreaNotice { 24 | 25 | public AddressedAreaNotice() { 26 | super(23); 27 | } 28 | 29 | public AddressedAreaNotice(BinArray binArray) throws SixbitException { 30 | super(23, binArray); 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | StringBuilder builder = new StringBuilder(); 36 | builder.append("AddressedAreaNotice ["); 37 | builder.append(super.toString()); 38 | builder.append("]"); 39 | return builder.toString(); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/AddressedRouteInformation.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | import dk.dma.ais.binary.BinArray; 18 | import dk.dma.ais.binary.SixbitException; 19 | 20 | public class AddressedRouteInformation extends RouteInformation { 21 | 22 | public AddressedRouteInformation() { 23 | super(1, 28); 24 | } 25 | 26 | public AddressedRouteInformation(BinArray binArray) throws SixbitException { 27 | super(1, 28, binArray); 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | StringBuilder builder = new StringBuilder(); 33 | builder.append("AddressedRouteInformation ["); 34 | builder.append(super.toString()); 35 | builder.append("]"); 36 | return builder.toString(); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/BroadcastAreaNotice.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | import dk.dma.ais.binary.BinArray; 18 | import dk.dma.ais.binary.SixbitException; 19 | 20 | /** 21 | * Broadcast area notice ASM 22 | */ 23 | public class BroadcastAreaNotice extends AreaNotice { 24 | 25 | public BroadcastAreaNotice() { 26 | super(22); 27 | } 28 | 29 | public BroadcastAreaNotice(BinArray binArray) throws SixbitException { 30 | super(22, binArray); 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | StringBuilder builder = new StringBuilder(); 36 | builder.append("BroadcastAreaNotice ["); 37 | builder.append(super.toString()); 38 | builder.append("]"); 39 | return builder.toString(); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/BroadcastIntendedRoute.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | import dk.dma.ais.binary.BinArray; 18 | import dk.dma.ais.binary.SixbitException; 19 | 20 | /** 21 | * ASM for broadcasting a vessels intended route 22 | */ 23 | public class BroadcastIntendedRoute extends RouteExchange { 24 | 25 | public static final int DAC = 219; 26 | public static final int FI = 1; 27 | 28 | public BroadcastIntendedRoute() { 29 | super(DAC, FI); 30 | } 31 | 32 | public BroadcastIntendedRoute(BinArray binArray) throws SixbitException { 33 | super(DAC, FI, binArray); 34 | } 35 | 36 | @Override 37 | public String toString() { 38 | StringBuilder builder = new StringBuilder(); 39 | builder.append("BroadcastIntendedRoute ["); 40 | builder.append(super.toString()); 41 | builder.append("]"); 42 | return builder.toString(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/BroadcastRouteInformation.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | 18 | import dk.dma.ais.binary.BinArray; 19 | import dk.dma.ais.binary.SixbitException; 20 | 21 | public class BroadcastRouteInformation extends RouteInformation { 22 | 23 | public BroadcastRouteInformation() { 24 | super(1, 27); 25 | } 26 | 27 | public BroadcastRouteInformation(BinArray binArray) throws SixbitException { 28 | super(1, 27, binArray); 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | StringBuilder builder = new StringBuilder(); 34 | builder.append("BroadcastRouteInformation ["); 35 | builder.append(super.toString()); 36 | builder.append("]"); 37 | return builder.toString(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/Capability.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | 18 | import dk.dma.ais.binary.BinArray; 19 | import dk.dma.ais.binary.SixbitEncoder; 20 | import dk.dma.ais.binary.SixbitException; 21 | 22 | /** 23 | * Capability ASM 24 | */ 25 | public class Capability extends AisApplicationMessage { 26 | 27 | private int reqDac; // 10 bits 28 | private int spare; // 70 bits 29 | 30 | public Capability() { 31 | super(1, 3); 32 | } 33 | 34 | public Capability(BinArray binArray) throws SixbitException { 35 | super(1, 3, binArray); 36 | } 37 | 38 | @Override 39 | public SixbitEncoder getEncoded() { 40 | SixbitEncoder encoder = new SixbitEncoder(); 41 | encoder.addVal(reqDac, 10); 42 | encoder.addVal(spare, 70); 43 | return encoder; 44 | } 45 | 46 | @Override 47 | public void parse(BinArray binArray) throws SixbitException { 48 | this.reqDac = (int) binArray.getVal(10); 49 | } 50 | 51 | public int getReqDac() { 52 | return reqDac; 53 | } 54 | 55 | public void setReqDac(int reqDac) { 56 | this.reqDac = reqDac; 57 | } 58 | 59 | public int getSpare() { 60 | return spare; 61 | } 62 | 63 | public void setSpare(int spare) { 64 | this.spare = spare; 65 | } 66 | 67 | @Override 68 | public String toString() { 69 | StringBuilder builder = new StringBuilder(); 70 | builder.append("[Capability: reqDac="); 71 | builder.append(reqDac); 72 | builder.append("]"); 73 | return builder.toString(); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/RouteExchange.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | import dk.dma.ais.binary.BinArray; 18 | import dk.dma.ais.binary.SixbitException; 19 | 20 | /** 21 | * Abstract base class for route information ASM DAC=219, FI=1,2 22 | */ 23 | public abstract class RouteExchange extends RouteMessage { 24 | 25 | public RouteExchange(int dac, int fi) { 26 | super(dac, fi); 27 | } 28 | 29 | public RouteExchange(int dac, int fi, BinArray binArray) throws SixbitException { 30 | super(dac, fi, binArray); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/message/binary/UnknownAsm.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.message.binary; 16 | 17 | 18 | import dk.dma.ais.binary.BinArray; 19 | import dk.dma.ais.binary.SixbitEncoder; 20 | import dk.dma.ais.binary.SixbitException; 21 | import dk.dma.ais.message.AisBinaryMessage; 22 | 23 | /** 24 | * Dummy message that represents an unknown ASM 25 | */ 26 | public class UnknownAsm extends AisApplicationMessage { 27 | 28 | private BinArray binArray; 29 | 30 | public UnknownAsm(int dac, int fi) { 31 | super(dac, fi); 32 | } 33 | 34 | public UnknownAsm(AisBinaryMessage binaryMessage) { 35 | this(binaryMessage.getDac(), binaryMessage.getFi()); 36 | this.binArray = binaryMessage.getData(); 37 | } 38 | 39 | @Override 40 | public void parse(BinArray binArray) throws SixbitException { 41 | this.binArray = binArray; 42 | } 43 | 44 | @Override 45 | public SixbitEncoder getEncoded() { 46 | SixbitEncoder encoder = new SixbitEncoder(); 47 | encoder.append(binArray); 48 | return encoder; 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | StringBuilder builder = new StringBuilder(); 54 | builder.append(super.toString()); 55 | if (binArray != null) { 56 | builder.append(", binary length = "); 57 | builder.append(binArray.size()); 58 | } 59 | builder.append("]"); 60 | return builder.toString(); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/proprietary/GatehouseSourceTag.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.proprietary; 16 | 17 | import java.util.Date; 18 | 19 | import dk.dma.enav.model.Country; 20 | 21 | 22 | /** 23 | * An implementation of a IProprietarySourceTag for Gatehouse source tag 24 | */ 25 | //@Immutable 26 | public class GatehouseSourceTag implements IProprietarySourceTag { 27 | 28 | private final Integer baseMmsi; 29 | private final Country country; 30 | private final String region; 31 | private final Date timestamp; 32 | private final String orgSentence; 33 | 34 | public GatehouseSourceTag(Integer baseMmsi, Country country, String region, Date timestamp, String orgSentence) { 35 | this.baseMmsi = baseMmsi; 36 | this.country = country; 37 | this.region = region; 38 | this.timestamp = timestamp; 39 | this.orgSentence = orgSentence; 40 | } 41 | 42 | public Integer getBaseMmsi() { 43 | return baseMmsi; 44 | } 45 | 46 | public Country getCountry() { 47 | return country; 48 | } 49 | 50 | public String getRegion() { 51 | return region; 52 | } 53 | 54 | public Date getTimestamp() { 55 | return timestamp; 56 | } 57 | 58 | public String getSentence() { 59 | return orgSentence; 60 | } 61 | 62 | @Override 63 | public String toString() { 64 | StringBuilder builder = new StringBuilder(); 65 | builder.append("GatehouseSourceTag [baseMmsi="); 66 | builder.append(baseMmsi); 67 | builder.append(", country="); 68 | builder.append(country != null ? country.getTwoLetter() : "null"); 69 | builder.append(", region="); 70 | builder.append(region); 71 | builder.append(", timestamp="); 72 | builder.append(timestamp); 73 | builder.append("]"); 74 | return builder.toString(); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/proprietary/IProprietarySourceTag.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.proprietary; 16 | 17 | import java.util.Date; 18 | 19 | import dk.dma.enav.model.Country; 20 | 21 | 22 | 23 | /** 24 | * Interface for proprietary source tags 25 | */ 26 | public interface IProprietarySourceTag extends IProprietaryTag { 27 | 28 | /** 29 | * Time of message receival at source 30 | * 31 | * @return 32 | */ 33 | Date getTimestamp(); 34 | 35 | /** 36 | * Country origin of message 37 | * 38 | * @return 39 | */ 40 | Country getCountry(); 41 | 42 | /** 43 | * Unique region identifier 44 | * 45 | * @return 46 | */ 47 | String getRegion(); 48 | 49 | /** 50 | * Base station MMSI 51 | * 52 | * @return 53 | */ 54 | Integer getBaseMmsi(); 55 | 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/proprietary/IProprietaryTag.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.proprietary; 16 | 17 | /** 18 | * Interface for general proprietary tags 19 | */ 20 | public interface IProprietaryTag { 21 | 22 | /** 23 | * Get the original sentence 24 | * 25 | * @return 26 | */ 27 | String getSentence(); 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/proprietary/ProprietaryFactory.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.proprietary; 16 | 17 | import static java.util.Objects.requireNonNull; 18 | 19 | import java.util.Collection; 20 | import java.util.Collections; 21 | import java.util.HashMap; 22 | import java.util.Map; 23 | import java.util.ServiceLoader; 24 | 25 | import dk.dma.ais.sentence.SentenceLine; 26 | 27 | /** 28 | * 29 | * @author Kasper Nielsen 30 | */ 31 | public abstract class ProprietaryFactory { 32 | 33 | static Map ALL_FACTORIES; 34 | 35 | static { 36 | Map map = new HashMap(); 37 | for (ProprietaryFactory f : ServiceLoader.load(ProprietaryFactory.class)) { 38 | // We should probably check that we do not have two factories with the same name 39 | map.put(f.prefix, f); 40 | } 41 | ALL_FACTORIES = Collections.unmodifiableMap(map); 42 | } 43 | 44 | private final String prefix; 45 | 46 | public ProprietaryFactory(String prefix) { 47 | //this.prefix = requireNonNull(prefix); // Min API level 19 48 | this.prefix=prefix; 49 | 50 | if (prefix==null || prefix.length() != 3) { 51 | throw new IllegalArgumentException("Prefix length must be exactly 3, was '" + prefix + "'"); 52 | } 53 | } 54 | 55 | public String getPrefix() { 56 | return prefix; 57 | } 58 | 59 | /** 60 | * Return the tag for line, if matches, otherwise null is returned 61 | * 62 | * @param sl 63 | * @return 64 | */ 65 | public abstract IProprietaryTag getTag(SentenceLine sl); 66 | 67 | public static Collection getAllFactories() { 68 | return ALL_FACTORIES.values(); 69 | } 70 | 71 | public static IProprietaryTag parseTag(SentenceLine sl) { 72 | ProprietaryFactory psf = match(sl.getSentenceHead()); 73 | return psf == null ? null : psf.getTag(sl); 74 | } 75 | 76 | public static boolean isProprietaryTag(String line) { 77 | return line != null && line.length() >= 5 && line.startsWith("$P"); 78 | } 79 | 80 | public static ProprietaryFactory match(String line) { 81 | if (isProprietaryTag(line)) { 82 | String p = line.substring(2, 5); 83 | return ALL_FACTORIES.get(p); 84 | } 85 | return null; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/sentence/AnySentence.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.sentence; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | import dk.dma.ais.binary.SixbitException; 21 | 22 | 23 | /** 24 | * Class to represent any sentence 25 | */ 26 | public class AnySentence extends Sentence { 27 | 28 | List anyFields = new ArrayList(); 29 | 30 | @Override 31 | public int parse(SentenceLine sl) throws SentenceException, SixbitException { 32 | // Do common parsing 33 | super.baseParse(sl); 34 | return 0; 35 | } 36 | 37 | @Override 38 | public String getEncoded() { 39 | super.encode(); 40 | // Collections.copy(encodedFields, anyFields); 41 | for (String field : anyFields) { 42 | encodedFields.add(field); 43 | } 44 | return super.finalEncode(); 45 | } 46 | 47 | public void addField(String field) { 48 | anyFields.add(field); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/sentence/CommentBlockException.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.sentence; 16 | 17 | /** 18 | * Comment block exception 19 | */ 20 | public class CommentBlockException extends Exception { 21 | 22 | private static final long serialVersionUID = 1L; 23 | 24 | public CommentBlockException(String msg) { 25 | super(msg); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/sentence/ParametricSentence.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.sentence; 16 | 17 | /** 18 | * Abstract base class for parametric sentences like Abk 19 | */ 20 | public abstract class ParametricSentence extends Sentence { 21 | 22 | /** 23 | * Base parse method to be used by extending classes 24 | */ 25 | @Override 26 | protected void baseParse(SentenceLine sl) throws SentenceException { 27 | super.baseParse(sl); 28 | 29 | // Should at least have three fields 30 | if (sl.getFields().size() < 3) { 31 | throw new SentenceException("Sentence have less than three fields"); 32 | } 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/ais/sentence/SentenceException.java: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2011 Danish Maritime Authority. 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | package dk.dma.ais.sentence; 16 | 17 | import java.util.Deque; 18 | 19 | 20 | 21 | /** 22 | * Exception class for exceptions related to sentences 23 | */ 24 | public class SentenceException extends Exception { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | public SentenceException() { 29 | } 30 | 31 | public SentenceException(String msg) { 32 | super(msg); 33 | } 34 | 35 | private static String join(Deque sentenceTrace){ 36 | StringBuilder sb=new StringBuilder(); 37 | for (String l: sentenceTrace){ 38 | if (sb.length()>0) sb.append("\n"); 39 | sb.append(l); 40 | } 41 | return sb.toString(); 42 | } 43 | 44 | public SentenceException(String msg, Deque sentenceTrace) { 45 | this(msg + "\nSentence trace:\n---\n" + join(sentenceTrace) + "\n---\n"); 46 | } 47 | 48 | public SentenceException(SentenceException e, Deque sentenceTrace) { 49 | this(e.getMessage(), sentenceTrace); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/dk/dma/enav/model/geometry/Position.java: -------------------------------------------------------------------------------- 1 | package dk.dma.enav.model.geometry; 2 | 3 | /** 4 | * Created by andreas on 28.12.14. 5 | */ 6 | public class Position { 7 | private double longitude; 8 | private double latitude; 9 | public Position(double lat,double lon){ 10 | latitude=lat; 11 | longitude=lon; 12 | } 13 | 14 | public double getLongitude() { 15 | return longitude; 16 | } 17 | 18 | public double getLatitude() { 19 | return latitude; 20 | } 21 | public static boolean isValid(double latitude, double longitude) { 22 | return latitude <= 90 && latitude >= -90 && longitude <= 180 && longitude >= -180; 23 | } 24 | public static Position create( double latitude, double longitude) { 25 | return new Position(latitude, longitude); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/analytics/MyFirebaseAnalytics.java: -------------------------------------------------------------------------------- 1 | package net.videgro.analytics; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import com.google.firebase.analytics.FirebaseAnalytics; 7 | 8 | public class MyFirebaseAnalytics { 9 | private static FirebaseAnalytics firebaseAnalytics=null; 10 | 11 | private static FirebaseAnalytics getFirebaseAnalyticsInstance(final Context context) { 12 | if (firebaseAnalytics == null) { 13 | firebaseAnalytics = FirebaseAnalytics.getInstance(context); 14 | } 15 | return firebaseAnalytics; 16 | } 17 | 18 | public static void logEvent(final Context context, final String category, final String action, final String label) { 19 | final Bundle bundle = new Bundle(); 20 | bundle.putString(FirebaseAnalytics.Param.ITEM_CATEGORY,category); 21 | bundle.putString(FirebaseAnalytics.Param.ITEM_NAME,label); 22 | getFirebaseAnalyticsInstance(context).logEvent(action.replaceAll(" ","_").replaceAll("-",""), bundle); 23 | } 24 | 25 | public static void logEvent(final Context context, final String category, final String action, final String label, final long value) { 26 | final Bundle bundle = new Bundle(); 27 | bundle.putString(FirebaseAnalytics.Param.ITEM_CATEGORY,category); 28 | bundle.putString(FirebaseAnalytics.Param.ITEM_NAME,label); 29 | bundle.putString(FirebaseAnalytics.Param.VALUE,""+value); 30 | getFirebaseAnalyticsInstance(context).logEvent(action.replaceAll(" ","_").replaceAll("-",""), bundle); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/Analytics.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships; 2 | 3 | import android.content.Context; 4 | 5 | import net.videgro.analytics.MyFirebaseAnalytics; 6 | 7 | public final class Analytics { 8 | /* Package protected */ 9 | static final String CATEGORY_WARNINGS="Warnings"; 10 | public static final String CATEGORY_ERRORS="Errors"; 11 | public static final String CATEGORY_STATISTICS="Statistics"; 12 | public static final String CATEGORY_ANDROID_DEVICE="Device (Android)"; 13 | public static final String CATEGORY_RTLSDR_DEVICE="Device (RTL-SDR)"; 14 | public static final String CATEGORY_NMEA_REPEAT="NMEA Repeat"; 15 | public static final String CATEGORY_AR="AR"; 16 | public static final String CATEGORY_AR_ERRORS="AR Errors"; 17 | 18 | private Analytics(){ 19 | // Utility class, no public constructor 20 | } 21 | 22 | private static String cleanup(final String raw){ 23 | // letters, digits or _ (underscores) 24 | // Maximum length 40 25 | final int maxLength=40; 26 | 27 | String result=raw; 28 | if (result!=null) { 29 | result = result.replaceAll("[^a-zA-Z0-9]", "_"); 30 | if (result.length() > maxLength) { 31 | result = result.substring(0, maxLength - 1); 32 | } 33 | } else { 34 | result=""; 35 | } 36 | 37 | return result; 38 | } 39 | 40 | public static synchronized void logEvent(final Context context,final String category,final String action,final String label) { 41 | MyFirebaseAnalytics.logEvent(context, category, cleanup(action), cleanup(label)); 42 | } 43 | 44 | public static synchronized void logEvent(final Context context,final String category,final String action,final String label,final long value){ 45 | MyFirebaseAnalytics.logEvent(context, category, cleanup(action), cleanup(label), value); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/Repeater.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships; 2 | 3 | import android.content.Context; 4 | import android.util.Log; 5 | 6 | import net.videgro.ships.tasks.domain.DatagramSocketConfig; 7 | 8 | import java.io.IOException; 9 | import java.net.DatagramPacket; 10 | import java.net.DatagramSocket; 11 | import java.net.InetAddress; 12 | import java.util.List; 13 | 14 | public class Repeater { 15 | private static final String TAG = "Repeater"; 16 | 17 | private final Context context; 18 | private final List repeaters; 19 | private final boolean mustRepeatToCloud; 20 | private final MyFirebaseMessagingRepeater myFirebaseMessagingRepeater; 21 | 22 | public Repeater(final Context context,final List repeaters,final boolean mustRepeatToCloud){ 23 | this.context=context; 24 | this.repeaters=repeaters; 25 | this.mustRepeatToCloud=mustRepeatToCloud; 26 | myFirebaseMessagingRepeater=new MyFirebaseMessagingRepeater(context); 27 | } 28 | 29 | public Context getContext() { 30 | return context; 31 | } 32 | 33 | /** 34 | * Repeat NMEA to other host(s) via UDP 35 | * @param nmea The NMEA sentence to repeat 36 | */ 37 | public void repeatViaUdp(final String nmea){ 38 | final String tag="repeatViaUdp - "; 39 | 40 | // Repeat to other host(s) via UDP 41 | for (final DatagramSocketConfig repeater : repeaters) { 42 | if (repeater != null) { 43 | try { 44 | final DatagramSocket serverSocketRepeater = new DatagramSocket(); 45 | final byte[] nmeaAsByteArray = nmea.getBytes(); 46 | final DatagramPacket packet = new DatagramPacket(nmeaAsByteArray, nmeaAsByteArray.length, InetAddress.getByName(repeater.getAddress()), repeater.getPort()); 47 | serverSocketRepeater.send(packet); 48 | } catch (IllegalArgumentException e) { 49 | Analytics.logEvent(context, Analytics.CATEGORY_ERRORS, tag, e.getMessage()); 50 | } catch (IOException e) { 51 | Log.e(TAG, tag, e); 52 | } 53 | } 54 | } 55 | } 56 | 57 | /** 58 | * Repeat NMEA o cloud (Firebase) 59 | * Will be send asynchronous in batches 60 | * @param nmea The NMEA sentence to repeat 61 | */ 62 | public void repeatToCloud(final String nmea) { 63 | if (mustRepeatToCloud) { 64 | myFirebaseMessagingRepeater.broadcast(nmea); 65 | } 66 | } 67 | 68 | public void stopFirebaseMessaging(){ 69 | myFirebaseMessagingRepeater.stop(); 70 | } 71 | 72 | public void startFirebaseMessaging(){ 73 | myFirebaseMessagingRepeater.start(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/StartRtlSdrRequest.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships; 2 | 3 | public class StartRtlSdrRequest { 4 | private final String args; 5 | private final int fd; 6 | private final String uspfsPath; 7 | 8 | public StartRtlSdrRequest(String args, int fd, String uspfsPath) { 9 | this.args = args; 10 | this.fd = fd; 11 | this.uspfsPath = uspfsPath; 12 | } 13 | 14 | public String getArgs() { 15 | return args; 16 | } 17 | 18 | public int getFd() { 19 | return fd; 20 | } 21 | 22 | public String getUspfsPath() { 23 | return uspfsPath; 24 | } 25 | 26 | @Override 27 | public String toString() { 28 | return "StartRtlSdrRequest [args=" + args + ", fd=" + fd + ", uspfsPath=" + uspfsPath + "]"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/activities/HelpActivity.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.activities; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.appcompat.app.AppCompatActivity; 6 | 7 | import net.videgro.ships.fragments.HelpFragment; 8 | 9 | public class HelpActivity extends AppCompatActivity { 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | 14 | // Display the fragment as the main content. 15 | getSupportFragmentManager().beginTransaction().replace(android.R.id.content,new HelpFragment()).commit(); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/activities/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.activities; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.preference.PreferenceManager; 8 | import android.view.View; 9 | import net.videgro.ships.Analytics; 10 | import net.videgro.ships.R; 11 | import net.videgro.ships.fragments.SettingsFragment; 12 | 13 | public class SettingsActivity extends Activity { 14 | private static final String TAG="SettingsActivity"; 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | 20 | // Display the fragment as the main content. 21 | getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); 22 | PreferenceManager.setDefaultValues(this, R.xml.preferences, false); 23 | } 24 | 25 | public void onRequestRateClicked(View view){ 26 | Analytics.logEvent(this,TAG, "onRequestRateClicked", "gotoGooglePlay"); 27 | view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(view.getContext().getString(R.string.app_market_url)))) ; 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/ar/utils/PermissionUtils.kt: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.ar.utils 2 | 3 | import android.Manifest 4 | import android.app.Activity 5 | import android.content.Intent 6 | import android.content.pm.PackageManager 7 | import android.net.Uri 8 | import android.provider.Settings 9 | import androidx.core.app.ActivityCompat 10 | 11 | object PermissionUtils { 12 | private const val MULTIPLE_PERMISSION_CODE = 1 13 | private const val CAMERA_PERMISSION = Manifest.permission.CAMERA 14 | private val permissions = arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION) 15 | 16 | fun hasLocationAndCameraPermissions(activity: Activity): Boolean { 17 | permissions.forEach { permission -> 18 | if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { 19 | return false 20 | } 21 | } 22 | return true 23 | } 24 | 25 | fun requestCameraAndLocationPermissions(activity: Activity) { 26 | ActivityCompat.requestPermissions( 27 | activity, permissions, MULTIPLE_PERMISSION_CODE) 28 | } 29 | 30 | fun shouldShowRequestPermissionRationale(activity: Activity): Boolean { 31 | return ActivityCompat.shouldShowRequestPermissionRationale(activity, CAMERA_PERMISSION) 32 | } 33 | 34 | fun launchPermissionSettings(activity: Activity) { 35 | val intent = Intent() 36 | intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS 37 | intent.data = Uri.fromParts("package", activity.packageName, null) 38 | activity.startActivity(intent) 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/fragments/HelpFragment.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.fragments; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.os.Bundle; 5 | import android.text.Html; 6 | import android.text.method.LinkMovementMethod; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.RelativeLayout; 11 | import android.widget.TextView; 12 | 13 | import androidx.fragment.app.Fragment; 14 | 15 | import net.videgro.ships.R; 16 | import net.videgro.ships.Utils; 17 | 18 | public class HelpFragment extends Fragment { 19 | private static final String TAG = "HelpFragment"; 20 | 21 | private RelativeLayout adView; 22 | 23 | @SuppressLint("NewApi") 24 | @Override 25 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | final View rootView = inflater.inflate(R.layout.fragment_help, container, false); 29 | 30 | final TextView textView = (TextView)rootView.findViewById(R.id.textViewHelp); 31 | textView.setText(Html.fromHtml(getString(R.string.text_help))); 32 | textView.setMovementMethod(LinkMovementMethod.getInstance()); 33 | 34 | final RelativeLayout adView = rootView.findViewById(R.id.adView); 35 | 36 | if (isAdded()) { 37 | Utils.loadAd(getActivity(),adView,getString(R.string.adUnitId_HelpFragment)); 38 | } 39 | 40 | return rootView; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/fragments/internal/IndicatorAnimation.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.fragments.internal; 2 | 3 | import android.view.animation.AccelerateInterpolator; 4 | import android.view.animation.AlphaAnimation; 5 | import android.view.animation.Animation; 6 | import android.view.animation.AnimationSet; 7 | import android.view.animation.DecelerateInterpolator; 8 | 9 | public class IndicatorAnimation extends AnimationSet { 10 | private final static int DURATION=1000; 11 | 12 | public IndicatorAnimation(boolean shareInterpolator) { 13 | super(shareInterpolator); 14 | 15 | final Animation fadeIn = new AlphaAnimation(0,1); 16 | fadeIn.setInterpolator(new DecelerateInterpolator()); 17 | fadeIn.setDuration(DURATION); 18 | 19 | final Animation fadeOut = new AlphaAnimation(1,0); 20 | fadeOut.setInterpolator(new AccelerateInterpolator()); 21 | fadeOut.setStartOffset(DURATION); 22 | fadeOut.setDuration(DURATION); 23 | 24 | addAnimation(fadeIn); 25 | addAnimation(fadeOut); 26 | setFillAfter(true); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/fragments/internal/OpenDeviceResult.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.fragments.internal; 2 | 3 | public class OpenDeviceResult { 4 | public static final String TAG="OpenDeviceResult"; 5 | 6 | private String message; 7 | private String deviceDescription; 8 | private int errorReason; 9 | 10 | // Package protected 11 | OpenDeviceResult(String message, String deviceDescription, int errorReason) { 12 | this.message = message; 13 | this.deviceDescription = deviceDescription; 14 | this.errorReason = errorReason; 15 | } 16 | 17 | public String getMessage() { 18 | return message; 19 | } 20 | public String getDeviceDescription() { 21 | return deviceDescription; 22 | } 23 | public int getErrorReason() { 24 | return errorReason; 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | String result=message; 30 | if (deviceDescription!=null && !deviceDescription.isEmpty()){ 31 | result+=" Device: "+deviceDescription; 32 | } 33 | return result; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/listeners/CalibrateListener.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.listeners; 2 | 3 | public interface CalibrateListener { 4 | boolean onTryPpm(boolean firstTry,int percentage,int ppm); 5 | void onCalibrateReady(int ppm); 6 | void onCalibrateFailed(); 7 | void onCalibrateCancelled(); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/listeners/ImagePopupListener.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.listeners; 2 | 3 | public interface ImagePopupListener { 4 | void onImagePopupDispose(final int id); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/listeners/NmeaReceivedListener.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.listeners; 2 | 3 | import net.videgro.ships.services.NmeaClientService; 4 | 5 | public interface NmeaReceivedListener { 6 | void onNmeaReceived(String line,final NmeaClientService.Source source); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/listeners/OwnLocationReceivedListener.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.listeners; 2 | 3 | import android.location.Location; 4 | 5 | public interface OwnLocationReceivedListener { 6 | void onOwnLocationReceived(Location location); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/listeners/ShipReceivedListener.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.listeners; 2 | 3 | import net.videgro.ships.nmea2ship.domain.Ship; 4 | 5 | public interface ShipReceivedListener { 6 | void onShipReceived(final Ship ship); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/nmea2ship/Nmea2Ship.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.nmea2ship; 2 | 3 | import android.util.Log; 4 | 5 | import net.videgro.ships.nmea2ship.domain.Ship; 6 | import net.videgro.ships.services.NmeaClientService; 7 | 8 | import dk.dma.ais.binary.SixbitException; 9 | import dk.dma.ais.message.AisMessageException; 10 | import dk.dma.ais.packet.AisPacket; 11 | import dk.dma.ais.packet.AisPacketParser; 12 | import dk.dma.ais.sentence.SentenceException; 13 | 14 | public class Nmea2Ship { 15 | private static final String TAG="Nmea2Ship - "; 16 | 17 | private AisPacketParser aisPacketParser=new AisPacketParser(); 18 | private final AisParser aisParser=new AisParser(); 19 | 20 | public Nmea2Ship(){ 21 | Log.i(TAG,"constructor"); 22 | } 23 | 24 | public Ship onMessage(final String line, final NmeaClientService.Source source){ 25 | Ship result=null; 26 | AisPacket aisPacket=null; 27 | try { 28 | aisPacket = aisPacketParser.readLine(line); 29 | } catch (SentenceException e) { 30 | Log.e(TAG,"onMessage",e); 31 | } 32 | 33 | if (aisPacket!=null){ 34 | try { 35 | result=aisParser.parse(aisPacket.getAisMessage()); 36 | 37 | switch (source) { 38 | case INTERNAL: 39 | result.setSource(Ship.Source.INTERNAL); 40 | break; 41 | case EXTERNAL: 42 | result.setSource(Ship.Source.EXTERNAL); 43 | break; 44 | case CLOUD: 45 | result.setSource(Ship.Source.CLOUD); 46 | break; 47 | default: 48 | // Nothing to do 49 | break; 50 | } // End switch 51 | 52 | } catch (AisMessageException | SixbitException e) { 53 | Log.e(TAG,"onMessage",e); 54 | } 55 | } 56 | 57 | return result; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/preferences/PromoPreferenceRateMe.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.preferences; 2 | 3 | import android.content.Context; 4 | import android.preference.Preference; 5 | import android.util.AttributeSet; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import net.videgro.ships.R; 11 | 12 | public class PromoPreferenceRateMe extends Preference { 13 | 14 | public PromoPreferenceRateMe(Context context) { 15 | super(context, null); 16 | } 17 | 18 | public PromoPreferenceRateMe(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | } 21 | 22 | @Override 23 | protected View onCreateView(ViewGroup parent) { 24 | super.onCreateView(parent); 25 | final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 26 | return inflater!=null ? inflater.inflate(R.layout.promo_rate_me, null) : null; 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/services/MyFirebaseMessagingService.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.services; 2 | 3 | import android.content.Intent; 4 | import android.util.Log; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.localbroadcastmanager.content.LocalBroadcastManager; 8 | 9 | import com.google.firebase.messaging.FirebaseMessaging; 10 | import com.google.firebase.messaging.FirebaseMessagingService; 11 | import com.google.firebase.messaging.RemoteMessage; 12 | 13 | import net.videgro.ships.MyFirebaseMessagingRepeater; 14 | 15 | public class MyFirebaseMessagingService extends FirebaseMessagingService { 16 | private static final String TAG = "FbMsgSrv"; 17 | 18 | private LocalBroadcastManager broadcaster; 19 | 20 | public final static String MESSAGING_TOPIC="nmea"; 21 | public final static String LOCAL_BROADCAST_TOPIC="BroadcastNmeaData"; 22 | public final static String LOCAL_BROADCAST_DATA="NmeaData"; 23 | 24 | @Override 25 | public void onCreate() { 26 | broadcaster = LocalBroadcastManager.getInstance(this); 27 | FirebaseMessaging.getInstance().subscribeToTopic(MESSAGING_TOPIC); 28 | } 29 | 30 | @Override 31 | public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { 32 | final String nmeas=remoteMessage.getData().get(MyFirebaseMessagingRepeater.JSON_DATA_FIELD); 33 | Log.v(TAG,"NMEAs received: "+nmeas); 34 | final Intent intent = new Intent(LOCAL_BROADCAST_TOPIC); 35 | intent.putExtra(LOCAL_BROADCAST_DATA, nmeas); 36 | broadcaster.sendBroadcast(intent); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/services/RtlSdrService.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.services; 2 | 3 | import android.app.Service; 4 | 5 | import net.videgro.ships.StartRtlSdrRequest; 6 | 7 | public abstract class RtlSdrService extends Service { 8 | 9 | abstract public void startRtlSdr(final StartRtlSdrRequest startAisRequest); 10 | abstract public boolean stopRtlSdr(); 11 | abstract public boolean isRtlSdrRunning(); 12 | abstract public boolean registerListener(final RtlSdrServiceListener listener); 13 | abstract public boolean unregisterListener(final RtlSdrServiceListener listener); 14 | abstract public boolean changePpm(final int newPpm); 15 | 16 | public interface RtlSdrServiceListener { 17 | void onRtlSdrStarted(); 18 | void onRtlSdrStopped(); 19 | void onRtlSdrException(final int exitCode); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/services/internal/NmeaMessagesCache.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.services.internal; 2 | 3 | import android.os.AsyncTask; 4 | import android.util.Log; 5 | 6 | import net.videgro.ships.Repeater; 7 | import net.videgro.ships.tasks.ProcessCachedMessagesTask; 8 | 9 | import java.io.BufferedWriter; 10 | import java.io.File; 11 | import java.io.FileWriter; 12 | import java.io.IOException; 13 | 14 | public class NmeaMessagesCache { 15 | private static final String TAG = "NmeaMessagesCache"; 16 | 17 | private final File cacheFile; 18 | private final Repeater repeater; 19 | 20 | public NmeaMessagesCache(final File cacheDirectory, final Repeater repeater) { 21 | cacheFile = new File(cacheDirectory, "nmea.cache"); 22 | this.repeater = repeater; 23 | } 24 | 25 | public void add(final String nmea) { 26 | final String tag = "cacheDatagramPacket - "; 27 | try (final FileWriter fw = new FileWriter(cacheFile, true); final BufferedWriter bw = new BufferedWriter(fw)) { 28 | bw.write(nmea + "\n"); 29 | } catch (IOException e) { 30 | Log.e(TAG, tag, e); 31 | } 32 | } 33 | 34 | public void processCachedMessages() { 35 | // Contains network actions, not allowed on main thread: so execute it as task. 36 | final ProcessCachedMessagesTask task = new ProcessCachedMessagesTask(cacheFile, repeater); 37 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/tasks/HttpCacheFifoTask.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.tasks; 2 | 3 | import java.io.File; 4 | import java.util.Arrays; 5 | import java.util.Comparator; 6 | import java.util.concurrent.Callable; 7 | 8 | import android.util.Log; 9 | 10 | public class HttpCacheFifoTask implements Callable { 11 | private static final String TAG = "HttpCacheFifoTask"; 12 | 13 | private final File cacheDir; 14 | private final long maxDiskUsageInBytes; 15 | 16 | private long totalDeletedBytes = 0; 17 | private int totalDeletedFiles = 0; 18 | 19 | public HttpCacheFifoTask(final File cacheDir, final long maxDiskUsageInBytes) { 20 | this.cacheDir = cacheDir; 21 | this.maxDiskUsageInBytes = maxDiskUsageInBytes; 22 | } 23 | 24 | @Override 25 | public String call() { 26 | 27 | // Get the size of the directory 28 | long dirSize = retrieveDirSize(cacheDir); 29 | 30 | if (dirSize > maxDiskUsageInBytes){ 31 | 32 | // Get a orderded (by last modified) list of files 33 | final File[] files = cacheDir.listFiles(); 34 | if (files != null && files.length > 0) { 35 | Arrays.sort(files, new Comparator() { 36 | public int compare(File f1, File f2) { 37 | return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified()); 38 | } 39 | }); 40 | } 41 | 42 | int victimId=0; 43 | 44 | while (files!=null && dirSize > maxDiskUsageInBytes && victimId < files.length) { 45 | final File victim = files[victimId++]; 46 | final long fileSize = victim.length(); 47 | //Log.d(TAG,"Deleting file: "+victim+", Last modified: "+victim.lastModified()+", Size: "+fileSize+" bytes."); 48 | 49 | if (victim.delete()) { 50 | dirSize -= fileSize; 51 | totalDeletedBytes += fileSize; 52 | totalDeletedFiles++; 53 | } 54 | } 55 | } 56 | 57 | final String result="dirSize: "+dirSize+", maxDiskUsageInBytes: "+maxDiskUsageInBytes+", totalDeletedBytes: "+totalDeletedBytes+", totalDeletedFiles: "+totalDeletedFiles; 58 | Log.d(TAG,result); 59 | return result; 60 | } 61 | 62 | private long retrieveDirSize(final File dir) { 63 | long size = 0; 64 | final File[] files = dir.listFiles(); 65 | if (files != null) { 66 | for (final File file : files) { 67 | if (file.isFile()) { 68 | size += file.length(); 69 | } else { 70 | size += retrieveDirSize(file); 71 | } 72 | } 73 | } 74 | return size; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/tasks/NmeaFirebaseMessagingClientTask.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.tasks; 2 | 3 | import android.os.AsyncTask; 4 | import android.util.Log; 5 | 6 | import net.videgro.ships.MyFirebaseMessagingRepeater; 7 | import net.videgro.ships.listeners.NmeaReceivedListener; 8 | import net.videgro.ships.services.NmeaClientService; 9 | 10 | import java.util.regex.Pattern; 11 | 12 | public class NmeaFirebaseMessagingClientTask extends AsyncTask { 13 | private static final String TAG = "NmeaFirebaseMsgCltTsk"; 14 | 15 | private final NmeaReceivedListener listener; 16 | private final String nmeasRaw; 17 | 18 | 19 | public NmeaFirebaseMessagingClientTask(final NmeaReceivedListener listener, final String nmeasRaw) { 20 | this.listener = listener; 21 | this.nmeasRaw = nmeasRaw; 22 | } 23 | 24 | public String doInBackground(Void... params) { 25 | final String tag = "doInBackground - "; 26 | Thread.currentThread().setName(TAG); 27 | 28 | if (nmeasRaw != null) { 29 | final String[] nmeas = nmeasRaw.split(Pattern.quote(MyFirebaseMessagingRepeater.NMEA_SEP)); 30 | for (final String nmea : nmeas) { 31 | if (!nmea.isEmpty()) { 32 | listener.onNmeaReceived(MyFirebaseMessagingRepeater.PREFIX_AIVDM + nmea, NmeaClientService.Source.CLOUD); 33 | } 34 | } 35 | } 36 | 37 | return "FINISHED"; 38 | } 39 | 40 | public void onPostExecute(String result) { 41 | if (result != null) { 42 | Log.d(TAG, "Result: " + result); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/tasks/NmeaUdpClientTask.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.tasks; 2 | 3 | import android.os.AsyncTask; 4 | import android.util.Log; 5 | 6 | import net.videgro.ships.listeners.NmeaReceivedListener; 7 | import net.videgro.ships.services.NmeaClientService; 8 | import net.videgro.ships.tasks.domain.DatagramSocketConfig; 9 | 10 | import java.io.IOException; 11 | import java.net.DatagramPacket; 12 | import java.net.DatagramSocket; 13 | import java.net.InetAddress; 14 | 15 | public class NmeaUdpClientTask extends AsyncTask { 16 | private static final String TAG = "NmeaUdpClientTask"; 17 | 18 | private final DatagramSocketConfig datagramSocketConfig; 19 | 20 | private final NmeaReceivedListener listener; 21 | private final NmeaClientService.Source source; 22 | 23 | private DatagramSocket socket; 24 | private boolean stopped=false; 25 | 26 | public NmeaUdpClientTask(final NmeaReceivedListener listener,final NmeaClientService.Source source,final DatagramSocketConfig datagramSocketConfig) { 27 | this.listener = listener; 28 | this.source = source; 29 | this.datagramSocketConfig = datagramSocketConfig; 30 | } 31 | 32 | public void stop(){ 33 | stopped=true; 34 | 35 | if (socket!=null){ 36 | // Will stop the socket.receive() call blocking 37 | socket.close(); 38 | } 39 | } 40 | 41 | public String doInBackground(Void... params) { 42 | final String tag = "doInBackground - "; 43 | Thread.currentThread().setName(TAG+datagramSocketConfig); 44 | 45 | try { 46 | socket = new DatagramSocket(datagramSocketConfig.getPort(), InetAddress.getByName(datagramSocketConfig.getAddress())); 47 | Log.d(TAG, "Listening on UDP: " + datagramSocketConfig); 48 | 49 | byte[] receiveData = new byte[1024]; 50 | final DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 51 | 52 | while (!stopped) { 53 | socket.receive(receivePacket); 54 | 55 | // Split received data into lines (strings) 56 | final String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 57 | final String[] lines = sentence.split("\\r?\\n"); 58 | 59 | for (final String line : lines) { 60 | Log.v(TAG, tag + "NMEA received - " + line); 61 | listener.onNmeaReceived(line,source); 62 | } 63 | } 64 | } catch (IOException e) { 65 | if (stopped){ 66 | Log.i(TAG, tag+"Task has been stopped and socket closed. Ignore this exception.", e); 67 | } else { 68 | Log.e(TAG, tag, e); 69 | } 70 | } finally { 71 | if (socket!=null && !socket.isClosed()){ 72 | socket.close(); 73 | socket=null; 74 | } 75 | } 76 | 77 | return "FINISHED"; 78 | } 79 | 80 | public void onPostExecute(String result) { 81 | if (result != null) { 82 | Log.d(TAG, "Result: " + result); 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/tasks/ProcessCachedMessagesTask.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.tasks; 2 | 3 | import android.os.AsyncTask; 4 | import android.util.Log; 5 | 6 | import net.videgro.ships.Analytics; 7 | import net.videgro.ships.Repeater; 8 | 9 | import java.io.BufferedReader; 10 | import java.io.File; 11 | import java.io.FileReader; 12 | import java.io.IOException; 13 | 14 | public class ProcessCachedMessagesTask extends AsyncTask { 15 | private static final String TAG = "ProcessCachedMsgTask"; 16 | 17 | private final File cacheFile; 18 | private final Repeater repeater; 19 | 20 | public ProcessCachedMessagesTask(final File cacheFile,final Repeater repeater) { 21 | this.cacheFile = cacheFile; 22 | this.repeater = repeater; 23 | } 24 | 25 | public Integer doInBackground(Void... params) { 26 | final String tag = "doInBackground - "; 27 | Thread.currentThread().setName(TAG); 28 | 29 | int numLines=0; 30 | 31 | if (cacheFile.exists()) { 32 | try (final BufferedReader reader = new BufferedReader(new FileReader(cacheFile))) { 33 | String line; 34 | 35 | while ((line = reader.readLine()) != null) { 36 | repeater.repeatViaUdp(line); 37 | repeater.repeatToCloud(line); 38 | numLines++; 39 | } 40 | } catch (IOException e) { 41 | Log.e(TAG, tag, e); 42 | } finally { 43 | //noinspection ResultOfMethodCallIgnored 44 | cacheFile.delete(); 45 | } 46 | } 47 | return numLines; 48 | } 49 | 50 | public void onPostExecute(Integer result) { 51 | if (result != null) { 52 | Log.d(TAG, "Result: " + result); 53 | Analytics.logEvent(repeater.getContext(),Analytics.CATEGORY_NMEA_REPEAT, "Numer_of_processed_cached_messages",String.valueOf(result)); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/ships/tasks/domain/DatagramSocketConfig.java: -------------------------------------------------------------------------------- 1 | package net.videgro.ships.tasks.domain; 2 | 3 | public class DatagramSocketConfig{ 4 | private String address; 5 | private int port; 6 | 7 | public DatagramSocketConfig(String address, int port) { 8 | this.address = address; 9 | this.port = port; 10 | } 11 | 12 | public String getAddress() { 13 | return address; 14 | } 15 | 16 | public int getPort() { 17 | return port; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return address+":"+port; 23 | } 24 | 25 | @Override 26 | public boolean equals(Object o) { 27 | if (this == o) { 28 | return true; 29 | } 30 | if (o == null || getClass() != o.getClass()) { 31 | return false; 32 | } 33 | 34 | DatagramSocketConfig that = (DatagramSocketConfig) o; 35 | 36 | if (port != that.port) { 37 | return false; 38 | } 39 | return address.equals(that.address); 40 | } 41 | 42 | @Override 43 | public int hashCode() { 44 | int result = address.hashCode(); 45 | result = 31 * result + port; 46 | return result; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/usb/SupportedDevice.java: -------------------------------------------------------------------------------- 1 | package net.videgro.usb; 2 | 3 | import android.util.Pair; 4 | 5 | public class SupportedDevice { 6 | private final Pair vendorAndProductId; 7 | private final String description; 8 | 9 | // Package protected 10 | SupportedDevice(Pair vendorAndProductId, String description) { 11 | this.vendorAndProductId = vendorAndProductId; 12 | this.description = description; 13 | } 14 | 15 | // Package protected 16 | Pair getVendorAndProductId() { 17 | return vendorAndProductId; 18 | } 19 | 20 | public String getDescription() { 21 | return description; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/usb/rtlsdr/RtlSdrDevice.java: -------------------------------------------------------------------------------- 1 | package net.videgro.usb.rtlsdr; 2 | 3 | import android.hardware.usb.UsbDevice; 4 | import android.os.Parcel; 5 | import android.os.Parcelable; 6 | 7 | public class RtlSdrDevice implements Parcelable { 8 | private final UsbDevice usbDevice; 9 | private final String friendlyName; 10 | 11 | public RtlSdrDevice(final UsbDevice usbDevice,final String friendlyName){ 12 | this.usbDevice=usbDevice; 13 | this.friendlyName=friendlyName; 14 | } 15 | public static final Parcelable.Creator CREATOR = 16 | new Parcelable.Creator() { 17 | public RtlSdrDevice createFromParcel(Parcel in) { 18 | final Parcelable usbDevice=in.readParcelable(UsbDevice.class.getClassLoader()); 19 | if (usbDevice==null){ 20 | throw new IllegalArgumentException("parcelable is null"); 21 | } 22 | 23 | final String friendlyName=in.readString(); 24 | 25 | return new RtlSdrDevice((UsbDevice)usbDevice,friendlyName); 26 | } 27 | 28 | public RtlSdrDevice[] newArray(int size) { 29 | return new RtlSdrDevice[size]; 30 | } 31 | }; 32 | 33 | public String getFriendlyName() { 34 | return friendlyName; 35 | } 36 | 37 | public UsbDevice getUsbDevice(){ 38 | return usbDevice; 39 | } 40 | 41 | @Override 42 | public int describeContents() { 43 | return 0; 44 | } 45 | 46 | @Override 47 | public void writeToParcel(Parcel dest, int flags) { 48 | dest.writeParcelable(usbDevice,flags); 49 | dest.writeString(friendlyName); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/usb/rtlsdr/RtlSdrDeviceProvider.java: -------------------------------------------------------------------------------- 1 | package net.videgro.usb.rtlsdr; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.List; 6 | 7 | public interface RtlSdrDeviceProvider { 8 | List retrieveDevices(Context context); 9 | 10 | String getName(); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/net/videgro/usb/rtlsdr/RtlSdrDeviceProviderImpl.java: -------------------------------------------------------------------------------- 1 | package net.videgro.usb.rtlsdr; 2 | 3 | import android.content.Context; 4 | 5 | import net.videgro.usb.UsbUtils; 6 | 7 | import java.util.List; 8 | 9 | public class RtlSdrDeviceProviderImpl implements RtlSdrDeviceProvider { 10 | @Override 11 | public List retrieveDevices(final Context context) { 12 | return UsbUtils.retrieveAvailableUsbDevices(context); 13 | } 14 | 15 | @Override 16 | public String getName() { 17 | return "RTL-SDR"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/jni/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.6.0) 2 | 3 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -DLIBUSB_DESCRIBE=\"\" -O3 -fno-builtin-printf -fno-builtin-fprintf") 4 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=shorten-64-to-32 -Werror=implicit-function-declaration") 5 | 6 | find_library( 7 | log-lib 8 | log 9 | ) 10 | 11 | add_library( 12 | # Specifies the name of the library. 13 | NativeRtlSdr 14 | 15 | # Sets the library as a shared library. 16 | SHARED 17 | 18 | # Provides a relative path to source file(s). 19 | libusb/libusb/core.c 20 | libusb/libusb/descriptor.c 21 | libusb/libusb/hotplug.c 22 | libusb/libusb/io.c 23 | libusb/libusb/sync.c 24 | libusb/libusb/strerror.c 25 | libusb/libusb/os/linux_usbfs.c 26 | libusb/libusb/os/poll_posix.c 27 | libusb/libusb/os/threads_posix.c 28 | libusb/libusb/os/linux_netlink.c 29 | rtl-sdr/src/rtl-sdr-android.c 30 | rtl-sdr/src/convenience/convenience.c 31 | rtl-sdr/src/tuner_e4k.c 32 | rtl-sdr/src/tuner_fc0012.c 33 | rtl-sdr/src/tuner_fc0013.c 34 | rtl-sdr/src/tuner_fc2580.c 35 | rtl-sdr/src/tuner_r82xx.c 36 | rtl-sdr/src/rtl_test.c 37 | rtl-ais/main.c 38 | rtl-ais/rtl_ais.c 39 | rtl-ais/aisdecoder/aisdecoder.c 40 | rtl-ais/aisdecoder/sounddecoder.c 41 | rtl-ais/aisdecoder/lib/receiver.c 42 | rtl-ais/aisdecoder/lib/protodec.c 43 | rtl-ais/aisdecoder/lib/hmalloc.c 44 | rtl-ais/aisdecoder/lib/filter.c 45 | rtl-ais/tcp_listener/tcp_listener.c 46 | NativeRtlSdrUtils.cpp 47 | NativeRtlSdr.cpp 48 | ) 49 | 50 | # Specifies a path to native header files. 51 | include_directories( 52 | . 53 | libusb 54 | libusb/android 55 | libusb/libusb 56 | libusb/libusb/os 57 | rtl-sdr/include 58 | rtl-sdr/src 59 | rtl-ais 60 | rtl-ais/aisdecoder 61 | rtl-ais/aisdecoder/lib 62 | ) 63 | 64 | target_link_libraries( 65 | NativeRtlSdr 66 | ${log-lib} 67 | ) 68 | -------------------------------------------------------------------------------- /app/src/main/jni/NativeRtlSdr.h: -------------------------------------------------------------------------------- 1 | /* DO NOT EDIT THIS FILE - it is machine generated */ 2 | #include 3 | /* Header for class net_videgro_ships_bridge_NativeRtlSdr */ 4 | 5 | #ifndef _Included_net_videgro_ships_bridge_NativeRtlSdr 6 | #define _Included_net_videgro_ships_bridge_NativeRtlSdr 7 | #ifdef __cplusplus 8 | extern "C" { 9 | #endif 10 | /* 11 | * Class: net_videgro_ships_bridge_NativeRtlSdr 12 | * Method: startRtlSdrAis 13 | * Signature: (Ljava/lang/String;ILjava/lang/String;)V 14 | */ 15 | JNIEXPORT void JNICALL Java_net_videgro_ships_bridge_NativeRtlSdr_startRtlSdrAis 16 | (JNIEnv *, jobject, jstring, jint, jstring); 17 | 18 | /* 19 | * Class: net_videgro_ships_bridge_NativeRtlSdr 20 | * Method: stopRtlSdrAis 21 | * Signature: ()V 22 | */ 23 | JNIEXPORT void JNICALL Java_net_videgro_ships_bridge_NativeRtlSdr_stopRtlSdrAis 24 | (JNIEnv *, jobject); 25 | 26 | /* 27 | * Class: net_videgro_ships_bridge_NativeRtlSdr 28 | * Method: changeRtlSdrPpm 29 | * Signature: (I)V 30 | */ 31 | JNIEXPORT void JNICALL Java_net_videgro_ships_bridge_NativeRtlSdr_changeRtlSdrPpm 32 | (JNIEnv *, jobject, jint); 33 | 34 | /* 35 | * Class: net_videgro_ships_bridge_NativeRtlSdr 36 | * Method: isRunningRtlSdrAis 37 | * Signature: ()Z 38 | */ 39 | JNIEXPORT jboolean JNICALL Java_net_videgro_ships_bridge_NativeRtlSdr_isRunningRtlSdrAis 40 | (JNIEnv *, jobject); 41 | 42 | #ifdef __cplusplus 43 | } 44 | #endif 45 | #endif 46 | -------------------------------------------------------------------------------- /app/src/main/jni/NativeRtlSdrUtils.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | void strcpytrimmed(char *dest, const char *src, int dest_malloced_size) { 9 | const int charstocopy = dest_malloced_size - 1; 10 | 11 | dest[charstocopy] = 0; 12 | 13 | int firstspaceends; 14 | for (firstspaceends = 0; 15 | (firstspaceends < charstocopy) && (src[firstspaceends] == ' '); firstspaceends++); 16 | 17 | int lastspacestarts; 18 | for (lastspacestarts = charstocopy - 1; 19 | (lastspacestarts >= firstspaceends) && (src[lastspacestarts] == ' '); lastspacestarts--); 20 | 21 | const int srcrealsize = lastspacestarts - firstspaceends + 1; 22 | 23 | memcpy(dest, &src[firstspaceends], (srcrealsize) * sizeof(char)); 24 | } 25 | 26 | void allocate_args_from_string(const char *string, int nargslength, int *argc, char ***argv) { 27 | int i; 28 | 29 | (*argc) = 1; 30 | for (i = 0; i < nargslength; i++) { 31 | if (string[i] == ' ') { 32 | (*argc)++; 33 | } 34 | } 35 | 36 | if ((*argc) == nargslength + 1) { 37 | (*argc) = 0; 38 | return; 39 | } 40 | 41 | //(*argv) = malloc(((*argc) + 2) * sizeof(char *)); 42 | (*argv) = (char**)malloc(((*argc) + 2) * sizeof(char *)); 43 | (*argv)[0] = 0; 44 | int id = 1; 45 | const char *laststart = string; 46 | int lastlength = 0; 47 | for (i = 0; i < nargslength - 1; i++) { 48 | lastlength++; 49 | if (string[i] == ' ' && string[i + 1] != ' ') { 50 | (*argv)[id] = (char *) malloc(lastlength); 51 | strcpytrimmed((*argv)[id++], laststart, lastlength); 52 | 53 | laststart = &string[i + 1]; 54 | lastlength = 0; 55 | } 56 | } 57 | lastlength++; 58 | (*argv)[id] = (char *) malloc(lastlength + 1); 59 | strcpytrimmed((*argv)[id++], laststart, lastlength + 1); 60 | (*argv)[id] = 0; 61 | (*argc) = id; 62 | } 63 | 64 | #ifdef __cplusplus 65 | } 66 | #endif -------------------------------------------------------------------------------- /app/src/main/jni/NativeRtlSdrUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef SHIPS_NATIVERTLSDRUTILS_H 2 | #define SHIPS_NATIVERTLSDRUTILS_H 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | void allocate_args_from_string(const char *string, int nargslength, int *argc, char ***argv); 9 | 10 | #ifdef __cplusplus 11 | } 12 | #endif 13 | #endif -------------------------------------------------------------------------------- /app/src/main/jni/native2android.h: -------------------------------------------------------------------------------- 1 | #ifndef NATIVE_2_JAVA_H_ 2 | #define NATIVE_2_JAVA_H_ 3 | 4 | #include 5 | 6 | void send_message(const char *format, ...); 7 | 8 | void send_message_err(const char *format, ...); 9 | 10 | void send_exception(const int exception_code); 11 | 12 | void send_ready(); 13 | 14 | //void thread_detach(); 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_menu_ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-hdpi/ic_menu_ar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_stat_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-hdpi/ic_stat_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_stat_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-hdpi/ic_stat_usb.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/but_google_play_rate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/but_google_play_rate.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_green_sphere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_green_sphere.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_information.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_information_ships.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_information_ships.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_menu_ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_menu_ar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_stat_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_stat_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_stat_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/ic_stat_usb.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/rtlsdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/rtlsdr.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/thumbs_down_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/thumbs_down_circle.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/thumbs_up_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/thumbs_up_circle.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/warning_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-mdpi/warning_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_menu_ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xhdpi/ic_menu_ar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_stat_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xhdpi/ic_stat_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_stat_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xhdpi/ic_stat_usb.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_menu_ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xxhdpi/ic_menu_ar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_stat_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xxhdpi/ic_stat_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_stat_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xxhdpi/ic_stat_usb.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_menu_ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable-xxxhdpi/ic_menu_ar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ar_marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable/ar_marker.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/videgro/Ships/1fc65a032b3584daf8604a8e85086bb695988c91/app/src/main/res/drawable/ic_menu_ar.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_augmented_reality_location.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 21 | 22 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/augmented_reality_location.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 14 | 15 | 21 | 22 | 28 | 29 | 39 | 40 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 20 | 26 | 27 | 28 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_main.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/promo_rate_me.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |