From 2d54ea06cc229e8d074128715431d6cf3292ddc1 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Wed, 16 Dec 2020 20:26:53 +0100 Subject: [PATCH] first commit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/gradle.xml | 22 ++ .idea/jarRepositories.xml | 30 +++ .idea/misc.xml | 9 + app/.gitignore | 1 + app/build.gradle | 52 +++++ app/proguard-rules.pro | 21 ++ .../pogodacc/ExampleInstrumentedTest.java | 26 +++ app/src/main/AndroidManifest.xml | 27 +++ .../activity/AllStationsActivity.java | 41 ++++ .../pogodacc/activity/MainActivity.java | 44 ++++ .../activity/StationDetailsActivity.java | 110 ++++++++++ .../activity/StationDetailsPlotsWind.java | 192 ++++++++++++++++++ .../StationDetailsSummaryActivity.java | 73 +++++++ ...ationsActRecyclerViewButtonClickEvent.java | 34 ++++ ...inActImageButtonAllStationsClickEvent.java | 34 ++++ ...tationDetailsActPlotsButtonClickEvent.java | 32 +++ ...tionDetailsActSummaryButtonClickEvent.java | 34 ++++ .../activity/handler/WindPlotClickEvent.java | 25 +++ .../StationDetailsSummaryValUpdater.java | 45 ++++ .../AllStationsActRecyclerViewHolder.java | 25 +++ .../WeatherStationRecyclerViewAdapter.java | 67 ++++++ .../mobile/pogodacc/dao/AllStationsDao.java | 78 +++++++ .../pogodacc/dao/LastStationDataDao.java | 54 +++++ .../mobile/pogodacc/dao/SummaryDao.java | 57 ++++++ .../pogodacc/dao/mock/AllStationsDaoMock.java | 19 ++ .../pogodacc/type/AvailableParameters.java | 18 ++ .../pogodacc/type/CustomLocalDateTime.java | 12 ++ .../type/StationSummaryActElements.java | 78 +++++++ .../mobile/pogodacc/type/WeatherStation.java | 76 +++++++ .../pogodacc/type/web/ListOfAllStations.java | 7 + .../pogodacc/type/web/ListOfStationData.java | 6 + .../mobile/pogodacc/type/web/StationData.java | 39 ++++ .../pogodacc/type/web/StationDefinition.java | 37 ++++ .../mobile/pogodacc/type/web/Summary.java | 35 ++++ .../pogodacc/web/LastStationDataConsumer.java | 14 ++ .../mobile/pogodacc/web/RestClientConfig.java | 25 +++ .../pogodacc/web/StationListConsumer.java | 13 ++ .../mobile/pogodacc/web/SummaryConsumer.java | 13 ++ .../CustomLocalDateTimeDeserializer.java | 38 ++++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_baseline_equalizer_24.xml | 10 + .../res/drawable/ic_baseline_favorite_24.xml | 10 + .../main/res/drawable/ic_baseline_menu_24.xml | 10 + .../res/drawable/ic_baseline_timer_24.xml | 10 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ .../main/res/layout/activity_all_stations.xml | 15 ++ .../activity_all_stations_linear_layout.xml | 26 +++ app/src/main/res/layout/activity_main.xml | 121 +++++++++++ .../res/layout/activity_station_details.xml | 164 +++++++++++++++ .../activity_station_details_plots_wind.xml | 35 ++++ .../activity_station_details_summary.xml | 180 ++++++++++++++++ app/src/main/res/menu/main_activity_menu.xml | 5 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes app/src/main/res/values-en-rUS/strings.xml | 41 ++++ app/src/main/res/values-lv-rLV/strings.xml | 41 ++++ app/src/main/res/values-lv/strings.xml | 41 ++++ app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values-pl-rPL/strings.xml | 41 ++++ app/src/main/res/values-pl/strings.xml | 41 ++++ app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/strings.xml | 40 ++++ app/src/main/res/values/themes.xml | 16 ++ ..._details_xml_constraintlayoutfav_scene.xml | 19 ++ .../mobile/pogodacc/ExampleUnitTest.java | 17 ++ build.gradle | 24 +++ gradle.properties | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++++++ gradlew.bat | 84 ++++++++ settings.gradle | 2 + 86 files changed, 3014 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/cc/pogoda/mobile/pogodacc/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/AllStationsActivity.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/MainActivity.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsActivity.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/AllStationsActRecyclerViewButtonClickEvent.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/MainActImageButtonAllStationsClickEvent.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActPlotsButtonClickEvent.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActSummaryButtonClickEvent.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/WindPlotClickEvent.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsSummaryValUpdater.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/view/AllStationsActRecyclerViewHolder.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/dao/AllStationsDao.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/dao/LastStationDataDao.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/dao/mock/AllStationsDaoMock.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/AvailableParameters.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/CustomLocalDateTime.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/WeatherStation.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfAllStations.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfStationData.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationData.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationDefinition.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/web/LastStationDataConsumer.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/web/RestClientConfig.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/web/StationListConsumer.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/web/SummaryConsumer.java create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/web/deserializer/CustomLocalDateTimeDeserializer.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_baseline_equalizer_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_favorite_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_menu_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_timer_24.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_all_stations.xml create mode 100644 app/src/main/res/layout/activity_all_stations_linear_layout.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_station_details.xml create mode 100644 app/src/main/res/layout/activity_station_details_plots_wind.xml create mode 100644 app/src/main/res/layout/activity_station_details_summary.xml create mode 100644 app/src/main/res/menu/main_activity_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-en-rUS/strings.xml create mode 100644 app/src/main/res/values-lv-rLV/strings.xml create mode 100644 app/src/main/res/values-lv/strings.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-pl-rPL/strings.xml create mode 100644 app/src/main/res/values-pl/strings.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/activity_station_details_xml_constraintlayoutfav_scene.xml create mode 100644 app/src/test/java/cc/pogoda/mobile/pogodacc/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..9c6e919 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Pogoda.cc \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..23a89bb --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..2370474 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d5d35ec --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a043bde --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,52 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "cc.pogoda.mobile.pogodacc" + minSdkVersion 24 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +repositories { + maven { url 'https://jitpack.io' } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + implementation 'com.squareup.retrofit2:retrofit:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.google.code.gson:gson:2.8.2' + implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1' + implementation 'com.squareup.okhttp3:okhttp:3.9.1' + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/cc/pogoda/mobile/pogodacc/ExampleInstrumentedTest.java b/app/src/androidTest/java/cc/pogoda/mobile/pogodacc/ExampleInstrumentedTest.java new file mode 100644 index 0000000..8192780 --- /dev/null +++ b/app/src/androidTest/java/cc/pogoda/mobile/pogodacc/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package cc.pogoda.mobile.pogodacc; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("cc.pogoda.mobile.pogodacc", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..de9fed9 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/AllStationsActivity.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/AllStationsActivity.java new file mode 100644 index 0000000..51143f1 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/AllStationsActivity.java @@ -0,0 +1,41 @@ +package cc.pogoda.mobile.pogodacc.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.adapter.WeatherStationRecyclerViewAdapter; +import cc.pogoda.mobile.pogodacc.dao.AllStationsDao; +import cc.pogoda.mobile.pogodacc.dao.LastStationDataDao; +import cc.pogoda.mobile.pogodacc.dao.SummaryDao; +import cc.pogoda.mobile.pogodacc.dao.mock.AllStationsDaoMock; +import cc.pogoda.mobile.pogodacc.type.web.ListOfStationData; +import cc.pogoda.mobile.pogodacc.type.web.Summary; + +import android.os.Bundle; + +import java.io.IOException; + +public class AllStationsActivity extends AppCompatActivity { + + RecyclerView recyclerViewAllStations; + + Summary test; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_all_stations); + + recyclerViewAllStations = findViewById(R.id.recyclerViewAllStations); + + WeatherStationRecyclerViewAdapter adapter = null; + + adapter = new WeatherStationRecyclerViewAdapter(new AllStationsDao().getAllStations(), this); + + recyclerViewAllStations.setAdapter(adapter); + + recyclerViewAllStations.setLayoutManager(new LinearLayoutManager(this)); + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/MainActivity.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/MainActivity.java new file mode 100644 index 0000000..14ebc50 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/MainActivity.java @@ -0,0 +1,44 @@ +package cc.pogoda.mobile.pogodacc.activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.view.Menu; +import android.widget.ImageButton; + +import java.util.Locale; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.activity.handler.MainActImageButtonAllStationsClickEvent; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Locale locale = new Locale("pl"); + Locale.setDefault(locale); + Resources resources = this.getResources(); + Configuration config = resources.getConfiguration(); + config.setLocale(locale); + resources.updateConfiguration(config, resources.getDisplayMetrics()); + + setContentView(R.layout.activity_main); + + ImageButton imageButtonAllStations = (ImageButton)findViewById(R.id.imageButtonAllStations); + if (imageButtonAllStations != null) + imageButtonAllStations.setOnClickListener(new MainActImageButtonAllStationsClickEvent(this)); + + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main_activity_menu, menu); + return true; + } + +} \ No newline at end of file diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsActivity.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsActivity.java new file mode 100644 index 0000000..67d677f --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsActivity.java @@ -0,0 +1,110 @@ +package cc.pogoda.mobile.pogodacc.activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.TextView; + +import java.io.Serializable; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.activity.handler.StationDetailsActPlotsButtonClickEvent; +import cc.pogoda.mobile.pogodacc.activity.handler.StationDetailsActSummaryButtonClickEvent; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; + +public class StationDetailsActivity extends AppCompatActivity { + + WeatherStation station; + + TextView stationName = null; + TextView stationLocation = null; + TextView stationLatLon = null; + TextView stationSponsorUrl = null; + + ImageButton summaryButton = null; + ImageButton plotsButton = null; + + StationDetailsActSummaryButtonClickEvent summaryClickEvent = null; + StationDetailsActPlotsButtonClickEvent plotsClickEvent = null; + + public StationDetailsActivity() { + stationName = null; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + float station_lat = 0.0f; // szerokość W - E + float station_lon = 0.0f; // długość S - N + + StringBuilder sb = new StringBuilder(); + + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_station_details); + + station = (WeatherStation) getIntent().getSerializableExtra("station"); + + stationName = findViewById(R.id.textViewStationName); + stationLocation = findViewById(R.id.textViewLocalization); + stationLatLon = findViewById(R.id.textViewLatLon); + stationSponsorUrl = findViewById(R.id.textViewSponsorUrl); + + if (station != null && stationName != null) { + + summaryClickEvent = new StationDetailsActSummaryButtonClickEvent(station, this); + plotsClickEvent = new StationDetailsActPlotsButtonClickEvent(station, this); + + summaryButton = findViewById(R.id.imageButtonCurrent); + summaryButton.setOnClickListener(summaryClickEvent); + + plotsButton = findViewById(R.id.imageButtonPlots); + plotsButton.setOnClickListener(plotsClickEvent); + + stationName.setText(station.getDisplayedName()); + stationLocation.setText(station.getDisplayedLocation()); + + station_lat = station.getLat(); + station_lon = station.getLon(); + + stationSponsorUrl.setText(station.getSponsorUrl()); + + if (station_lat > 0.0f && station_lon > 0.0f) { + // europe + sb.append(station_lon); + sb.append(" N / "); + sb.append(station_lat); + sb.append(" E"); + + stationLatLon.setText(sb.toString()); + } else if (station_lat < 0.0f && station_lon > 0.0f) { + // usa + sb.append(station_lon); + sb.append(" N / "); + sb.append(-station_lat); + sb.append(" W"); + + stationLatLon.setText(sb.toString()); + } else if (station_lat < 0.0f && station_lon < 0.0f) { + // brazil + sb.append(-station_lon); + sb.append(" S / "); + sb.append(-station_lat); + sb.append(" W"); + + stationLatLon.setText(sb.toString()); + } else if (station_lat > 0.0f && station_lat > 0.0f) { + // australia + sb.append(-station_lon); + sb.append(" S / "); + sb.append(station_lat); + sb.append(" E"); + + stationLatLon.setText(sb.toString()); + } + + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java new file mode 100644 index 0000000..957bf3a --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java @@ -0,0 +1,192 @@ +package cc.pogoda.mobile.pogodacc.activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.graphics.Color; +import android.graphics.Typeface; +import android.os.Bundle; +import android.view.MenuItem; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.github.mikephil.charting.charts.LineChart; +import com.github.mikephil.charting.components.AxisBase; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.formatter.IAxisValueFormatter; +import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; +import com.github.mikephil.charting.utils.ColorTemplate; +import com.github.mikephil.charting.utils.ViewPortHandler; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.activity.handler.WindPlotClickEvent; +import cc.pogoda.mobile.pogodacc.dao.LastStationDataDao; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; +import cc.pogoda.mobile.pogodacc.type.web.ListOfStationData; +import cc.pogoda.mobile.pogodacc.type.web.StationData; + +public class StationDetailsPlotsWind extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { + + private LineChart chart; + private SeekBar seekBarX; + private TextView tvX; + + private LastStationDataDao lastStationDataDao; + private WeatherStation station; + + private WindPlotClickEvent plotClickEvent; + + private class ValueFormatter extends com.github.mikephil.charting.formatter.ValueFormatter { + + private final SimpleDateFormat mFormat = new SimpleDateFormat("dd MMM HH:mm", Locale.ENGLISH); + + + @Override + public String getFormattedValue(float value) { + Date date; + + long millis = (long) value; + date = new Date(millis); + return mFormat.format(date); + } + + } + + public StationDetailsPlotsWind() { + lastStationDataDao = new LastStationDataDao(); + plotClickEvent = new WindPlotClickEvent(); + + //station = stationSystemName; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_station_details_plots_wind); + + station = (WeatherStation) getIntent().getSerializableExtra("station"); + + Typeface tfLight = Typeface.MONOSPACE; + + setTitle("LineChartTime"); + + tvX = findViewById(R.id.tvXMax); + seekBarX = findViewById(R.id.seekBar1); + chart = findViewById(R.id.chart1); + + // enable scaling and dragging + chart.setDragEnabled(true); + chart.setScaleEnabled(true); + chart.setDrawGridBackground(false); + chart.setHighlightPerDragEnabled(true); + + // set an alternative background color + chart.setBackgroundColor(Color.WHITE); + chart.setViewPortOffsets(0f, 0f, 0f, 0f); + + // add data + seekBarX.setProgress(100); + seekBarX.setOnSeekBarChangeListener(this); + + XAxis xAxis = chart.getXAxis(); + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); + xAxis.setTypeface(tfLight); + xAxis.setTextSize(10f); + xAxis.setTextColor(Color.WHITE); + xAxis.setDrawAxisLine(false); + xAxis.setDrawGridLines(true); + xAxis.setTextColor(Color.rgb(255, 192, 56)); + xAxis.setCenterAxisLabels(true); + xAxis.setGranularity(1f); // one hour + xAxis.setValueFormatter(new ValueFormatter()); + + YAxis leftAxis = chart.getAxisLeft(); + leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); + leftAxis.setTypeface(tfLight); + leftAxis.setTextColor(ColorTemplate.getHoloBlue()); + leftAxis.setDrawGridLines(true); + leftAxis.setGranularityEnabled(true); + leftAxis.setAxisMinimum(0.0f); + leftAxis.setAxisMaximum(24.0f); + leftAxis.setYOffset(0.0f); + leftAxis.setTextColor(Color.rgb(255, 192, 56)); + + YAxis rightAxis = chart.getAxisRight(); + rightAxis.setEnabled(false); + + this.setData(); + } + + private void setData() { + ListOfStationData data = lastStationDataDao.getLastStationData(station.getSystemName()); + + ArrayList values_wind_speed = new ArrayList<>(); + + if (data instanceof ListOfStationData) { + for (StationData d : data.listOfStationData) { + values_wind_speed.add(new Entry(d.epoch * 1000, d.windspeed)); + } + + // create a dataset and give it a type + LineDataSet set1 = new LineDataSet(values_wind_speed, "Wind Speed"); + set1.setAxisDependency(YAxis.AxisDependency.LEFT); + set1.setColor(ColorTemplate.getHoloBlue()); + set1.setValueTextColor(ColorTemplate.getHoloBlue()); + set1.setLineWidth(3.5f); + set1.setDrawCircles(true); + set1.setDrawValues(true); + set1.setFillAlpha(65); + set1.setFillColor(ColorTemplate.getHoloBlue()); + set1.setHighLightColor(Color.rgb(244, 117, 117)); + set1.setDrawCircleHole(false); + + // create a data object with the data sets + LineData line_data = new LineData(set1); + line_data.setValueTextColor(Color.WHITE); + line_data.setValueTextSize(9f); + + // set data + chart.setData(line_data); + chart.setDoubleTapToZoomEnabled(true); + chart.setOnChartValueSelectedListener(plotClickEvent); + } + + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + return true; + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + + tvX.setText(String.valueOf(seekBarX.getProgress())); + + //setData(seekBarX.getProgress(), 50); + + // redraw + chart.invalidate(); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java new file mode 100644 index 0000000..8c6670a --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java @@ -0,0 +1,73 @@ +package cc.pogoda.mobile.pogodacc.activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +import org.w3c.dom.Text; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.activity.updater.StationDetailsSummaryValUpdater; +import cc.pogoda.mobile.pogodacc.dao.SummaryDao; +import cc.pogoda.mobile.pogodacc.type.StationSummaryActElements; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; +import cc.pogoda.mobile.pogodacc.type.web.Summary; + +public class StationDetailsSummaryActivity extends AppCompatActivity { + + StationSummaryActElements elems = null; + + WeatherStation station = null; + + StationDetailsSummaryValUpdater updater = null; + + Handler handler = null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + elems = new StationSummaryActElements(); + + Summary summary = null; + SummaryDao summary_dao = new SummaryDao(); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_station_details_summary); + + station = (WeatherStation) getIntent().getSerializableExtra("station"); + + elems.title = findViewById(R.id.textViewStationDetailsSummaryTitle); + elems.title.setText(station.getDisplayedName()); + + elems.wind_dir_val = findViewById(R.id.textViewWinddirValue); + elems.wind_gusts_val = findViewById(R.id.textViewWindGustsValue); + elems.wind_speed_val = findViewById(R.id.textViewWindSpeedValue); + elems.temperature_val = findViewById(R.id.textViewTemperatureValue); + elems.qnh_val = findViewById(R.id.textViewQnhVaue); + + summary = summary_dao.getStationSummary(station.getSystemName()); + + elems.updateFromSummary(summary); + + handler = new Handler(); + updater = new StationDetailsSummaryValUpdater(elems, handler, station.getSystemName()); + + if (handler != null && updater != null) { + handler.post(updater); + } + + + } + + @Override + protected void onStop() { + + if (handler != null && updater != null) { + handler.removeCallbacks(updater); + } + + super.onStop(); + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/AllStationsActRecyclerViewButtonClickEvent.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/AllStationsActRecyclerViewButtonClickEvent.java new file mode 100644 index 0000000..0268e19 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/AllStationsActRecyclerViewButtonClickEvent.java @@ -0,0 +1,34 @@ +package cc.pogoda.mobile.pogodacc.activity.handler; + +import android.content.Intent; +import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; + +import cc.pogoda.mobile.pogodacc.activity.StationDetailsActivity; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; + +public class AllStationsActRecyclerViewButtonClickEvent implements View.OnClickListener { + + WeatherStation station; + + AppCompatActivity p; + + Intent intent; + + public AllStationsActRecyclerViewButtonClickEvent(WeatherStation wx, AppCompatActivity parent) { + station = wx; + p = parent; + + } + + @Override + public void onClick(View v) { + intent = new Intent(p, StationDetailsActivity.class); + intent.putExtra("station", station); + + p.startActivity(intent); + + return; + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/MainActImageButtonAllStationsClickEvent.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/MainActImageButtonAllStationsClickEvent.java new file mode 100644 index 0000000..f363067 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/MainActImageButtonAllStationsClickEvent.java @@ -0,0 +1,34 @@ +package cc.pogoda.mobile.pogodacc.activity.handler; + +import android.content.Intent; +import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; + +import cc.pogoda.mobile.pogodacc.activity.AllStationsActivity; + +public class MainActImageButtonAllStationsClickEvent implements View.OnClickListener { + + AppCompatActivity parent; + + Intent intent; + + public MainActImageButtonAllStationsClickEvent(AppCompatActivity parent) { + this.parent = parent; + + intent = new Intent(this.parent, AllStationsActivity.class); + + + } + + @Override + public void onClick(View v) { + launchActivity(); + + return; + } + + private void launchActivity() { + parent.startActivity(intent); + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActPlotsButtonClickEvent.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActPlotsButtonClickEvent.java new file mode 100644 index 0000000..59be227 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActPlotsButtonClickEvent.java @@ -0,0 +1,32 @@ +package cc.pogoda.mobile.pogodacc.activity.handler; + +import android.content.Intent; +import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; + +import cc.pogoda.mobile.pogodacc.activity.StationDetailsPlotsWind; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; + +public class StationDetailsActPlotsButtonClickEvent implements View.OnClickListener { + + WeatherStation station; + + AppCompatActivity p; + + Intent intent; + + public StationDetailsActPlotsButtonClickEvent(WeatherStation wx, AppCompatActivity parent) { + station = wx; + + p = parent; + } + + @Override + public void onClick(View view) { + intent = new Intent(p, StationDetailsPlotsWind.class); + intent.putExtra("station", station); + + p.startActivity(intent); + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActSummaryButtonClickEvent.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActSummaryButtonClickEvent.java new file mode 100644 index 0000000..6238d35 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/StationDetailsActSummaryButtonClickEvent.java @@ -0,0 +1,34 @@ +package cc.pogoda.mobile.pogodacc.activity.handler; + +import android.content.Intent; +import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; + +import cc.pogoda.mobile.pogodacc.activity.StationDetailsActivity; +import cc.pogoda.mobile.pogodacc.activity.StationDetailsSummaryActivity; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; + +public class StationDetailsActSummaryButtonClickEvent implements View.OnClickListener { + + WeatherStation station; + + AppCompatActivity p; + + Intent intent; + + public StationDetailsActSummaryButtonClickEvent(WeatherStation wx, AppCompatActivity parent) { + station = wx; + + p = parent; + } + + @Override + public void onClick(View view) { + intent = new Intent(p, StationDetailsSummaryActivity.class); + intent.putExtra("station", station); + + p.startActivity(intent); + + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/WindPlotClickEvent.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/WindPlotClickEvent.java new file mode 100644 index 0000000..80535f3 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/handler/WindPlotClickEvent.java @@ -0,0 +1,25 @@ +package cc.pogoda.mobile.pogodacc.activity.handler; + +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.listener.OnChartValueSelectedListener; + +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; + +public class WindPlotClickEvent implements OnChartValueSelectedListener { + + @Override + public void onValueSelected(Entry e, Highlight h) { + float value = e.getX(); + long value_int = (long) value; + Date date = new Date(value_int); + return; + } + + @Override + public void onNothingSelected() { + + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsSummaryValUpdater.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsSummaryValUpdater.java new file mode 100644 index 0000000..3997256 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsSummaryValUpdater.java @@ -0,0 +1,45 @@ +package cc.pogoda.mobile.pogodacc.activity.updater; + +import android.os.Handler; + +import cc.pogoda.mobile.pogodacc.dao.SummaryDao; +import cc.pogoda.mobile.pogodacc.type.StationSummaryActElements; +import cc.pogoda.mobile.pogodacc.type.web.Summary; + +public class StationDetailsSummaryValUpdater implements Runnable { + + StationSummaryActElements elements = null; + + Handler handler = null; + + SummaryDao dao = null; + + Summary station_summary = null; + + String station_name; + + public StationDetailsSummaryValUpdater(StationSummaryActElements elems, Handler h, String s) { + elements = elems; + handler = h; + station_name = s; + + dao = new SummaryDao(); + } + + + @Override + public void run() { + + if (elements == null) { + return; + } + else { + station_summary = dao.getStationSummary(station_name); + + elements.updateFromSummary(station_summary); + + handler.postDelayed(this, 90000); + } + + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/view/AllStationsActRecyclerViewHolder.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/view/AllStationsActRecyclerViewHolder.java new file mode 100644 index 0000000..be5eee0 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/view/AllStationsActRecyclerViewHolder.java @@ -0,0 +1,25 @@ +package cc.pogoda.mobile.pogodacc.activity.view; + +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.activity.handler.AllStationsActRecyclerViewButtonClickEvent; + +public class AllStationsActRecyclerViewHolder extends RecyclerView.ViewHolder { + + public TextView textView; + public Button button; + + public AllStationsActRecyclerViewHolder(@NonNull View itemView) { + super(itemView); + + textView = itemView.findViewById(R.id.station_name); + button = itemView.findViewById(R.id.station_button); + + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java new file mode 100644 index 0000000..93bd47c --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java @@ -0,0 +1,67 @@ +package cc.pogoda.mobile.pogodacc.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.activity.handler.AllStationsActRecyclerViewButtonClickEvent; +import cc.pogoda.mobile.pogodacc.activity.view.AllStationsActRecyclerViewHolder; +import cc.pogoda.mobile.pogodacc.type.WeatherStation; + +public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter { + + private List stations; + + AppCompatActivity activity; + + public WeatherStationRecyclerViewAdapter(List stations, AppCompatActivity parentActivity) { + this.stations = stations; + this.activity = parentActivity; + } + + @NonNull + @Override + public AllStationsActRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + Context context = parent.getContext(); + LayoutInflater inflater = LayoutInflater.from(context); + + // Inflate the custom layout + View view = inflater.inflate(R.layout.activity_all_stations_linear_layout, parent, false); + + // Return a new holder instance + AllStationsActRecyclerViewHolder viewHolder = new AllStationsActRecyclerViewHolder(view); + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull AllStationsActRecyclerViewHolder holder, int position) { + TextView textView = holder.textView; + Button button = holder.button; + + WeatherStation station = stations.get(position); + + if (station != null) { + textView.setText(station.getDisplayedName()); + button.setText(R.string.select_station); + + button.setOnClickListener(new AllStationsActRecyclerViewButtonClickEvent(station, activity)); + } + + } + + @Override + public int getItemCount() { + return stations.size(); + } + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/AllStationsDao.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/AllStationsDao.java new file mode 100644 index 0000000..66d3100 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/AllStationsDao.java @@ -0,0 +1,78 @@ +package cc.pogoda.mobile.pogodacc.dao; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import cc.pogoda.mobile.pogodacc.type.WeatherStation; +import cc.pogoda.mobile.pogodacc.type.web.ListOfAllStations; +import cc.pogoda.mobile.pogodacc.type.web.StationDefinition; +import cc.pogoda.mobile.pogodacc.web.RestClientConfig; +import cc.pogoda.mobile.pogodacc.web.StationListConsumer; +import retrofit2.Response; + +public class AllStationsDao { + + RestClientConfig restClient; + + ListOfAllStations intermediate; + + Response resp = null; + + class Worker implements Runnable { + + @Override + public void run() { + restClient = new RestClientConfig(); + + StationListConsumer consumer = restClient.getWeatherStationClient().create(StationListConsumer.class); + + try { + resp = consumer.getAllStations().execute(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public List getAllStations() { + List out = null; + + Thread worker = new Thread(new Worker()); + + worker.start(); + + try { + worker.join(); + + if (resp != null) { + intermediate = resp.body(); + + if (intermediate != null) { + + out = new LinkedList(); + + for (StationDefinition def : intermediate.stations) { + WeatherStation elem = new WeatherStation(); + + elem.setSystemName(def.name); + elem.setDisplayedLocation(def.displayedLocation); + elem.setDisplayedName(def.displayedName); + elem.setLat(def.lat); + elem.setLon(def.lon); + elem.setSponsorUrl(def.sponsorUrl); + + out.add(elem); + } + } + + } + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return out; + } + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/LastStationDataDao.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/LastStationDataDao.java new file mode 100644 index 0000000..a0ec3f2 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/LastStationDataDao.java @@ -0,0 +1,54 @@ +package cc.pogoda.mobile.pogodacc.dao; + +import cc.pogoda.mobile.pogodacc.type.web.ListOfStationData; +import cc.pogoda.mobile.pogodacc.web.LastStationDataConsumer; +import cc.pogoda.mobile.pogodacc.web.RestClientConfig; +import cc.pogoda.mobile.pogodacc.web.StationListConsumer; +import retrofit2.Response; + +public class LastStationDataDao { + RestClientConfig restClient; + + Response response = null; + + String station; + + class Worker implements Runnable { + + @Override + public void run() { + restClient = new RestClientConfig(); + + LastStationDataConsumer consumer = restClient.getWeatherStationClient().create(LastStationDataConsumer.class); + + try { + response = consumer.getLastDataForStation(station, true, true).execute(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public ListOfStationData getLastStationData(String station) { + + ListOfStationData out = null; + + this.station = station; + + Thread worker = new Thread(new Worker()); + + worker.start(); + + try { + worker.join(); + + if (response != null) { + out = response.body(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return out; + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java new file mode 100644 index 0000000..d965059 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java @@ -0,0 +1,57 @@ +package cc.pogoda.mobile.pogodacc.dao; + +import java.io.IOException; + +import cc.pogoda.mobile.pogodacc.type.web.Summary; +import cc.pogoda.mobile.pogodacc.web.RestClientConfig; +import cc.pogoda.mobile.pogodacc.web.SummaryConsumer; +import retrofit2.Response; + +public class SummaryDao { + + RestClientConfig restClient; + + Response response = null; + + String station; + + class Worker implements Runnable { + + @Override + public void run() { + restClient = new RestClientConfig(); + + SummaryConsumer consumer = restClient.getWeatherStationClient().create(SummaryConsumer.class); + + try { + response = consumer.getSummaryForStation(station).execute(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public Summary getStationSummary(String station) { + + Summary out = null; + + this.station = station; + + Thread worker = new Thread(new Worker()); + + worker.start(); + + try { + worker.join(); + + if (response != null) { + out = response.body(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return out; + + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/mock/AllStationsDaoMock.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/mock/AllStationsDaoMock.java new file mode 100644 index 0000000..245dd76 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/mock/AllStationsDaoMock.java @@ -0,0 +1,19 @@ +package cc.pogoda.mobile.pogodacc.dao.mock; + +import java.util.LinkedList; +import java.util.List; + +import cc.pogoda.mobile.pogodacc.type.WeatherStation; + +public class AllStationsDaoMock { + + public List getAllStations() { + + LinkedList out = new LinkedList<>(); + + out.add(new WeatherStation("Skrzyczne")); + out.add(new WeatherStation("Magurka")); + + return out; + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/AvailableParameters.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/AvailableParameters.java new file mode 100644 index 0000000..c9c19d7 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/AvailableParameters.java @@ -0,0 +1,18 @@ +package cc.pogoda.mobile.pogodacc.type; + +public class AvailableParameters { + + public boolean windSpeed; + + public boolean windGusts; + + public boolean windDirection; + + public boolean airTemperature; + + public boolean waterTemperature; + + public boolean qnh; + + public boolean humidity; +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/CustomLocalDateTime.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/CustomLocalDateTime.java new file mode 100644 index 0000000..c37b99a --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/CustomLocalDateTime.java @@ -0,0 +1,12 @@ +package cc.pogoda.mobile.pogodacc.type; + +import com.google.gson.JsonObject; + +import java.util.Calendar; + +public class CustomLocalDateTime { + + public JsonObject origin; + + public Calendar calendar; +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java new file mode 100644 index 0000000..73358fb --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java @@ -0,0 +1,78 @@ +package cc.pogoda.mobile.pogodacc.type; + +import android.widget.TextView; + +import cc.pogoda.mobile.pogodacc.type.web.Summary; + +public class StationSummaryActElements { + + public TextView title = null; + public TextView wind_speed_val = null; + public TextView wind_gusts_val = null; + public TextView wind_dir_val = null; + public TextView temperature_val = null; + public TextView qnh_val = null; + public TextView humidity_val = null; + + private String convertDegreesToDir(int directionInDegrees) { + String out = null; + + if (directionInDegrees <= 11 || directionInDegrees >= 349) + out = "N"; + else if (directionInDegrees <= 34 && directionInDegrees > 11) + out = "N NE"; + else if (directionInDegrees <= 56 && directionInDegrees > 34) + out = "NE"; + else if (directionInDegrees <= 79 && directionInDegrees > 56) + out = "E NE"; + else if (directionInDegrees <= 101 && directionInDegrees > 79) + out = "E"; + else if (directionInDegrees <= 124 && directionInDegrees > 101) + out = "E SE"; + else if (directionInDegrees <= 146 && directionInDegrees > 124) + out = "SE"; + else if (directionInDegrees <= 169 && directionInDegrees > 146) + out = "S SE"; + else if (directionInDegrees <= 191 && directionInDegrees > 169) + out = "S"; + else if (directionInDegrees <= 214 && directionInDegrees > 191) + out = "S SW"; + else if (directionInDegrees <= 236 && directionInDegrees > 214) + out = "SW"; + else if (directionInDegrees <= 259 && directionInDegrees > 236) + out = "W SW"; + else if (directionInDegrees <= 281 && directionInDegrees > 259) + out = "W"; + else if (directionInDegrees <= 304 && directionInDegrees > 281) + out = "W NW"; + else if (directionInDegrees <= 327 && directionInDegrees > 304) + out = "NW"; + else if (directionInDegrees <= 349 && directionInDegrees > 327) + out = "N NW"; + else; + + + return out; + } + + public void updateFromSummary(Summary s) { + if (wind_speed_val != null) + wind_speed_val.setText(String.format("%.1f m/s", s.average_speed)); + + if (wind_gusts_val != null) + wind_gusts_val.setText(String.format("%.1f m/s", s.gusts)); + + if (wind_dir_val != null) + wind_dir_val.setText(this.convertDegreesToDir(s.direction)); + + if (temperature_val != null) + temperature_val.setText(String.format("%.1f °C", s.avg_temperature)); + + if (qnh_val != null) + qnh_val.setText(String.format("%d hPa", s.qnh)); + + if (humidity_val != null) + humidity_val.setText(String.format("%d %", s.humidity)); + } + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/WeatherStation.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/WeatherStation.java new file mode 100644 index 0000000..a195548 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/WeatherStation.java @@ -0,0 +1,76 @@ +package cc.pogoda.mobile.pogodacc.type; + +import java.io.Serializable; + +public class WeatherStation implements Serializable { + + public WeatherStation() { + + } + + public WeatherStation(String displayedName) { + this.displayedName = displayedName; + } + + public String getDisplayedName() { + return displayedName; + } + + public void setDisplayedName(String displayedName) { + this.displayedName = displayedName; + } + + public String getDisplayedLocation() { + return displayedLocation; + } + + public void setDisplayedLocation(String displayedLocation) { + this.displayedLocation = displayedLocation; + } + + public String getSponsorUrl() { + return sponsorUrl; + } + + public void setSponsorUrl(String sponsorUrl) { + this.sponsorUrl = sponsorUrl; + } + + public float getLat() { + return lat; + } + + public void setLat(float lat) { + this.lat = lat; + } + + public float getLon() { + return lon; + } + + public void setLon(float lon) { + this.lon = lon; + } + + public String getSystemName() { + return systemName; + } + + public void setSystemName(String systemName) { + this.systemName = systemName; + } + + String systemName; + + String displayedName; + + String displayedLocation; + + String sponsorUrl; + + float lat; + + float lon; + + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfAllStations.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfAllStations.java new file mode 100644 index 0000000..e443a38 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfAllStations.java @@ -0,0 +1,7 @@ +package cc.pogoda.mobile.pogodacc.type.web; + +public class ListOfAllStations { + + public StationDefinition[] stations; + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfStationData.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfStationData.java new file mode 100644 index 0000000..9c22cfd --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/ListOfStationData.java @@ -0,0 +1,6 @@ +package cc.pogoda.mobile.pogodacc.type.web; + +public class ListOfStationData { + + public StationData[] listOfStationData; +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationData.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationData.java new file mode 100644 index 0000000..0df0ca9 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationData.java @@ -0,0 +1,39 @@ +package cc.pogoda.mobile.pogodacc.type.web; + +import java.time.LocalDateTime; + +import cc.pogoda.mobile.pogodacc.type.CustomLocalDateTime; + +public class StationData { + + public int id; + + public long epoch; + + public CustomLocalDateTime datetime; + //public LocalDateTime datetime; + + public String station; + + public float temperature; + + public short humidity; + + public float pressure; + + public short winddir; + + public float windspeed; + + public float windgusts; + + public String tsource; + + public String wsource; + + public String psource; + + public String hsource; + + public String rsource; +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationDefinition.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationDefinition.java new file mode 100644 index 0000000..226cd23 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/StationDefinition.java @@ -0,0 +1,37 @@ +package cc.pogoda.mobile.pogodacc.type.web; + +public class StationDefinition { + + public int id; + + public String name; + + public boolean enabled; + + public String callsign; + + public byte ssid; + + public String displayedName; + + public String displayedLocation; + + public String sponsorUrl; + + public String backgroundjpg; + + public String moreinfo; + + public float lat; + + public float lon; + + public boolean hasWind; + + public boolean hasQnh; + + public boolean hasHumidity; + + public boolean hasRain; + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java new file mode 100644 index 0000000..2601254 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java @@ -0,0 +1,35 @@ +package cc.pogoda.mobile.pogodacc.type.web; + +public class Summary { + + public long last_timestamp; + + public int number_of_measurements; + + public float avg_temperature; + + public String temperature_qf; + + public short qnh; + + public String qnh_qf; + + public byte humidity; + + public String humidity_qf; + + public short direction; + + public float average_speed; + + public float gusts; + + public float hour_gusts; + + public float hour_max_average_speed; + + public float hour_min_average_speed; + + public String wind_qf; + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/web/LastStationDataConsumer.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/LastStationDataConsumer.java new file mode 100644 index 0000000..55fb725 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/LastStationDataConsumer.java @@ -0,0 +1,14 @@ +package cc.pogoda.mobile.pogodacc.web; + +import cc.pogoda.mobile.pogodacc.type.web.ListOfStationData; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface LastStationDataConsumer { + + @GET("meteo_backend/lastStationData/") + Call getLastDataForStation(@Query("station")String station, + @Query("ascendingOrder")boolean ascendingOrder, + @Query("isLong")boolean isLong); +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/web/RestClientConfig.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/RestClientConfig.java new file mode 100644 index 0000000..dd6c313 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/RestClientConfig.java @@ -0,0 +1,25 @@ +package cc.pogoda.mobile.pogodacc.web; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import cc.pogoda.mobile.pogodacc.type.CustomLocalDateTime; +import cc.pogoda.mobile.pogodacc.web.deserializer.CustomLocalDateTimeDeserializer; +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RestClientConfig { + + public Retrofit getWeatherStationClient() { + Retrofit out = null; + + Gson gson = new GsonBuilder().registerTypeAdapter(CustomLocalDateTime.class, new CustomLocalDateTimeDeserializer()).setLenient().create(); + + OkHttpClient client = new OkHttpClient(); + + out = new Retrofit.Builder().baseUrl("http://pogoda.cc:8080/").addConverterFactory(GsonConverterFactory.create(gson)).client(client).build(); + + return out; + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/web/StationListConsumer.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/StationListConsumer.java new file mode 100644 index 0000000..d214075 --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/StationListConsumer.java @@ -0,0 +1,13 @@ +package cc.pogoda.mobile.pogodacc.web; + +import java.util.List; + +import cc.pogoda.mobile.pogodacc.type.web.ListOfAllStations; +import retrofit2.Call; +import retrofit2.http.GET; + +public interface StationListConsumer { + + @GET("meteo_backend/listOfAllStations/") + Call getAllStations(); +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/web/SummaryConsumer.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/SummaryConsumer.java new file mode 100644 index 0000000..df5dc9a --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/SummaryConsumer.java @@ -0,0 +1,13 @@ +package cc.pogoda.mobile.pogodacc.web; + + +import cc.pogoda.mobile.pogodacc.type.web.Summary; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface SummaryConsumer { + + @GET("meteo_backend/summary/") + Call getSummaryForStation(@Query("station")String station); +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/web/deserializer/CustomLocalDateTimeDeserializer.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/deserializer/CustomLocalDateTimeDeserializer.java new file mode 100644 index 0000000..32791bf --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/web/deserializer/CustomLocalDateTimeDeserializer.java @@ -0,0 +1,38 @@ +package cc.pogoda.mobile.pogodacc.web.deserializer; + +import android.content.Intent; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; +import java.util.Calendar; + +import cc.pogoda.mobile.pogodacc.type.CustomLocalDateTime; + +public class CustomLocalDateTimeDeserializer implements JsonDeserializer { + @Override + public CustomLocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + + CustomLocalDateTime out = new CustomLocalDateTime(); + + out.calendar = Calendar.getInstance(); + + JsonObject object = json.getAsJsonObject(); + + Integer year_int = object.getAsJsonPrimitive("year").getAsInt(); + Integer month_int = object.getAsJsonPrimitive("monthValue").getAsInt(); + Integer day_int = object.getAsJsonPrimitive("dayOfMonth").getAsInt(); + Integer hour_int = object.getAsJsonPrimitive("hour").getAsInt(); + Integer minute_int = object.getAsJsonPrimitive("minute").getAsInt(); + Integer second_int = object.getAsJsonPrimitive("second").getAsInt(); + + out.calendar.set(year_int, month_int, day_int, hour_int, minute_int, second_int); + out.origin = object; + + return out; + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_equalizer_24.xml b/app/src/main/res/drawable/ic_baseline_equalizer_24.xml new file mode 100644 index 0000000..6957708 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_equalizer_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_favorite_24.xml b/app/src/main/res/drawable/ic_baseline_favorite_24.xml new file mode 100644 index 0000000..52d4d9b --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_favorite_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_menu_24.xml b/app/src/main/res/drawable/ic_baseline_menu_24.xml new file mode 100644 index 0000000..4350ba9 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_menu_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_timer_24.xml b/app/src/main/res/drawable/ic_baseline_timer_24.xml new file mode 100644 index 0000000..1897572 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_timer_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_all_stations.xml b/app/src/main/res/layout/activity_all_stations.xml new file mode 100644 index 0000000..fdea513 --- /dev/null +++ b/app/src/main/res/layout/activity_all_stations.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_all_stations_linear_layout.xml b/app/src/main/res/layout/activity_all_stations_linear_layout.xml new file mode 100644 index 0000000..587017a --- /dev/null +++ b/app/src/main/res/layout/activity_all_stations_linear_layout.xml @@ -0,0 +1,26 @@ + + + + + +