@startuml skinparam classAttributeIconSize 0 enum BoatRampStatus { OPEN CLOSED UNKNOWN +toString(): String +_fromString(status: String): BoatRampStatus } skinparam classAttributeIconSize 0 class BoatRampData { -rampNumber: Integer -name: String -status: BoatRampStatus -openTimes: ZonedDateTime -address: String -operator: String -lastUpdated: LocalDate -CACHE_FILE_NAME: String +<> BoatRampData(Integer: rampNumber, name: String, status: BoatRampStatus, openTimes, address: String, operator: String, lastUpdated: LocalDate) +_loadBoatRampData(): ArrayList +saveBoatRampData() +getRampNumber(): Integer +setRampNumber(Integer rampNumber) +getName(): String +setName(newName: String) +getStatus(): BoatRampStatus +setStatus(newStatus: BoatRampStatus) +getOpenTimes(): ZonedDateTime +setOpenTimes(time: ZonedDateTime) +getAddress(): String +setAddress(newAddress: String) +getOperator(): String +setOperator(newOperator: String) +getLastUpdated(): LocalDate +setLastUpdated(newLastUpdatedTime: LocalDate) -_fromJsonStream(in: InputStream): ArrayList +_fetchData(): ArrayList +_loadCachedData(context: Context): ArrayList +_wipeCache(context: Context) +toJson(): JSONObject +_fromJson(json: JSONObject): BoatRampData +_saveData(context: Context, rampData: ArrayList) } skinparam classAttributeIconSize 0 class BoatRampActivity { #onCreate(savedInstanceState: Bundle) } skinparam classAttributeIconSize 0 class MainRampMenuActivity { -executorService: ExecutorService #onCreate(savedInstanceState: Bundle) -launchBoatRampActivity(rampData: BoatRampData) } skinparam classAttributeIconSize 0 class WaterLevelData { -date: Date -waterLevel: double -surfaceArea: double -reservoirStorage: int -conservationStorage: int -percentFull: double -conservationCapacity: int -deadPoolCapacity: int -boolean: isCurrent +<>WaterLevelData(date: Date, level: double, isCurrent: boolean) +getDate(): String +setDate(newDate: Date) +getWaterLevel(): double +setWaterLevel(newLevel: double) +getSurfaceArea(): double +setSurfaceArea(newSurfaceArea: double) +getReservoirStorage(): int +setReservoirStorage(newReservoirStorage: int) +getConservationStorage(): int +setConservationStorage(newConservationStorage: int) +getPercentFull(): double +setPercentFull(newPercentFull: double) +getConservationCapacity(): int +setConservationCapacity(newConservationCapacity: int) +getDeadPoolCapacity(): int +setDeadPoolCapacity(newDeadPoolCapacity: int) +isCurrent(): boolean +setCurrent(isCurrent: boolean) +toString(): String +_getJsonResponseFromApi(): String +__loadWaterLevelData(jsonResponse: String): WaterLevelData +saveWaterLevelData(context: Context) +_loadSavedWaterLevelData(context: Context): WaterLevelData +_clearCache(context: Context) +_forceDataFetch(context: Context) } skinparam classAttributeIconSize 0 class WaterLevelActivity { #onCreate(savedInstanceState: Bundle) } skinparam classAttributeIconSize 0 class MainActivity { #onCreate(savedInstanceState: Bundle) -openSettingsActivity() -openWeatherActivity() -openWaterLevelActivity() -openMainRampMenuActivity() } skinparam classAttributeIconSize 0 class SettingsActivity { executorService: ExecutorService #onCreate(savedInstanceState: Bundle) } skinparam classAttributeIconSize 0 class WeatherActivity { -weatherDescription: TextView -temperature: TextView -windDirection: TextView -windSpeed: TextView -windGust: TextView -chancePrecipitation: TextView -amountPrecipitation: TextView -executorService: ExecutorService #onCreate(savedInstanceState: Bundle) -fetchWeatherData() -onDestroy() -updateUIWithWeatherData(weatherData: WeatherData) } skinparam classAttributeIconSize 0 class WeatherData { -weatherDescription: String -tempHigh: int -tempLow: int -windSpeed: String -gustSpeed: double -windDirection: String -chancePrecipitation: int -amountPrecipitation: double -_CACHE_FILE_NAME: String +<> WeatherData(weatherDescription: String, tempHigh: int, tempLow: int, windSpeed: String, gustSpeed: double, windDirection: String, chancePrecipitation: int, amountPrecipitation: double): +loadWeatherData(): WeatherData +saveWeatherData() -fetchHourlyWeatherData(url: String, weatherData: WeatherData) -fetchGeneralWeatherData(url: String, weatherData: WeatherData) -setupConnection(connection: HttpURLConnection) -readStream(in: InputStream): String -getMaxTemp(values: JSONArray): int -getMinTemp(values: JSONArray): int -sumPrecipitation(values: JSONArray, count: int): double -convertToFahrenheit(celsius: int): int -convertKmhToMph(kmh: double) double -convertMmToInches(mm: double) double +saveWeatherData() +toString(): String +getWeatherDescription(): String +setWeatherDescription(weatherDescription: String) +getTempHigh(): int +setTempHigh(tempHigh: int) +getTempLow(): int +setTempLow(tempLow: int) +getWindSpeed(): String +setWindSpeed(windSpeed: String) +getWindGust(): double +setWindGust(windGust: double) +getWindDirection(): String +setWindDirection(windDirection: String): +getChancePrecipitation(): int +setChancePrecipitation(chancePrecipitation: int) +getAmountPrecipitation(): double +setAmountPrecipitation(amountPrecipitation: double) +_wipeCache(context: Context) } SettingsActivity <.u. MainActivity WeatherActivity ..> WeatherData WeatherActivity <.u. MainActivity BoatRampActivity ..> BoatRampData MainRampMenuActivity o-- BoatRampData MainRampMenuActivity <.u. MainActivity MainRampMenuActivity ..> BoatRampActivity WaterLevelActivity ..> WaterLevelData WaterLevelActivity <.u. MainActivity BoatRampData o-- BoatRampStatus @enduml