├── .github
└── workflows
│ ├── build.yml
│ └── release.yml
├── .gitignore
├── .tool-versions
├── CHANGELOG.md
├── LICENSE
├── README.md
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── mage
├── build.gradle
├── libs
│ └── sanselanandroid.jar
├── proguard-rules.pro
├── schemas
│ ├── mil.nga.giat.mage.data.MageDatabase
│ │ ├── 1.json
│ │ └── 2.json
│ └── mil.nga.giat.mage.database.MageDatabase
│ │ ├── 1.json
│ │ └── 2.json
├── src
│ ├── debug
│ │ └── res
│ │ │ └── values
│ │ │ └── strings.xml
│ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── assets
│ │ ├── fonts
│ │ │ └── GondolaMage-Regular.otf
│ │ └── markers
│ │ │ ├── default.png
│ │ │ └── empty.png
│ │ ├── java
│ │ └── mil
│ │ │ └── nga
│ │ │ └── giat
│ │ │ └── mage
│ │ │ ├── LandingActivity.kt
│ │ │ ├── LandingViewModel.kt
│ │ │ ├── MageApplication.kt
│ │ │ ├── cache
│ │ │ ├── CacheUtils.kt
│ │ │ └── GeoPackageCacheUtils.java
│ │ │ ├── compat
│ │ │ └── server5
│ │ │ │ ├── form
│ │ │ │ └── view
│ │ │ │ │ └── AttachmentViewContentServer5.kt
│ │ │ │ ├── login
│ │ │ │ ├── SignupActivityServer5.kt
│ │ │ │ ├── SignupViewModelServer5.kt
│ │ │ │ └── UserResourceServer5.kt
│ │ │ │ └── observation
│ │ │ │ └── edit
│ │ │ │ ├── FormViewModel_server5.kt
│ │ │ │ └── ObservationResource_sever5.kt
│ │ │ ├── contact
│ │ │ ├── ContactDialog.kt
│ │ │ └── Email.kt
│ │ │ ├── coordinate
│ │ │ ├── CoordinateFormatter.kt
│ │ │ ├── CoordinateSystem.kt
│ │ │ └── DMS.kt
│ │ │ ├── data
│ │ │ ├── datasource
│ │ │ │ ├── event
│ │ │ │ │ └── EventLocalDataSource.kt
│ │ │ │ ├── feature
│ │ │ │ │ └── FeatureLocalDataSource.kt
│ │ │ │ ├── layer
│ │ │ │ │ └── LayerLocalDataSource.kt
│ │ │ │ ├── location
│ │ │ │ │ └── LocationLocalDataSource.kt
│ │ │ │ ├── observation
│ │ │ │ │ ├── AttachmentLocalDataSource.kt
│ │ │ │ │ └── ObservationLocalDataSource.kt
│ │ │ │ ├── permission
│ │ │ │ │ └── RoleLocalDataSource.kt
│ │ │ │ ├── settings
│ │ │ │ │ ├── SettingsLocalDataSource.kt
│ │ │ │ │ └── SettingsRemoteDataSource.kt
│ │ │ │ ├── team
│ │ │ │ │ └── TeamLocalDataSource.kt
│ │ │ │ └── user
│ │ │ │ │ └── UserLocalDataSource.kt
│ │ │ └── repository
│ │ │ │ ├── api
│ │ │ │ └── ApiRepository.kt
│ │ │ │ ├── event
│ │ │ │ └── EventRepository.kt
│ │ │ │ ├── feed
│ │ │ │ └── FeedRepository.kt
│ │ │ │ ├── layer
│ │ │ │ └── LayerRepository.kt
│ │ │ │ ├── location
│ │ │ │ └── LocationRepository.kt
│ │ │ │ ├── map
│ │ │ │ └── MapRepository.kt
│ │ │ │ ├── observation
│ │ │ │ ├── AttachmentRepository.kt
│ │ │ │ └── ObservationRepository.kt
│ │ │ │ ├── settings
│ │ │ │ └── SettingsRepository.kt
│ │ │ │ └── user
│ │ │ │ └── UserRepository.kt
│ │ │ ├── database
│ │ │ ├── DateTypeConverter.kt
│ │ │ ├── GeometryTypeConverter.kt
│ │ │ ├── JsonTypeConverter.kt
│ │ │ ├── MageDatabase.kt
│ │ │ ├── dao
│ │ │ │ ├── MageSqliteOpenHelper.kt
│ │ │ │ ├── feed
│ │ │ │ │ ├── FeedDao.kt
│ │ │ │ │ ├── FeedItemDao.kt
│ │ │ │ │ └── FeedLocalDao.kt
│ │ │ │ └── settings
│ │ │ │ │ └── SettingsDao.kt
│ │ │ └── model
│ │ │ │ ├── Property.java
│ │ │ │ ├── event
│ │ │ │ ├── Event.java
│ │ │ │ └── Form.kt
│ │ │ │ ├── feed
│ │ │ │ ├── Feed.kt
│ │ │ │ ├── FeedAndLocal.kt
│ │ │ │ ├── FeedContent.kt
│ │ │ │ ├── FeedItem.kt
│ │ │ │ ├── FeedLocal.kt
│ │ │ │ ├── FeedWithItems.kt
│ │ │ │ ├── ItemWithFeed.kt
│ │ │ │ └── MapStyle.kt
│ │ │ │ ├── geojson
│ │ │ │ ├── StaticFeature.java
│ │ │ │ └── StaticFeatureProperty.java
│ │ │ │ ├── layer
│ │ │ │ └── Layer.java
│ │ │ │ ├── location
│ │ │ │ ├── Location.java
│ │ │ │ └── LocationProperty.java
│ │ │ │ ├── observation
│ │ │ │ ├── Attachment.java
│ │ │ │ ├── Observation.java
│ │ │ │ ├── ObservationError.java
│ │ │ │ ├── ObservationErrorPersister.kt
│ │ │ │ ├── ObservationFavorite.java
│ │ │ │ ├── ObservationForm.java
│ │ │ │ ├── ObservationImportant.java
│ │ │ │ ├── ObservationProperty.java
│ │ │ │ └── State.java
│ │ │ │ ├── permission
│ │ │ │ └── Role.java
│ │ │ │ ├── settings
│ │ │ │ ├── MapSettings.kt
│ │ │ │ └── Settings.kt
│ │ │ │ ├── team
│ │ │ │ ├── Team.java
│ │ │ │ └── TeamEvent.java
│ │ │ │ └── user
│ │ │ │ ├── Phone.java
│ │ │ │ ├── User.java
│ │ │ │ ├── UserLocal.java
│ │ │ │ └── UserTeam.java
│ │ │ ├── di
│ │ │ ├── ApplicationModule.kt
│ │ │ ├── NetworkModule.kt
│ │ │ ├── OrmLiteModule.kt
│ │ │ ├── PreferencesModule.kt
│ │ │ ├── RoomModule.kt
│ │ │ └── TokenProvider.kt
│ │ │ ├── disclaimer
│ │ │ └── DisclaimerActivity.kt
│ │ │ ├── event
│ │ │ ├── EventActivity.kt
│ │ │ ├── EventItemDecorator.java
│ │ │ ├── EventListAdapter.java
│ │ │ ├── EventViewModel.kt
│ │ │ └── EventsActivity.kt
│ │ │ ├── feed
│ │ │ ├── FeedActivity.kt
│ │ │ ├── FeedFetchService.kt
│ │ │ ├── FeedItemState.kt
│ │ │ ├── FeedScreen.kt
│ │ │ ├── FeedViewModel.kt
│ │ │ └── item
│ │ │ │ ├── FeedItemActivity.kt
│ │ │ │ ├── FeedItemScreen.kt
│ │ │ │ └── FeedItemViewModel.kt
│ │ │ ├── filter
│ │ │ ├── DateTimeFilter.kt
│ │ │ ├── Filter.kt
│ │ │ ├── FilterActivity.java
│ │ │ ├── LocationFilterActivity.java
│ │ │ └── ObservationFilterActivity.java
│ │ │ ├── form
│ │ │ ├── FormJson.kt
│ │ │ ├── FormState.kt
│ │ │ ├── FormViewModel.kt
│ │ │ ├── defaults
│ │ │ │ ├── FormDefaultActivity.kt
│ │ │ │ ├── FormDefaultScreen.kt
│ │ │ │ ├── FormDefaultViewModel.kt
│ │ │ │ └── FormPreferences.kt
│ │ │ ├── edit
│ │ │ │ ├── FormEdit.kt
│ │ │ │ ├── GeometryEditContent.kt
│ │ │ │ └── dialog
│ │ │ │ │ ├── CoordinateChangeListener.java
│ │ │ │ │ ├── DMSCoordinateTextWatcher.kt
│ │ │ │ │ ├── DateFieldDialog.kt
│ │ │ │ │ ├── FormReorderDialog.kt
│ │ │ │ │ ├── GeometryFieldDialog.kt
│ │ │ │ │ ├── MapSearchDialog.kt
│ │ │ │ │ └── SelectFieldDialog.kt
│ │ │ ├── field
│ │ │ │ ├── AttachmentFieldState.kt
│ │ │ │ ├── BooleanFieldState.kt
│ │ │ │ ├── DateFieldState.kt
│ │ │ │ ├── EmailFieldState.kt
│ │ │ │ ├── FieldState.kt
│ │ │ │ ├── FieldValue.kt
│ │ │ │ ├── GeometryFieldState.kt
│ │ │ │ ├── MultiSelectFieldState.kt
│ │ │ │ ├── NumberFieldState.kt
│ │ │ │ ├── RadioFieldState.kt
│ │ │ │ ├── SelectFieldState.kt
│ │ │ │ └── TextFieldState.kt
│ │ │ └── view
│ │ │ │ ├── AttachmentViewContent.kt
│ │ │ │ ├── FormView.kt
│ │ │ │ └── MapViewContent.kt
│ │ │ ├── geopackage
│ │ │ └── media
│ │ │ │ ├── GeoPackageMediaActivity.kt
│ │ │ │ ├── GeoPackageMediaScreen.kt
│ │ │ │ └── GeoPackageMediaViewModel.kt
│ │ │ ├── glide
│ │ │ ├── MageGlideModule.kt
│ │ │ ├── loader
│ │ │ │ ├── AudioLoader.kt
│ │ │ │ ├── AvatarLoader.kt
│ │ │ │ ├── DocumentLoader.kt
│ │ │ │ ├── ImageFileLoader.kt
│ │ │ │ ├── ImageUrlLoader.kt
│ │ │ │ ├── MapIconLoader.kt
│ │ │ │ ├── VideoFileLoader.kt
│ │ │ │ └── VideoUrlLoader.kt
│ │ │ ├── model
│ │ │ │ └── Avatar.kt
│ │ │ ├── target
│ │ │ │ └── MarkerTarget.kt
│ │ │ └── transform
│ │ │ │ ├── LocationAgeTransformation.kt
│ │ │ │ └── VideoOverlayTransformation.kt
│ │ │ ├── help
│ │ │ ├── HelpActivity.java
│ │ │ └── OpensourceItemFragment.java
│ │ │ ├── location
│ │ │ ├── LocationAccess.kt
│ │ │ ├── LocationFetchService.kt
│ │ │ ├── LocationPolicy.kt
│ │ │ ├── LocationProvider.kt
│ │ │ └── LocationReportingService.kt
│ │ │ ├── login
│ │ │ ├── AccountStateActivity.kt
│ │ │ ├── AuthenticationButton.kt
│ │ │ ├── AuthenticationStatus.kt
│ │ │ ├── AuthorizationStatus.kt
│ │ │ ├── LoginActivity.kt
│ │ │ ├── LoginViewModel.kt
│ │ │ ├── PasswordStrengthFragment.java
│ │ │ ├── ServerUrlActivity.kt
│ │ │ ├── ServerUrlViewModel.kt
│ │ │ ├── SignupActivity.kt
│ │ │ ├── SignupViewModel.kt
│ │ │ ├── idp
│ │ │ │ ├── IdpLoginActivity.kt
│ │ │ │ ├── IdpLoginFragment.kt
│ │ │ │ └── IdpRedirectUriReceiverActivity.kt
│ │ │ ├── ldap
│ │ │ │ └── LdapLoginFragment.kt
│ │ │ └── mage
│ │ │ │ └── MageLoginFragment.kt
│ │ │ ├── map
│ │ │ ├── FeatureMapState.kt
│ │ │ ├── FileSystemTileProvider.kt
│ │ │ ├── MapAndViewProvider.kt
│ │ │ ├── MapExtensions.kt
│ │ │ ├── MapFragment.kt
│ │ │ ├── MapViewModel.kt
│ │ │ ├── TMSTileProvider.kt
│ │ │ ├── WMSTileProvider.kt
│ │ │ ├── XYZTileProvider.kt
│ │ │ ├── annotation
│ │ │ │ ├── BaseObservationStyle.kt
│ │ │ │ ├── MapAnnotation.kt
│ │ │ │ ├── ObservationIconHelper.kt
│ │ │ │ └── ShapeObservationStyle.kt
│ │ │ ├── cache
│ │ │ │ ├── CacheOverlay.java
│ │ │ │ ├── CacheOverlayFilter.kt
│ │ │ │ ├── CacheOverlayType.java
│ │ │ │ ├── CacheProvider.kt
│ │ │ │ ├── GeoPackageCacheOverlay.java
│ │ │ │ ├── GeoPackageFeatureTableCacheOverlay.kt
│ │ │ │ ├── GeoPackageTableCacheOverlay.java
│ │ │ │ ├── GeoPackageTileTableCacheOverlay.java
│ │ │ │ ├── StaticFeatureCacheOverlay.java
│ │ │ │ ├── URLCacheOverlay.java
│ │ │ │ ├── WMSCacheOverlay.java
│ │ │ │ └── XYZDirectoryCacheOverlay.java
│ │ │ ├── detail
│ │ │ │ ├── GeoPackageMapDetails.kt
│ │ │ │ ├── MapFeatureDetails.kt
│ │ │ │ ├── MapStaticFeatureDetails.kt
│ │ │ │ ├── ObservationMapDetails.kt
│ │ │ │ ├── UserMapDetails.kt
│ │ │ │ └── UserPhone.kt
│ │ │ ├── download
│ │ │ │ └── GeoPackageDownloadManager.java
│ │ │ ├── feature
│ │ │ │ ├── FeatureCollection.kt
│ │ │ │ ├── FeedCollection.kt
│ │ │ │ ├── Mappable.kt
│ │ │ │ └── StaticFeatureCollection.kt
│ │ │ ├── navigation
│ │ │ │ └── bearing
│ │ │ │ │ ├── Compass.kt
│ │ │ │ │ ├── StraightLineNavigation.kt
│ │ │ │ │ └── StraightLineNavigationView.kt
│ │ │ └── preference
│ │ │ │ ├── LayerNameComparator.java
│ │ │ │ ├── MapLayerPreferences.kt
│ │ │ │ ├── MapPreferencesActivity.kt
│ │ │ │ ├── MapPreferencesViewModel.kt
│ │ │ │ ├── OfflineLayersAdapter.kt
│ │ │ │ ├── OnlineLayersPreferenceActivity.kt
│ │ │ │ ├── OverlayPreference.java
│ │ │ │ └── TileOverlayPreferenceActivity.kt
│ │ │ ├── network
│ │ │ ├── ApiResponse.kt
│ │ │ ├── LiveDataCallAdapter.kt
│ │ │ ├── LiveDataCallAdapterFactory.kt
│ │ │ ├── Resource.kt
│ │ │ ├── Server.kt
│ │ │ ├── api
│ │ │ │ └── ApiService.kt
│ │ │ ├── attachment
│ │ │ │ ├── AttachmentService.kt
│ │ │ │ └── AttachmentTypeAdapter.kt
│ │ │ ├── device
│ │ │ │ └── DeviceService.kt
│ │ │ ├── event
│ │ │ │ ├── EventDeserializer.kt
│ │ │ │ ├── EventService.kt
│ │ │ │ └── EventsDeserializer.java
│ │ │ ├── feed
│ │ │ │ └── FeedService.kt
│ │ │ ├── geocoder
│ │ │ │ └── NominatimService.kt
│ │ │ ├── geojson
│ │ │ │ ├── FeatureCollectionTypeAdapter.kt
│ │ │ │ ├── GeometryConverter.kt
│ │ │ │ └── GeometryTypeAdapterFactory.kt
│ │ │ ├── gson
│ │ │ │ ├── AnnotationExclusionStrategy.kt
│ │ │ │ ├── DateTimestampTypeAdapter.kt
│ │ │ │ ├── Exclude.kt
│ │ │ │ └── GsonNull.kt
│ │ │ ├── layer
│ │ │ │ ├── LayerDeserializer.java
│ │ │ │ ├── LayerService.kt
│ │ │ │ └── LayersDeserializer.kt
│ │ │ ├── location
│ │ │ │ ├── LocationService.kt
│ │ │ │ ├── LocationsTypeAdapter.kt
│ │ │ │ └── UserLocationsTypeAdapter.kt
│ │ │ ├── observation
│ │ │ │ ├── ObservationDeserializer.kt
│ │ │ │ ├── ObservationSerializer.kt
│ │ │ │ ├── ObservationService.kt
│ │ │ │ ├── ObservationTypeAdapter.kt
│ │ │ │ └── ObservationsTypeAdapter.kt
│ │ │ ├── role
│ │ │ │ ├── RoleService.kt
│ │ │ │ └── RolesDeserializer.kt
│ │ │ ├── settings
│ │ │ │ └── SettingsService.kt
│ │ │ ├── team
│ │ │ │ ├── TeamDeserializer.kt
│ │ │ │ ├── TeamService.kt
│ │ │ │ └── TeamsDeserializer.kt
│ │ │ └── user
│ │ │ │ ├── UserService.kt
│ │ │ │ ├── UserWithRoleIdTypeAdapter.kt
│ │ │ │ └── UserWithRoleTypeAdapter.kt
│ │ │ ├── newsfeed
│ │ │ ├── ObservationFeedFragment.kt
│ │ │ ├── ObservationFeedViewModel.kt
│ │ │ ├── ObservationListAdapter.kt
│ │ │ ├── UserFeedFragment.kt
│ │ │ ├── UserFeedViewModel.kt
│ │ │ └── UserListAdapter.kt
│ │ │ ├── observation
│ │ │ ├── ImportantDialog.java
│ │ │ ├── ImportantRemoveDialog.java
│ │ │ ├── InputFilterDecimal.java
│ │ │ ├── ObservationLocation.java
│ │ │ ├── ObservationNotificationListener.java
│ │ │ ├── ObservationState.kt
│ │ │ ├── attachment
│ │ │ │ ├── AttachmentGallery.java
│ │ │ │ ├── AttachmentViewActivity.kt
│ │ │ │ ├── AttachmentViewModel.kt
│ │ │ │ └── AttachmentViewScreen.kt
│ │ │ ├── edit
│ │ │ │ ├── CaptureAudio.kt
│ │ │ │ ├── FormPickerBottomSheetFragment.kt
│ │ │ │ ├── ObservationEditActivity.kt
│ │ │ │ └── ObservationEditScreen.kt
│ │ │ ├── sync
│ │ │ │ ├── AttachmentSyncListener.kt
│ │ │ │ ├── AttachmentSyncWorker.kt
│ │ │ │ ├── ObservationFetchService.kt
│ │ │ │ ├── ObservationFetchWorker.kt
│ │ │ │ ├── ObservationSyncListener.kt
│ │ │ │ ├── ObservationSyncWorker.kt
│ │ │ │ └── ResponseFlag.kt
│ │ │ └── view
│ │ │ │ ├── ObservationViewActivity.kt
│ │ │ │ └── ObservationViewScreen.kt
│ │ │ ├── people
│ │ │ ├── PeopleActivity.java
│ │ │ └── PeopleRecyclerAdapter.java
│ │ │ ├── preferences
│ │ │ ├── FetchPreferencesActivity.java
│ │ │ ├── GeneralPreferencesActivity.java
│ │ │ ├── LocationPreferencesActivity.java
│ │ │ └── color
│ │ │ │ ├── ColorPickerPreference.kt
│ │ │ │ ├── ColorPreferenceDialog.kt
│ │ │ │ └── ColorPreferenceFragment.kt
│ │ │ ├── profile
│ │ │ ├── AvatarSyncWorker.kt
│ │ │ ├── ChangePasswordActivity.kt
│ │ │ ├── ProfileActivity.java
│ │ │ └── ProfilePictureViewerActivity.kt
│ │ │ ├── sdk
│ │ │ ├── Compatibility.kt
│ │ │ ├── Temporal.java
│ │ │ ├── datastore
│ │ │ │ └── user
│ │ │ │ │ ├── Permission.java
│ │ │ │ │ └── Permissions.kt
│ │ │ ├── event
│ │ │ │ ├── IAttachmentEventListener.java
│ │ │ │ ├── IConnectivityEventListener.java
│ │ │ │ ├── IEventDispatcher.java
│ │ │ │ ├── IEventEventListener.java
│ │ │ │ ├── IEventListener.java
│ │ │ │ ├── ILocationEventListener.java
│ │ │ │ ├── IObservationEventListener.java
│ │ │ │ ├── IScreenEventListener.java
│ │ │ │ ├── IStaticFeatureEventListener.java
│ │ │ │ ├── IUserDispatcher.java
│ │ │ │ └── IUserEventListener.java
│ │ │ ├── exceptions
│ │ │ │ ├── EventException.java
│ │ │ │ ├── LayerException.java
│ │ │ │ ├── LocationException.java
│ │ │ │ ├── ObservationException.java
│ │ │ │ ├── RoleException.java
│ │ │ │ ├── StaticFeatureException.java
│ │ │ │ ├── TeamException.java
│ │ │ │ └── UserException.java
│ │ │ ├── preferences
│ │ │ │ ├── IntegerEditTextPreference.java
│ │ │ │ ├── IntegerListPreference.java
│ │ │ │ └── PreferenceHelper.java
│ │ │ └── utils
│ │ │ │ ├── DeviceUuidFactory.java
│ │ │ │ ├── GeometryUtility.kt
│ │ │ │ ├── ISO8601DateFormatFactory.java
│ │ │ │ ├── MediaUtility.java
│ │ │ │ ├── PasswordUtility.java
│ │ │ │ ├── StorageUtility.java
│ │ │ │ └── ZipUtility.kt
│ │ │ ├── search
│ │ │ └── Geocoder.kt
│ │ │ ├── ui
│ │ │ ├── coordinate
│ │ │ │ ├── CoordinateText.kt
│ │ │ │ └── CoordinateTextButton.kt
│ │ │ ├── map
│ │ │ │ ├── MapSearch.kt
│ │ │ │ └── MapSearchViewModel.kt
│ │ │ ├── search
│ │ │ │ ├── PlacenameSearch.kt
│ │ │ │ └── PlacenameSearchViewModel.kt
│ │ │ ├── setup
│ │ │ │ ├── AccountStateScreen.kt
│ │ │ │ ├── AccountStateViewModel.kt
│ │ │ │ ├── AdminContact.kt
│ │ │ │ └── ServerUrlScreen.kt
│ │ │ ├── sheet
│ │ │ │ └── DragHandle.kt
│ │ │ └── theme
│ │ │ │ ├── Color.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ └── Theme3.kt
│ │ │ ├── utils
│ │ │ ├── ByteUtils.java
│ │ │ ├── DateFormatFactory.java
│ │ │ ├── DialogUtils.kt
│ │ │ ├── Geometry.kt
│ │ │ ├── NotificationUtils.kt
│ │ │ └── ThemeUtils.kt
│ │ │ └── widget
│ │ │ ├── CheckedLinearLayout.java
│ │ │ ├── CoordinateView.java
│ │ │ └── DividerItemDecoration.java
│ │ └── res
│ │ ├── color-night
│ │ ├── bottom_navigation_view.xml
│ │ ├── button_tint_dark.xml
│ │ ├── switch_thumb_tint_dark.xml
│ │ ├── switch_track_tint_dark.xml
│ │ ├── toggle_button.xml
│ │ └── toggle_button_selected.xml
│ │ ├── color
│ │ ├── report_location.xml
│ │ ├── toggle_button.xml
│ │ └── toggle_button_selected.xml
│ │ ├── drawable-hdpi
│ │ ├── baseline_cloud_download_white_24.png
│ │ ├── baseline_speed_black_36.png
│ │ ├── ic_account_circle_white_48dp.png
│ │ ├── ic_add_black_24dp.png
│ │ ├── ic_attachment_200dp.png
│ │ ├── ic_attachment_black_48dp.png
│ │ ├── ic_audio_attachment_200dp.png
│ │ ├── ic_check_white_24dp.png
│ │ ├── ic_close_black_24dp.png
│ │ ├── ic_close_white_24dp.png
│ │ ├── ic_compass_black_24dp.png
│ │ ├── ic_delete_black_24dp.png
│ │ ├── ic_delete_white_24dp.png
│ │ ├── ic_drawer.png
│ │ ├── ic_email_white_24dp.png
│ │ ├── ic_error_outline_white_24dp.png
│ │ ├── ic_event_white_24dp.png
│ │ ├── ic_favorite_white_24dp.png
│ │ ├── ic_flag_white_24dp.png
│ │ ├── ic_geopackage.png
│ │ ├── ic_help_outline_white_24dp.png
│ │ ├── ic_image_black_24dp.png
│ │ ├── ic_launcher.png
│ │ ├── ic_layers_black_24dp.png
│ │ ├── ic_map_white_24dp.png
│ │ ├── ic_menu_white_24dp.png
│ │ ├── ic_mic_black_24dp.png
│ │ ├── ic_mic_black_48dp.png
│ │ ├── ic_mode_edit_black_24dp.png
│ │ ├── ic_mode_edit_white_24dp.png
│ │ ├── ic_more_horiz_white_24dp.png
│ │ ├── ic_my_location_black_24dp.png
│ │ ├── ic_new_obs.png
│ │ ├── ic_pentagon_outline_black_24dp.png
│ │ ├── ic_people_white_24dp.png
│ │ ├── ic_person_black_48dp.png
│ │ ├── ic_person_white_24dp.png
│ │ ├── ic_person_white_48dp.png
│ │ ├── ic_phone_white_24dp.png
│ │ ├── ic_photo_camera_black_24dp.png
│ │ ├── ic_place_black_24dp.png
│ │ ├── ic_place_white_24dp.png
│ │ ├── ic_place_white_60dp.png
│ │ ├── ic_play_circle_filled_100dp.png
│ │ ├── ic_play_circle_outline_black_48dp.png
│ │ ├── ic_play_circle_outline_white_36dp.png
│ │ ├── ic_play_circle_outline_white_48dp.png
│ │ ├── ic_power_settings_new_white_24dp.png
│ │ ├── ic_ray_start_end_black_24dp.png
│ │ ├── ic_refresh_white_24dp.png
│ │ ├── ic_save_white_24dp.png
│ │ ├── ic_search_black_24dp.png
│ │ ├── ic_security_white_18dp.png
│ │ ├── ic_settings_white_24dp.png
│ │ ├── ic_shape_edit.png
│ │ ├── ic_shape_edit_selected.png
│ │ ├── ic_share_black_24dp.png
│ │ ├── ic_square_outline_black_24dp.png
│ │ ├── ic_sync_white_24dp.png
│ │ ├── ic_timeline_black_24dp.png
│ │ ├── ic_videocam_black_24dp.png
│ │ ├── ic_videocam_black_48dp.png
│ │ ├── ic_visibility_white_24dp.png
│ │ ├── ic_vpn_key_white_24dp.png
│ │ ├── ic_wand_white_50dp.png
│ │ ├── infowindow_background.9.png
│ │ ├── line_string_marker.png
│ │ ├── map.png
│ │ ├── observation_form_close_48dp.png
│ │ ├── observation_form_icon.png
│ │ ├── polygon_marker.png
│ │ └── rectangle.png
│ │ ├── drawable-ldpi
│ │ ├── ic_launcher.png
│ │ └── map.png
│ │ ├── drawable-mdpi
│ │ ├── baseline_cloud_download_white_24.png
│ │ ├── baseline_speed_black_36.png
│ │ ├── ic_account_circle_white_48dp.png
│ │ ├── ic_add_black_24dp.png
│ │ ├── ic_attachment_200dp.png
│ │ ├── ic_attachment_black_48dp.png
│ │ ├── ic_audio_attachment_200dp.png
│ │ ├── ic_check_white_24dp.png
│ │ ├── ic_close_black_24dp.png
│ │ ├── ic_close_white_24dp.png
│ │ ├── ic_compass_black_24dp.png
│ │ ├── ic_delete_black_24dp.png
│ │ ├── ic_delete_white_24dp.png
│ │ ├── ic_drawer.png
│ │ ├── ic_email_white_24dp.png
│ │ ├── ic_error_outline_white_24dp.png
│ │ ├── ic_event_white_24dp.png
│ │ ├── ic_favorite_white_24dp.png
│ │ ├── ic_flag_white_24dp.png
│ │ ├── ic_geopackage.png
│ │ ├── ic_help_outline_white_24dp.png
│ │ ├── ic_image_black_24dp.png
│ │ ├── ic_launcher.png
│ │ ├── ic_layers_black_24dp.png
│ │ ├── ic_map_white_24dp.png
│ │ ├── ic_menu_white_24dp.png
│ │ ├── ic_mic_black_24dp.png
│ │ ├── ic_mic_black_48dp.png
│ │ ├── ic_mode_edit_black_24dp.png
│ │ ├── ic_mode_edit_white_24dp.png
│ │ ├── ic_more_horiz_white_24dp.png
│ │ ├── ic_my_location_black_24dp.png
│ │ ├── ic_new_obs.png
│ │ ├── ic_pentagon_outline_black_24dp.png
│ │ ├── ic_people_white_24dp.png
│ │ ├── ic_person_black_48dp.png
│ │ ├── ic_person_white_24dp.png
│ │ ├── ic_person_white_48dp.png
│ │ ├── ic_phone_white_24dp.png
│ │ ├── ic_photo_camera_black_24dp.png
│ │ ├── ic_place_black_24dp.png
│ │ ├── ic_place_white_24dp.png
│ │ ├── ic_place_white_60dp.png
│ │ ├── ic_play_circle_filled_100dp.png
│ │ ├── ic_play_circle_outline_black_48dp.png
│ │ ├── ic_play_circle_outline_white_36dp.png
│ │ ├── ic_play_circle_outline_white_48dp.png
│ │ ├── ic_power_settings_new_white_24dp.png
│ │ ├── ic_ray_start_end_black_24dp.png
│ │ ├── ic_refresh_white_24dp.png
│ │ ├── ic_save_white_24dp.png
│ │ ├── ic_search_black_24dp.png
│ │ ├── ic_security_white_18dp.png
│ │ ├── ic_settings_white_24dp.png
│ │ ├── ic_shape_edit.png
│ │ ├── ic_shape_edit_selected.png
│ │ ├── ic_share_black_24dp.png
│ │ ├── ic_square_outline_black_24dp.png
│ │ ├── ic_sync_white_24dp.png
│ │ ├── ic_timeline_black_24dp.png
│ │ ├── ic_videocam_black_24dp.png
│ │ ├── ic_videocam_black_48dp.png
│ │ ├── ic_visibility_white_24dp.png
│ │ ├── ic_vpn_key_white_24dp.png
│ │ ├── ic_wand_white_50dp.png
│ │ ├── line_string_marker.png
│ │ ├── map.png
│ │ ├── observation_form_close_48dp.png
│ │ ├── observation_form_icon.png
│ │ ├── polygon_marker.png
│ │ └── rectangle.png
│ │ ├── drawable-night-hdpi
│ │ └── infowindow_background.9.png
│ │ ├── drawable-night-xhdpi
│ │ └── infowindow_background.9.png
│ │ ├── drawable-night-xxhdpi
│ │ └── infowindow_background.9.png
│ │ ├── drawable-night-xxxhdpi
│ │ └── infowindow_background.9.png
│ │ ├── drawable-night
│ │ ├── captcha_border.xml
│ │ └── form_picker_icon.xml
│ │ ├── drawable-xhdpi
│ │ ├── baseline_cloud_download_white_24.png
│ │ ├── baseline_speed_black_36.png
│ │ ├── ic_account_circle_white_48dp.png
│ │ ├── ic_add_black_24dp.png
│ │ ├── ic_attachment_200dp.png
│ │ ├── ic_attachment_black_48dp.png
│ │ ├── ic_audio_attachment_200dp.png
│ │ ├── ic_check_white_24dp.png
│ │ ├── ic_close_black_24dp.png
│ │ ├── ic_close_white_24dp.png
│ │ ├── ic_compass_black_24dp.png
│ │ ├── ic_delete_black_24dp.png
│ │ ├── ic_delete_white_24dp.png
│ │ ├── ic_drawer.png
│ │ ├── ic_email_white_24dp.png
│ │ ├── ic_error_outline_white_24dp.png
│ │ ├── ic_event_white_24dp.png
│ │ ├── ic_favorite_white_24dp.png
│ │ ├── ic_flag_white_24dp.png
│ │ ├── ic_geopackage.png
│ │ ├── ic_help_outline_white_24dp.png
│ │ ├── ic_image_black_24dp.png
│ │ ├── ic_launcher.png
│ │ ├── ic_layers_black_24dp.png
│ │ ├── ic_map_white_24dp.png
│ │ ├── ic_menu_white_24dp.png
│ │ ├── ic_mic_black_24dp.png
│ │ ├── ic_mic_black_48dp.png
│ │ ├── ic_mode_edit_black_24dp.png
│ │ ├── ic_mode_edit_white_24dp.png
│ │ ├── ic_more_horiz_white_24dp.png
│ │ ├── ic_my_location_black_24dp.png
│ │ ├── ic_new_obs.png
│ │ ├── ic_pentagon_outline_black_24dp.png
│ │ ├── ic_people_white_24dp.png
│ │ ├── ic_person_black_48dp.png
│ │ ├── ic_person_white_24dp.png
│ │ ├── ic_person_white_48dp.png
│ │ ├── ic_phone_white_24dp.png
│ │ ├── ic_photo_camera_black_24dp.png
│ │ ├── ic_place_black_24dp.png
│ │ ├── ic_place_white_24dp.png
│ │ ├── ic_place_white_60dp.png
│ │ ├── ic_play_circle_filled_100dp.png
│ │ ├── ic_play_circle_outline_black_48dp.png
│ │ ├── ic_play_circle_outline_white_36dp.png
│ │ ├── ic_play_circle_outline_white_48dp.png
│ │ ├── ic_power_settings_new_white_24dp.png
│ │ ├── ic_ray_start_end_black_24dp.png
│ │ ├── ic_refresh_white_24dp.png
│ │ ├── ic_save_white_24dp.png
│ │ ├── ic_search_black_24dp.png
│ │ ├── ic_security_white_18dp.png
│ │ ├── ic_shape_edit.png
│ │ ├── ic_shape_edit_selected.png
│ │ ├── ic_share_black_24dp.png
│ │ ├── ic_square_outline_black_24dp.png
│ │ ├── ic_sync_white_24dp.png
│ │ ├── ic_timeline_black_24dp.png
│ │ ├── ic_videocam_black_24dp.png
│ │ ├── ic_videocam_black_48dp.png
│ │ ├── ic_visibility_white_24dp.png
│ │ ├── ic_vpn_key_white_24dp.png
│ │ ├── ic_wand_white_50dp.png
│ │ ├── infowindow_background.9.png
│ │ ├── line_string_marker.png
│ │ ├── map.png
│ │ ├── observation_form_close_48dp.png
│ │ ├── observation_form_icon.png
│ │ ├── polygon_marker.png
│ │ └── rectangle.png
│ │ ├── drawable-xxhdpi
│ │ ├── baseline_cloud_download_white_24.png
│ │ ├── baseline_speed_black_36.png
│ │ ├── ic_account_circle_white_48dp.png
│ │ ├── ic_add_black_24dp.png
│ │ ├── ic_attachment_200dp.png
│ │ ├── ic_attachment_black_48dp.png
│ │ ├── ic_audio_attachment_200dp.png
│ │ ├── ic_check_white_24dp.png
│ │ ├── ic_close_black_24dp.png
│ │ ├── ic_close_white_24dp.png
│ │ ├── ic_compass_black_24dp.png
│ │ ├── ic_delete_black_24dp.png
│ │ ├── ic_delete_white_24dp.png
│ │ ├── ic_drawer.png
│ │ ├── ic_email_white_24dp.png
│ │ ├── ic_error_outline_white_24dp.png
│ │ ├── ic_event_white_24dp.png
│ │ ├── ic_favorite_white_24dp.png
│ │ ├── ic_flag_white_24dp.png
│ │ ├── ic_geopackage.png
│ │ ├── ic_help_outline_white_24dp.png
│ │ ├── ic_image_black_24dp.png
│ │ ├── ic_launcher.png
│ │ ├── ic_layers_black_24dp.png
│ │ ├── ic_map_white_24dp.png
│ │ ├── ic_menu_white_24dp.png
│ │ ├── ic_mic_black_24dp.png
│ │ ├── ic_mic_black_48dp.png
│ │ ├── ic_mode_edit_black_24dp.png
│ │ ├── ic_mode_edit_white_24dp.png
│ │ ├── ic_more_horiz_white_24dp.png
│ │ ├── ic_my_location_black_24dp.png
│ │ ├── ic_new_obs.png
│ │ ├── ic_pentagon_outline_black_24dp.png
│ │ ├── ic_people_white_24dp.png
│ │ ├── ic_person_black_48dp.png
│ │ ├── ic_person_white_24dp.png
│ │ ├── ic_person_white_48dp.png
│ │ ├── ic_phone_white_24dp.png
│ │ ├── ic_photo_camera_black_24dp.png
│ │ ├── ic_place_black_24dp.png
│ │ ├── ic_place_white_24dp.png
│ │ ├── ic_place_white_60dp.png
│ │ ├── ic_play_circle_filled_100dp.png
│ │ ├── ic_play_circle_outline_black_48dp.png
│ │ ├── ic_play_circle_outline_white_36dp.png
│ │ ├── ic_play_circle_outline_white_48dp.png
│ │ ├── ic_power_settings_new_white_24dp.png
│ │ ├── ic_ray_start_end_black_24dp.png
│ │ ├── ic_refresh_white_24dp.png
│ │ ├── ic_save_white_24dp.png
│ │ ├── ic_search_black_24dp.png
│ │ ├── ic_security_white_18dp.png
│ │ ├── ic_settings_white_24dp.png
│ │ ├── ic_shape_edit.png
│ │ ├── ic_shape_edit_selected.png
│ │ ├── ic_share_black_24dp.png
│ │ ├── ic_square_outline_black_24dp.png
│ │ ├── ic_sync_white_24dp.png
│ │ ├── ic_timeline_black_24dp.png
│ │ ├── ic_videocam_black_24dp.png
│ │ ├── ic_videocam_black_48dp.png
│ │ ├── ic_visibility_white_24dp.png
│ │ ├── ic_vpn_key_white_24dp.png
│ │ ├── ic_wand_white_50dp.png
│ │ ├── infowindow_background.9.png
│ │ ├── line_string_marker.png
│ │ ├── observation_form_close_48dp.png
│ │ ├── observation_form_icon.png
│ │ ├── polygon_marker.png
│ │ └── rectangle.png
│ │ ├── drawable-xxxhdpi
│ │ ├── baseline_cloud_download_white_24.png
│ │ ├── baseline_speed_black_36.png
│ │ ├── ic_account_circle_white_48dp.png
│ │ ├── ic_add_black_24dp.png
│ │ ├── ic_attachment_200dp.png
│ │ ├── ic_attachment_black_48dp.png
│ │ ├── ic_audio_attachment_200dp.png
│ │ ├── ic_check_white_24dp.png
│ │ ├── ic_close_black_24dp.png
│ │ ├── ic_close_white_24dp.png
│ │ ├── ic_compass_black_24dp.png
│ │ ├── ic_delete_black_24dp.png
│ │ ├── ic_delete_white_24dp.png
│ │ ├── ic_email_white_24dp.png
│ │ ├── ic_error_outline_white_24dp.png
│ │ ├── ic_event_white_24dp.png
│ │ ├── ic_favorite_white_24dp.png
│ │ ├── ic_flag_white_24dp.png
│ │ ├── ic_help_outline_white_24dp.png
│ │ ├── ic_image_black_24dp.png
│ │ ├── ic_layers_black_24dp.png
│ │ ├── ic_map_white_24dp.png
│ │ ├── ic_menu_white_24dp.png
│ │ ├── ic_mic_black_24dp.png
│ │ ├── ic_mic_black_48dp.png
│ │ ├── ic_mode_edit_black_24dp.png
│ │ ├── ic_mode_edit_white_24dp.png
│ │ ├── ic_more_horiz_white_24dp.png
│ │ ├── ic_my_location_black_24dp.png
│ │ ├── ic_pentagon_outline_black_24dp.png
│ │ ├── ic_people_white_24dp.png
│ │ ├── ic_person_black_48dp.png
│ │ ├── ic_person_white_24dp.png
│ │ ├── ic_person_white_48dp.png
│ │ ├── ic_phone_white_24dp.png
│ │ ├── ic_photo_camera_black_24dp.png
│ │ ├── ic_place_black_24dp.png
│ │ ├── ic_place_white_24dp.png
│ │ ├── ic_place_white_60dp.png
│ │ ├── ic_play_circle_filled_100dp.png
│ │ ├── ic_play_circle_outline_black_48dp.png
│ │ ├── ic_play_circle_outline_white_36dp.png
│ │ ├── ic_play_circle_outline_white_48dp.png
│ │ ├── ic_power_settings_new_white_24dp.png
│ │ ├── ic_ray_start_end_black_24dp.png
│ │ ├── ic_refresh_white_24dp.png
│ │ ├── ic_save_white_24dp.png
│ │ ├── ic_search_black_24dp.png
│ │ ├── ic_security_white_18dp.png
│ │ ├── ic_settings_white_24dp.png
│ │ ├── ic_shape_edit.png
│ │ ├── ic_shape_edit_selected.png
│ │ ├── ic_share_black_24dp.png
│ │ ├── ic_square_outline_black_24dp.png
│ │ ├── ic_sync_white_24dp.png
│ │ ├── ic_timeline_black_24dp.png
│ │ ├── ic_videocam_black_24dp.png
│ │ ├── ic_videocam_black_48dp.png
│ │ ├── ic_visibility_white_24dp.png
│ │ ├── ic_vpn_key_white_24dp.png
│ │ ├── ic_wand_white_50dp.png
│ │ ├── infowindow_background.9.png
│ │ ├── line_string_marker.png
│ │ ├── observation_form_close_48dp.png
│ │ ├── observation_form_icon.png
│ │ ├── polygon_marker.png
│ │ └── rectangle.png
│ │ ├── drawable
│ │ ├── authentication_remote_icon.xml
│ │ ├── captcha_border.xml
│ │ ├── color_preference_preview.xml
│ │ ├── color_tile.xml
│ │ ├── compass_background.xml
│ │ ├── coordinate_background.xml
│ │ ├── coordinate_ripple.xml
│ │ ├── default_marker.xml
│ │ ├── drawer_count.xml
│ │ ├── event_divider.xml
│ │ ├── form_field.xml
│ │ ├── form_picker_icon.xml
│ │ ├── google_login_button.xml
│ │ ├── google_login_button_disabled.xml
│ │ ├── google_login_button_states.xml
│ │ ├── gradient_fade.xml
│ │ ├── ic_access_time_preference_24dp.xml
│ │ ├── ic_access_time_white_24dp.xml
│ │ ├── ic_arrow_back_white_24dp.xml
│ │ ├── ic_attachment_gray_48dp.xml
│ │ ├── ic_baseline_add_location_24.xml
│ │ ├── ic_baseline_calendar_month_24.xml
│ │ ├── ic_baseline_cancel_24.xml
│ │ ├── ic_baseline_description_24.xml
│ │ ├── ic_baseline_filter_alt_24.xml
│ │ ├── ic_baseline_list_alt_24px.xml
│ │ ├── ic_baseline_navigation_24.xml
│ │ ├── ic_baseline_not_listed_location_24.xml
│ │ ├── ic_baseline_note_add_24.xml
│ │ ├── ic_baseline_priority_high_24.xml
│ │ ├── ic_baseline_refresh_24.xml
│ │ ├── ic_baseline_reorder_24.xml
│ │ ├── ic_baseline_swap_vert_24.xml
│ │ ├── ic_brightness_medium_preference_24dp.xml
│ │ ├── ic_close_gray_24dp.xml
│ │ ├── ic_delete_preference_24dp.xml
│ │ ├── ic_directions_outlined_white_24dp.xml
│ │ ├── ic_event_available_white_24dp.xml
│ │ ├── ic_event_note_white_24dp.xml
│ │ ├── ic_favorite_border_white_24dp.xml
│ │ ├── ic_flag_outlined_white_24dp.xml
│ │ ├── ic_folder_open_black_24dp.xml
│ │ ├── ic_image_preference_24dp.xml
│ │ ├── ic_info_outline_black_24dp.xml
│ │ ├── ic_info_outline_gray_24dp.xml
│ │ ├── ic_info_outline_info_window_24dp.xml
│ │ ├── ic_layers_black_vector_24dp.xml
│ │ ├── ic_layers_gray_24dp.xml
│ │ ├── ic_mic_gray_48dp.xml
│ │ ├── ic_mode_edit_gray_24dp.xml
│ │ ├── ic_my_location_preference_24dp.xml
│ │ ├── ic_my_location_white_24dp.xml
│ │ ├── ic_notifications_none_preference_24dp.xml
│ │ ├── ic_outline_email_white_24.xml
│ │ ├── ic_outline_location_disabled_24.xml
│ │ ├── ic_outline_near_me_24.xml
│ │ ├── ic_outline_not_listed_location_24.xml
│ │ ├── ic_outline_person_pin_circle_24.xml
│ │ ├── ic_outline_phone_white_24.xml
│ │ ├── ic_person_black_24dp.xml
│ │ ├── ic_person_gray_24dp.xml
│ │ ├── ic_place_black_48.xml
│ │ ├── ic_place_preference_24dp.xml
│ │ ├── ic_place_white_48dp.xml
│ │ ├── ic_play_circle_outline_gray_48dp.xml
│ │ ├── ic_point_scan_outlined_24.xml
│ │ ├── ic_restore_black_24dp.xml
│ │ ├── ic_round_emoji_people_24.xml
│ │ ├── ic_round_not_listed_location_24.xml
│ │ ├── ic_round_warning_24.xml
│ │ ├── ic_rss_feed_24.xml
│ │ ├── ic_search_white_24dp.xml
│ │ ├── ic_share_active_24dp.xml
│ │ ├── ic_share_gray_24dp.xml
│ │ ├── ic_sync_preference_24dp.xml
│ │ ├── ic_timeline_gray_24dp.xml
│ │ ├── ic_videocam_gray_48dp.xml
│ │ ├── ic_watch_preference_24dp.xml
│ │ ├── list_inset_divider.xml
│ │ ├── map_search_foreground.xml
│ │ ├── multi_line_text_view_gradient.xml
│ │ ├── observation_badge.xml
│ │ ├── overlay_actionbar_text.xml
│ │ ├── pentagon_outline.xml
│ │ ├── profile_border.xml
│ │ ├── profile_button.xml
│ │ ├── ray_start_end.xml
│ │ ├── semi_see_through_background.xml
│ │ ├── share_button.xml
│ │ └── square_outline.xml
│ │ ├── ic_settings_white_24dp.png
│ │ ├── layout-v23
│ │ ├── dialog_date_picker.xml
│ │ ├── dialog_time_picker.xml
│ │ └── gars_location_edit.xml
│ │ ├── layout
│ │ ├── activity_change_password.xml
│ │ ├── activity_disclaimer.xml
│ │ ├── activity_event.xml
│ │ ├── activity_events.xml
│ │ ├── activity_fetch_preferences.xml
│ │ ├── activity_filter.xml
│ │ ├── activity_form_defaults.xml
│ │ ├── activity_general_preferences.xml
│ │ ├── activity_landing.xml
│ │ ├── activity_location_filter.xml
│ │ ├── activity_location_preferences.xml
│ │ ├── activity_login.xml
│ │ ├── activity_observation_filter.xml
│ │ ├── activity_observation_form_picker.xml
│ │ ├── activity_offline_layers.xml
│ │ ├── activity_online_layers.xml
│ │ ├── activity_profile.xml
│ │ ├── activity_select_edit.xml
│ │ ├── activity_signup.xml
│ │ ├── alert_primary_title.xml
│ │ ├── attachment_viewer.xml
│ │ ├── cleardata_list_item.xml
│ │ ├── connection_status.xml
│ │ ├── date_time_dialog.xml
│ │ ├── dialog_avatar_actions.xml
│ │ ├── dialog_color_picker.xml
│ │ ├── dialog_date_picker.xml
│ │ ├── dialog_form_reorder.xml
│ │ ├── dialog_geometry_field.xml
│ │ ├── dialog_map_search.xml
│ │ ├── dialog_select_field.xml
│ │ ├── dialog_time_picker.xml
│ │ ├── dms_location_edit.xml
│ │ ├── event_header.xml
│ │ ├── event_list_item.xml
│ │ ├── event_list_section_header.xml
│ │ ├── favorite_user_list_item.xml
│ │ ├── feed_footer.xml
│ │ ├── feed_list_item.xml
│ │ ├── feeditem_info_window.xml
│ │ ├── fragement_form.xml
│ │ ├── fragment_alert_banner.xml
│ │ ├── fragment_authentication_idp.xml
│ │ ├── fragment_authentication_ldap.xml
│ │ ├── fragment_authentication_mage.xml
│ │ ├── fragment_cleardata.xml
│ │ ├── fragment_event_favorite.xml
│ │ ├── fragment_event_important.xml
│ │ ├── fragment_feed_people.xml
│ │ ├── fragment_form_picker_bottom_sheet.xml
│ │ ├── fragment_help.xml
│ │ ├── fragment_help_about.xml
│ │ ├── fragment_help_acknowledgement.xml
│ │ ├── fragment_help_disclaimer.xml
│ │ ├── fragment_main.xml
│ │ ├── fragment_map.xml
│ │ ├── fragment_news_feed.xml
│ │ ├── fragment_observation_important.xml
│ │ ├── fragment_observation_remove_important.xml
│ │ ├── fragment_offline_layers.xml
│ │ ├── fragment_online_layers.xml
│ │ ├── fragment_opensource_item.xml
│ │ ├── fragment_password_strength.xml
│ │ ├── fragment_people.xml
│ │ ├── fragment_profile_actions.xml
│ │ ├── fragment_select_field.xml
│ │ ├── geocoder_search_result_list_item.xml
│ │ ├── layer_overlay.xml
│ │ ├── map_preference.xml
│ │ ├── mgrs_location_edit.xml
│ │ ├── navigation_header.xml
│ │ ├── navigation_item_info.xml
│ │ ├── observation_error.xml
│ │ ├── observation_infowindow.xml
│ │ ├── observation_list_item.xml
│ │ ├── offline_layer_child.xml
│ │ ├── offline_layer_group.xml
│ │ ├── offline_layer_sideloaded.xml
│ │ ├── offline_layers_image.xml
│ │ ├── online_layers_list_item.xml
│ │ ├── people_list_item.xml
│ │ ├── preference_category_material_dark.xml
│ │ ├── preference_list_value.xml
│ │ ├── recycler_form_list_item.xml
│ │ ├── saved_locally.xml
│ │ ├── submitted_on.xml
│ │ ├── switch_toolbar.xml
│ │ ├── updated_by.xml
│ │ ├── view_compass.xml
│ │ ├── view_compass_marker.xml
│ │ ├── view_feature_details.xml
│ │ ├── view_feed_item_property.xml
│ │ ├── view_feed_item_summary.xml
│ │ ├── view_form_picker_item.xml
│ │ ├── view_form_reorder_item.xml
│ │ ├── view_important_bottom_sheet.xml
│ │ ├── view_ldap.xml
│ │ ├── view_more_bottom_sheet.xml
│ │ ├── view_observation_form.xml
│ │ ├── view_straight_line_navigation.xml
│ │ └── wgs84_location_edit.xml
│ │ ├── menu
│ │ ├── attachment_save_menu.xml
│ │ ├── cleardata_menu.xml
│ │ ├── edit_select_menu.xml
│ │ ├── fetch_preferences_menu.xml
│ │ ├── filter.xml
│ │ ├── filter_menu.xml
│ │ ├── form_defaults_menu.xml
│ │ ├── form_reorder_menu.xml
│ │ ├── location_edit_menu.xml
│ │ ├── navigation_items.xml
│ │ ├── observation_edit_menu.xml
│ │ ├── observation_new.xml
│ │ ├── offline_layers_menu.xml
│ │ ├── online_layers_menu.xml
│ │ ├── profile_menu.xml
│ │ ├── search.xml
│ │ └── top_navigation_items.xml
│ │ ├── raw
│ │ └── map_theme_night.json
│ │ ├── values-night
│ │ ├── colors.xml
│ │ └── styles.xml
│ │ ├── values-sw600dp
│ │ └── dimens.xml
│ │ ├── values-sw720dp-land
│ │ └── dimens.xml
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ ├── values
│ │ ├── arrays-sdk.xml
│ │ ├── arrays.xml
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── floats.xml
│ │ ├── integers.xml
│ │ ├── material_colors.xml
│ │ ├── pairs-sdk.xml
│ │ ├── pairs.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ │ └── xml
│ │ ├── data_extraction_rules.xml
│ │ ├── fetchpreferences.xml
│ │ ├── filepaths.xml
│ │ ├── generalpreferences.xml
│ │ ├── locationpreferences.xml
│ │ ├── mappreferences.xml
│ │ ├── navigationpreferences.xml
│ │ ├── network_security_config.xml
│ │ ├── setdefaultmdkpreferences.xml
│ │ └── setdefaultpreferences.xml
└── tests
│ ├── AndroidManifest.xml
│ └── src
│ └── mil
│ └── nga
│ └── giat
│ └── mage
│ ├── map
│ ├── WMSTileProviderTest.java
│ ├── cache
│ │ └── CacheProviderTest.kt
│ └── preference
│ │ ├── OfflineLayersAdapterTest.kt
│ │ ├── OfflineLayersPreferenceActivityTest.java
│ │ └── OnlineLayersPreferenceActivityTest.java
│ ├── network
│ └── geometry
│ │ └── GeometryConverterTypeAdapterTest.kt
│ └── tests
│ └── DateFormatFactoryTest.java
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | #java specific
2 | *.class
3 | *.settings
4 |
5 | # Built application files
6 | *.apk
7 | *.ap_
8 |
9 | # Generated files
10 | .gradle/
11 | build/
12 | bin/
13 | gen/
14 | local.properties
15 |
16 | # generic files to ignore
17 | *~
18 | *.lock
19 | *.DS_Store
20 | *.swp
21 | *.out
22 |
23 | # IDE files
24 | .idea/
25 | *.iml
26 |
27 | # mage
28 | bridge
29 |
--------------------------------------------------------------------------------
/.tool-versions:
--------------------------------------------------------------------------------
1 | java openjdk-23
2 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application' version '8.7.2' apply false
3 | id 'com.android.library' version '8.7.2' apply false
4 | id 'org.jetbrains.kotlin.android' version '1.9.25' apply false
5 | id 'com.google.dagger.hilt.android' version '2.51' apply false
6 | }
7 |
8 | tasks.register('clean', Delete) {
9 | delete rootProject.buildDir
10 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | android.useAndroidX=true
2 | android.enableJetifier=true
3 | org.gradle.jvmargs=-Xmx4096m
4 |
5 | # Application properties
6 | android.nonTransitiveRClass=false
7 | android.nonFinalResIds=false
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ngageoint/mage-android/f7449d61309c1d52e0178f01671aeb3c11b74bb9/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu May 06 13:38:17 MDT 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/mage/libs/sanselanandroid.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ngageoint/mage-android/f7449d61309c1d52e0178f01671aeb3c11b74bb9/mage/libs/sanselanandroid.jar
--------------------------------------------------------------------------------
/mage/src/debug/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | MAGE Debug
5 |
6 |
--------------------------------------------------------------------------------
/mage/src/main/assets/fonts/GondolaMage-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ngageoint/mage-android/f7449d61309c1d52e0178f01671aeb3c11b74bb9/mage/src/main/assets/fonts/GondolaMage-Regular.otf
--------------------------------------------------------------------------------
/mage/src/main/assets/markers/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ngageoint/mage-android/f7449d61309c1d52e0178f01671aeb3c11b74bb9/mage/src/main/assets/markers/default.png
--------------------------------------------------------------------------------
/mage/src/main/assets/markers/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ngageoint/mage-android/f7449d61309c1d52e0178f01671aeb3c11b74bb9/mage/src/main/assets/markers/empty.png
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/coordinate/CoordinateSystem.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.coordinate
2 |
3 | enum class CoordinateSystem(val preferenceValue: Int) {
4 | WGS84(0), MGRS(1), DMS(2), GARS(3);
5 |
6 | companion object {
7 | fun fromPreference(preferenceValue: Int): CoordinateSystem {
8 | for (coordinateSystem in values()) {
9 | if (coordinateSystem.preferenceValue == preferenceValue) {
10 | return coordinateSystem
11 | }
12 | }
13 |
14 | return WGS84
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/data/datasource/settings/SettingsLocalDataSource.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.data.datasource.settings
2 |
3 | import mil.nga.giat.mage.database.dao.settings.SettingsDao
4 | import mil.nga.giat.mage.database.model.settings.Settings
5 | import javax.inject.Inject
6 |
7 | class SettingsLocalDataSource @Inject constructor(
8 | private val dao: SettingsDao
9 | ) {
10 | fun upsert(settings: Settings) = dao.upsert(settings)
11 | suspend fun getSettings(): Settings? = dao.getSettings()
12 | fun observeSettings() = dao.observeSettings()
13 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/DateTypeConverter.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database
2 |
3 | import androidx.room.TypeConverter
4 | import java.util.*
5 |
6 | class DateTypeConverter {
7 | @TypeConverter
8 | fun fromTimestamp(value: Long?): Date? {
9 | return value?.let { Date(it) }
10 | }
11 |
12 | @TypeConverter
13 | fun dateToTimestamp(date: Date?): Long? {
14 | return date?.time
15 | }
16 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/GeometryTypeConverter.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database
2 |
3 | import androidx.room.TypeConverter
4 | import mil.nga.giat.mage.sdk.utils.toBytes
5 | import mil.nga.giat.mage.sdk.utils.toGeometry
6 | import mil.nga.sf.Geometry
7 |
8 | class GeometryTypeConverter {
9 |
10 | @TypeConverter
11 | fun fromByteArray(value: ByteArray?): Geometry? {
12 | return value?.toGeometry()
13 | }
14 |
15 | @TypeConverter
16 | fun fromGeometry(geometry: Geometry?): ByteArray? {
17 | return geometry?.toBytes()
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/feed/FeedAndLocal.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.feed
2 |
3 | import androidx.room.Embedded
4 | import androidx.room.Relation
5 |
6 | data class FeedAndLocal(
7 | @Embedded val feed: Feed,
8 | @Relation(
9 | parentColumn = "id",
10 | entityColumn = "feed_id"
11 | )
12 | val local: FeedLocal?
13 | )
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/feed/FeedContent.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.feed
2 |
3 | import com.google.gson.annotations.JsonAdapter
4 | import com.google.gson.annotations.SerializedName
5 | import mil.nga.giat.mage.network.geojson.FeatureCollectionTypeAdapter
6 |
7 |
8 | data class FeedContent(
9 | @SerializedName("items")
10 | @JsonAdapter(FeatureCollectionTypeAdapter::class)
11 | val items: List
12 | )
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/feed/FeedWithItems.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.feed
2 |
3 | import androidx.room.Embedded
4 | import androidx.room.Entity
5 | import androidx.room.Relation
6 |
7 | @Entity
8 | data class FeedWithItems(
9 | @Embedded
10 | val feed: Feed,
11 |
12 | @Relation(parentColumn = "id", entityColumn = "feed_id")
13 | val items: List
14 | )
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/feed/ItemWithFeed.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.feed
2 |
3 | import androidx.room.Embedded
4 | import androidx.room.Entity
5 | import androidx.room.Relation
6 |
7 | @Entity
8 | data class ItemWithFeed(
9 | @Relation(parentColumn = "item_feed_id", entityColumn = "id")
10 | val feed: Feed,
11 |
12 | @Embedded(prefix = "item_")
13 | val item: FeedItem
14 | )
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/observation/State.java:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.observation;
2 |
3 | import mil.nga.giat.mage.database.model.observation.Observation;
4 |
5 | /**
6 | * The State of an {@link Observation}
7 | */
8 | public enum State {
9 | ACTIVE, COMPLETE, ARCHIVE
10 | }
11 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/settings/MapSettings.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.settings
2 |
3 | import androidx.room.ColumnInfo
4 | import com.google.gson.annotations.SerializedName
5 |
6 | enum class MapSearchType {
7 | NONE,
8 | NATIVE,
9 | NOMINATIM
10 | }
11 |
12 | data class MapSettings(
13 | @SerializedName("mobileSearchType")
14 | @ColumnInfo(name = "search_type")
15 | val searchType: MapSearchType,
16 |
17 | @SerializedName("mobileNominatimUrl")
18 | @ColumnInfo(name = "search_url")
19 | val searchUrl : String? = null
20 | )
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/settings/Settings.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.settings
2 |
3 | import androidx.room.*
4 |
5 | @Entity(tableName = "settings")
6 | data class Settings(
7 | @PrimaryKey
8 | @ColumnInfo(name = "id")
9 | val id: Int = 0,
10 |
11 | @Embedded(prefix = "map_")
12 | val mapSettings: MapSettings?
13 | )
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/database/model/user/Phone.java:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.database.model.user;
2 |
3 | import java.io.Serializable;
4 |
5 | public class Phone implements Serializable {
6 |
7 | private static final long serialVersionUID = -2050927399100074414L;
8 |
9 | private String number;
10 |
11 | public String getNumber() {
12 | return number;
13 | }
14 |
15 | public void setNumber(String number) {
16 | this.number = number;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/di/ApplicationModule.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.di
2 |
3 | import android.app.Application
4 | import dagger.Module
5 | import dagger.Provides
6 | import dagger.hilt.InstallIn
7 | import dagger.hilt.components.SingletonComponent
8 | import mil.nga.giat.mage.MageApplication
9 | import javax.inject.Singleton
10 |
11 | @InstallIn(SingletonComponent::class)
12 | @Module
13 | class ApplicationModule {
14 | @Singleton
15 | @Provides
16 | internal fun provideApplication(application: Application): MageApplication {
17 | return application as MageApplication
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/filter/Filter.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.filter
2 |
3 | import com.j256.ormlite.stmt.QueryBuilder
4 | import com.j256.ormlite.stmt.Where
5 | import java.sql.SQLException
6 |
7 | interface Filter {
8 | @Throws(SQLException::class)
9 | fun query(): QueryBuilder<*, Long>?
10 |
11 | @Throws(SQLException::class)
12 | fun and(where: Where<*, Long>)
13 |
14 | fun passesFilter(obj: T): Boolean
15 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/form/edit/dialog/CoordinateChangeListener.java:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.form.edit.dialog;
2 |
3 | import com.google.android.gms.maps.model.LatLng;
4 |
5 | public interface CoordinateChangeListener {
6 | void onCoordinateChangeStart(LatLng coordinate);
7 | void onCoordinateChangeEnd(LatLng coordinate);
8 | void onCoordinateChanged(LatLng coordinate);
9 | }
10 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/glide/model/Avatar.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.glide.model
2 |
3 | import mil.nga.giat.mage.database.model.user.User
4 |
5 | data class Avatar(
6 | val remoteUri: String?,
7 | val localUri: String?,
8 | val lastModified: Long
9 | ) {
10 |
11 | companion object {
12 | fun forUser(user: User): Avatar {
13 | return Avatar(user.avatarUrl, user.userLocal?.localAvatarPath, user.lastModified.time)
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/login/AuthenticationStatus.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.login
2 |
3 | sealed class AuthenticationStatus {
4 | data class Success(val username: String, val token: String): AuthenticationStatus()
5 | data class Offline(val message: String): AuthenticationStatus()
6 | data class Failure(val code: Int, val message: String): AuthenticationStatus()
7 | data class AccountCreated(val message: String): AuthenticationStatus()
8 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/login/AuthorizationStatus.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.login
2 |
3 | import mil.nga.giat.mage.database.model.user.User
4 |
5 | sealed class AuthorizationStatus {
6 | data class Success(
7 | val user: User,
8 | val sessionChanged: Boolean
9 | ): AuthorizationStatus()
10 | data object FailInvalidServer : AuthorizationStatus()
11 | data class FailAuthorization(val user: User? = null) : AuthorizationStatus()
12 | data class FailAuthentication(val user: User? = null, val message: String) : AuthorizationStatus()
13 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/map/annotation/BaseObservationStyle.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.map.annotation
2 |
3 | import android.net.Uri
4 |
5 | //for Point observation image icons
6 | open class BaseObservationStyle(val uri: Uri? = null)
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/map/cache/StaticFeatureCacheOverlay.java:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.map.cache;
2 |
3 | public class StaticFeatureCacheOverlay extends CacheOverlay {
4 |
5 | private final Long myId;
6 |
7 | public StaticFeatureCacheOverlay(String name, Long id) {
8 | super(name, CacheOverlayType.STATIC_FEATURE, false);
9 | myId = id;
10 | }
11 |
12 | public Long getId() {return this.myId;}
13 |
14 | @Override
15 | public void removeFromMap() {
16 |
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/map/preference/LayerNameComparator.java:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.map.preference;
2 |
3 |
4 | import org.apache.commons.lang3.builder.CompareToBuilder;
5 |
6 | import java.util.Comparator;
7 |
8 | import mil.nga.giat.mage.database.model.layer.Layer;
9 |
10 | public class LayerNameComparator implements Comparator {
11 | @Override
12 | public int compare(Layer o1, Layer o2) {
13 | return new CompareToBuilder().append(o1.getName(), o2.getName()).toComparison();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/api/ApiService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.api
2 |
3 | import okhttp3.ResponseBody
4 | import retrofit2.Response
5 | import retrofit2.http.GET
6 | import retrofit2.http.Url
7 |
8 | interface ApiService {
9 | @GET
10 | suspend fun getApi(@Url url: String): Response
11 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/device/DeviceService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.device
2 |
3 | import com.google.gson.JsonObject
4 | import retrofit2.Response
5 | import retrofit2.http.Body
6 | import retrofit2.http.Header
7 | import retrofit2.http.POST
8 |
9 | interface DeviceService {
10 | @POST("/auth/token")
11 | suspend fun authorize(
12 | @Header("Authorization") authorization: String?,
13 | @Header("user-agent") userAgent: String?,
14 | @Body body: JsonObject
15 | ): Response
16 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/event/EventService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.event
2 |
3 | import mil.nga.giat.mage.database.model.event.Event
4 | import retrofit2.Response
5 | import retrofit2.http.GET
6 |
7 | interface EventService {
8 | @GET("/api/events")
9 | suspend fun getEvents(): Response>
10 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/geocoder/NominatimService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.geocoder
2 |
3 | import com.mapbox.geojson.FeatureCollection
4 | import retrofit2.Response
5 | import retrofit2.http.GET
6 | import retrofit2.http.Url
7 |
8 | interface NominatimService {
9 | @GET
10 | suspend fun search(@Url url: String): Response
11 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/gson/AnnotationExclusionStrategy.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.gson
2 |
3 | import com.google.gson.ExclusionStrategy
4 | import com.google.gson.FieldAttributes
5 |
6 | class AnnotationExclusionStrategy : ExclusionStrategy {
7 |
8 | override fun shouldSkipField(f: FieldAttributes): Boolean {
9 | return f.getAnnotation(Exclude::class.java) != null
10 | }
11 |
12 | override fun shouldSkipClass(clazz: Class<*>): Boolean {
13 | return false
14 | }
15 |
16 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/gson/Exclude.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.gson
2 |
3 | @Retention(AnnotationRetention.RUNTIME)
4 | @Target(AnnotationTarget.FIELD)
5 | annotation class Exclude
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/role/RoleService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.role
2 |
3 | import mil.nga.giat.mage.database.model.permission.Role
4 | import retrofit2.Response
5 | import retrofit2.http.GET
6 |
7 | interface RoleService {
8 | @GET("/api/roles")
9 | suspend fun getRoles(): Response>
10 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/settings/SettingsService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.settings
2 |
3 | import mil.nga.giat.mage.database.model.settings.MapSettings
4 | import retrofit2.Response
5 | import retrofit2.http.GET
6 |
7 | interface SettingsService {
8 |
9 | @GET("/api/settings/map")
10 | suspend fun getMapSettings(): Response
11 |
12 | }
--------------------------------------------------------------------------------
/mage/src/main/java/mil/nga/giat/mage/network/team/TeamService.kt:
--------------------------------------------------------------------------------
1 | package mil.nga.giat.mage.network.team
2 |
3 | import mil.nga.giat.mage.database.model.team.Team
4 | import mil.nga.giat.mage.network.user.UserWithRoleId
5 | import retrofit2.Response
6 | import retrofit2.http.GET
7 | import retrofit2.http.Path
8 |
9 | interface TeamService {
10 |
11 | @GET("/api/events/{eventId}/teams?populate=users")
12 | suspend fun getTeams(@Path("eventId") eventId: String?): Response