Overview
The main screen combines a Google map with Hydrant records. Hydrants are stored on the device with latitude, longitude, address or intersection, creation time, and one or more test entries.
Pin hydrants
Long-press the map or use Add Hydrant Here to create a hydrant at the current map position.
Record tests
Save test date, static pressure, residual pressure, pitot gauge pressure, and orifice size.
Calculate GPM
The app calculates GPM from pitot pressure and orifice size.
Move data
Import hydrants from CSV and export all test rows to a CSV file through Android's document picker.
Map
The app uses the native Google Maps SDK for Android and centers on the device location when location permission is available. Map layer choices include road, satellite, terrain, and hybrid.
| Tap map | Updates the pending latitude and longitude used by Add Hydrant Here. |
| Long-press map | Opens the Pin hydrant dialog at that map location. |
| Tap hydrant pin | Selects that hydrant, centers the map, and opens the hydrant details view. |
| Layer button | Opens the map layer picker with Road, Satellite, Terrain, and Hybrid choices. |
Toolbar
The app toolbar uses icon buttons for common field actions, plus a menu for data and display tools.
| Nearest hydrant | Finds the closest pinned hydrant from the current device location, centers the map on it, and shows its approximate distance in feet. |
| Current location | Requests location permission if needed, then centers the map on the current GPS or network location. |
| Add hydrant | Opens the Pin hydrant dialog at the current map coordinates. |
| Menu | Opens Current Location, Nearest Hydrant, Add Hydrant Here, Import Hydrants from CSV, Export List to CSV, Delete All Hydrants, and Dark Mode or Light Mode. |
Records
Each row shows the hydrant label, latest test date, GPM, pressure values, orifice size, and number of saved tests.
| Empty state | When no records exist, the app prompts the user to long-press the map or tap Add to create a hydrant record. |
| Details view | Opening a hydrant shows past tests, a GPM trend graph when there is more than one test, and action buttons. |
| Actions | Use List to return to the record list, Navigate to open directions, New Test to add another test, Edit to change the address or intersection, and Delete to remove the hydrant and its history. |
| Status colors | Record rows are colored by latest GPM range: no test, 0-499, 500-999, 1000-1499, and 1500+. |
Tests And GPM
The Pin hydrant and New hydrant test dialogs collect the same test fields. A new test defaults the test date to today, and imported or saved tests are sorted by date.
| Hydrant field | Address / intersection. |
| Test fields | Test date, static pressure, residual pressure, pitot gauge pressure, and orifice size. |
| Date format | Dates use yyyy-MM-dd. |
| Units | Pressure values are shown as PSI. Orifice size is shown in inches. GPM is calculated automatically. |
| Formula | GPM uses Q = 29.83 * d^2 * sqrt(p), where d is orifice size and p is pitot gauge pressure. |
CSV Import And Export
Export List to CSV writes one row per hydrant test. Import Hydrants from CSV can create hydrants, append tests to matching records, and skip duplicate tests.
| Required import columns | address_or_intersection, latitude, and longitude. |
| Recognized columns | hydrant_id, hydrant_created_at, test_date, address_or_intersection, latitude, longitude, static_pressure, residual_pressure, pitot_pressure, orifice_size, and gpm. |
| Matching | Imports match existing records by hydrant_id when present, otherwise by normalized address. |
| Duplicate tests | A duplicate has the same date, pressure values, orifice size, and imported GPM when GPM is supplied. |
| Export filename | The Android document picker suggests hydrant-records.csv. |
Storage And Permissions
Hydrant records are saved locally on the device. Map tiles require internet access, and nearest/current-location features require location permission and enabled device location.
Navigation opens a maps directions intent for the hydrant coordinates, preferring Google Maps when it is available and falling back to another installed maps app.