kopia lustrzana https://github.com/SP8EBC/MeteoSystem
Porównaj commity
11 Commity
Autor | SHA1 | Data |
---|---|---|
Mateusz Lubecki | 4641945295 | |
Mateusz Lubecki | f8dbcff362 | |
Mateusz Lubecki | 4f192e9a15 | |
Mateusz Lubecki | b6123ec677 | |
Rafal Woloszyn | 4c3b17fbfe | |
Mateusz Lubecki | a2dd3149e9 | |
SP8EBC | ea23e7b5fb | |
Mateusz Lubecki | 57fe1bfbfd | |
Mateusz Lubecki | 5a211da64e | |
Rafal Woloszyn | 34d43825f9 | |
Mateusz Lubecki | 6bcdf9fdbb |
|
@ -1 +0,0 @@
|
|||
Pogoda.cc
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetDropDown">
|
||||
<targetSelectedWithDropDown>
|
||||
<Target>
|
||||
<type value="QUICK_BOOT_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="VIRTUAL_DEVICE_PATH" />
|
||||
<value value="$USER_HOME$/.android/avd/Pixel_4_XL_API_28.avd" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</targetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2023-10-01T07:46:55.840082Z" />
|
||||
</component>
|
||||
</project>
|
|
@ -4,6 +4,7 @@
|
|||
<option name="filePathToZoomLevelMap">
|
||||
<map>
|
||||
<entry key="../../../../../layout/custom_preview.xml" value="0.2171875" />
|
||||
<entry key="app/src/main/res/drawable/button_border.xml" value="0.38125" />
|
||||
<entry key="app/src/main/res/layout/activity_all_stations.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_all_stations_linear_layout.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_export_data.xml" value="0.25" />
|
||||
|
@ -11,14 +12,19 @@
|
|||
<entry key="app/src/main/res/layout/activity_favourites_empty.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_favourites_linear_layout.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_favourites_linear_layout_data.xml" value="0.5" />
|
||||
<entry key="app/src/main/res/layout/activity_main.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_main.xml" value="0.5451010886469674" />
|
||||
<entry key="app/src/main/res/layout/activity_settings.xml" value="0.67" />
|
||||
<entry key="app/src/main/res/layout/activity_station_details.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_station_details.xml" value="0.33" />
|
||||
<entry key="app/src/main/res/layout/activity_station_details_plots.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_station_details_summary.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/layout/activity_station_details_wind_rose.xml" value="0.5" />
|
||||
<entry key="app/src/main/res/layout/activity_trend.xml" value="0.3645833333333333" />
|
||||
<entry key="app/src/main/res/layout/fragment_pressure.xml" value="0.3645833333333333" />
|
||||
<entry key="app/src/main/res/layout/fragment_temperature.xml" value="0.3645833333333333" />
|
||||
<entry key="app/src/main/res/layout/fragment_wind.xml" value="0.3645833333333333" />
|
||||
<entry key="app/src/main/res/layout/spinner_item.xml" value="0.28306159420289856" />
|
||||
<entry key="app/src/main/res/menu/main_activity_menu.xml" value="0.3651041666666667" />
|
||||
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher_icon.xml" value="0.3335" />
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
|
|
|
@ -3,7 +3,7 @@ plugins {
|
|||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
compileSdkVersion 33
|
||||
buildToolsVersion "30.0.3"
|
||||
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
@ -11,9 +11,9 @@ android {
|
|||
defaultConfig {
|
||||
applicationId "cc.pogoda.mobile.meteosystem"
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 30
|
||||
versionCode 13
|
||||
versionName "0.13-beta"
|
||||
targetSdkVersion 33
|
||||
versionCode 19
|
||||
versionName "0.19"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
|
|
@ -6,41 +6,73 @@
|
|||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission
|
||||
android:name="android.permission.MANAGE_DOCUMENTS"
|
||||
tools:ignore="ProtectedPermissions" />
|
||||
|
||||
<application
|
||||
android:name=".Main"
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher_icon"
|
||||
android:icon="@drawable/sun_rays_cloud"
|
||||
android:label="@string/app_name"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:roundIcon="@mipmap/ic_launcher_icon_foreground"
|
||||
android:supportsRtl="true"
|
||||
android:name=".Main"
|
||||
android:theme="@style/Theme.Meteosystem">
|
||||
<service
|
||||
android:name=".service.GetAllStationsService"
|
||||
android:permission="android.permission.BIND_JOB_SERVICE"/>
|
||||
|
||||
<activity
|
||||
android:name="cc.pogoda.mobile.meteosystem.activity.SettingsActivity"
|
||||
android:name=".activity.SettingsActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name="cc.pogoda.mobile.meteosystem.activity.ExportDataActivity"
|
||||
android:name=".activity.ExportDataActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name="cc.pogoda.mobile.meteosystem.activity.TrendActivity"
|
||||
android:name=".activity.TrendActivity"
|
||||
android:exported="true"
|
||||
android:label="@string/title_activity_trend" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsWindRoseActivity" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsPlotsWind" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsPlotsDirection" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsPlotsTemperature" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsPlotsHumidity" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsSummaryActivity" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.StationDetailsActivity" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.AllStationsActivity" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.FavouritesActivity" />
|
||||
<activity android:name="cc.pogoda.mobile.meteosystem.activity.MainActivity">
|
||||
<activity
|
||||
android:name=".activity.StationDetailsWindRoseActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.StationDetailsPlotsWind"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.StationDetailsPlotsDirection"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.StationDetailsPlotsTemperature"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.StationDetailsPlotsHumidity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.StationDetailsSummaryActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.StationDetailsActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.AllStationsActivity"
|
||||
android:launchMode="singleTop"
|
||||
android:exported="true" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEARCH" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.app.searchable"
|
||||
android:resource="@xml/searchable" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".activity.FavouritesActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".activity.MainActivity"
|
||||
android:exported="true" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
|
|
@ -2,9 +2,9 @@ package cc.pogoda.mobile.meteosystem;
|
|||
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.content.Intent;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import com.jakewharton.threetenabp.AndroidThreeTen;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
@ -17,19 +17,22 @@ import java.io.IOException;
|
|||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.FavouritesStationSummaryUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.config.AppConfiguration;
|
||||
import cc.pogoda.mobile.meteosystem.dao.AllStationsDao;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.thread.FavouritesStationSummaryUpdaterThread;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.file.ConfigurationFile;
|
||||
import cc.pogoda.mobile.meteosystem.file.FavouritiesFile;
|
||||
import cc.pogoda.mobile.meteosystem.file.FileNames;
|
||||
import cc.pogoda.mobile.meteosystem.service.GetAllStationsService;
|
||||
import cc.pogoda.mobile.meteosystem.type.AllStationsReceivedEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.AvailableParameters;
|
||||
import cc.pogoda.mobile.meteosystem.type.ThemeColours;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStationListEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
public class Main extends Application {
|
||||
private static String TAG = Main.class.getSimpleName();
|
||||
|
||||
private File directory;
|
||||
|
||||
|
@ -63,12 +66,26 @@ public class Main extends Application {
|
|||
* This download summary for all stations stored on favourites list and stores results
|
||||
* in 'HashMap<String, Summary> stationSystemNameToSummary'
|
||||
*/
|
||||
private FavouritesStationSummaryUpdater favsSummaryUpdater = null;
|
||||
private FavouritesStationSummaryUpdaterThread favsSummaryUpdater = null;
|
||||
|
||||
/**
|
||||
* This map stores summary for all favourites station
|
||||
*/
|
||||
private HashMap<String, Summary> stationSystemNameToSummary = null;
|
||||
private HashMap<String, Summary> hashmapFavStationSystemNameToSummary = null;
|
||||
|
||||
/**
|
||||
* This hash map stores available parameters for all stations defined in the system
|
||||
*/
|
||||
private HashMap<String, AvailableParameters> hashmapAllStationSystemNameToAvailParameters = null;
|
||||
|
||||
public ThemeColours getThemeColours() {
|
||||
return themeColours;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used everywhere, where a colour of any element is set programatically (not globally from the theme)
|
||||
*/
|
||||
private ThemeColours themeColours;
|
||||
|
||||
public File getDirectory() {
|
||||
return directory;
|
||||
|
@ -82,8 +99,12 @@ public class Main extends Application {
|
|||
return confFile;
|
||||
}
|
||||
|
||||
public HashMap<String, Summary> getStationSystemNameToSummary() {
|
||||
return stationSystemNameToSummary;
|
||||
public HashMap<String, Summary> getHashmapFavStationSystemNameToSummary() {
|
||||
return hashmapFavStationSystemNameToSummary;
|
||||
}
|
||||
|
||||
public HashMap<String, AvailableParameters> getHashmapAllStationSystemNameToAvailParameters() {
|
||||
return hashmapAllStationSystemNameToAvailParameters;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -119,23 +140,26 @@ public class Main extends Application {
|
|||
|
||||
confFile.restoreFromFile();
|
||||
|
||||
stationSystemNameToSummary = new HashMap<>();
|
||||
hashmapFavStationSystemNameToSummary = new HashMap<>();
|
||||
|
||||
hashmapAllStationSystemNameToAvailParameters = new HashMap<>();
|
||||
|
||||
fileNames = new FileNames(ctx);
|
||||
|
||||
favouritiesFile = new FavouritiesFile(fileNames);
|
||||
|
||||
// download all stations from API
|
||||
listOfAllStations = new AllStationsDao().getAllStations();
|
||||
themeColours = new ThemeColours();
|
||||
|
||||
Logger.info("[Main][onCreate][listOfAllStations.size() = " + listOfAllStations.size() + "]");
|
||||
// Download all stations from API in background via JobIntentService. Results are send
|
||||
//back with Broadcast receiver.
|
||||
startGetAllStationsService();
|
||||
|
||||
// recreate list of favorites
|
||||
recreateListOfFavs();
|
||||
|
||||
favsSummaryUpdater = new FavouritesStationSummaryUpdater(stationSystemNameToSummary);
|
||||
favsSummaryUpdater = new FavouritesStationSummaryUpdaterThread(hashmapFavStationSystemNameToSummary, hashmapAllStationSystemNameToAvailParameters);
|
||||
|
||||
favsSummaryUpdater.start(100);
|
||||
favsSummaryUpdater.start(50);
|
||||
|
||||
// if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
// Logger.debug("[Main][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
|
@ -149,8 +173,20 @@ public class Main extends Application {
|
|||
// }
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onTerminate() {
|
||||
super.onTerminate();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
private void recreateListOfFavs() {
|
||||
|
||||
if(listOfAllStations == null) {
|
||||
Logger.info("[listOfAllStations=null]");
|
||||
return;
|
||||
}
|
||||
|
||||
// check if this is a first call after application start
|
||||
if (favs == null) {
|
||||
favs = favouritiesFile.loadFavourites();
|
||||
|
@ -194,7 +230,7 @@ public class Main extends Application {
|
|||
// as a list does not make a copy of the object. It (ArrayList) keeps
|
||||
// only a reference to an object
|
||||
|
||||
stationSystemNameToSummary.put(fromAllStations.getSystemName(), null);
|
||||
hashmapFavStationSystemNameToSummary.put(fromAllStations.getSystemName(), null);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -202,7 +238,7 @@ public class Main extends Application {
|
|||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void weatherStationListHandler(WeatherStationListEvent serviceEvent) {
|
||||
Logger.info("[Main][weatherStationListHandler][serviceEvent = " + serviceEvent + "]");
|
||||
Logger.info("[serviceEvent = " + serviceEvent + "]");
|
||||
|
||||
switch (serviceEvent.getEventReason()) {
|
||||
|
||||
|
@ -243,22 +279,20 @@ public class Main extends Application {
|
|||
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.BACKGROUND)
|
||||
public void allStationsEventHandler(@NonNull AllStationsReceivedEvent event) {
|
||||
Logger.info("[event = " + event.toString() +"]");
|
||||
this.listOfAllStations = event.getStations();
|
||||
recreateListOfFavs();
|
||||
}
|
||||
|
||||
public boolean listOfAllStationsReady() {
|
||||
if (listOfAllStations != null && listOfAllStations.size() > 0) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return listOfAllStations != null && listOfAllStations.size() > 0;
|
||||
}
|
||||
|
||||
public boolean listOfFavsReady() {
|
||||
if (favs != null/* && favs.size() > 0*/) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
/* && favs.size() > 0*/
|
||||
return favs != null;
|
||||
}
|
||||
|
||||
public boolean checkIsOnFavsList(String _system_name) {
|
||||
|
@ -274,4 +308,10 @@ public class Main extends Application {
|
|||
return out;
|
||||
}
|
||||
|
||||
|
||||
public void startGetAllStationsService () {
|
||||
Intent mIntent = new Intent(this, GetAllStationsService.class);
|
||||
GetAllStationsService.enqueueWork(this, mIntent);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,48 +1,152 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity;
|
||||
|
||||
import android.app.SearchManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.widget.SearchView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.Main;
|
||||
import cc.pogoda.mobile.meteosystem.R;
|
||||
import cc.pogoda.mobile.meteosystem.adapter.WeatherStationRecyclerViewAdapter;
|
||||
import cc.pogoda.mobile.meteosystem.type.AllStationsReceivedEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.ParceableFavsCallReason;
|
||||
import cc.pogoda.mobile.meteosystem.type.StartStationsRefreshEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class AllStationsActivity extends AppCompatActivity {
|
||||
|
||||
RecyclerView recyclerViewAllStations;
|
||||
|
||||
Summary test;
|
||||
|
||||
private List<WeatherStation> allStationsList;
|
||||
|
||||
Main main;
|
||||
private SwipeRefreshLayout refreshLayout;
|
||||
private WeatherStationRecyclerViewAdapter adapter;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_all_stations);
|
||||
|
||||
main = (Main) getApplication();
|
||||
|
||||
//allStationsList = getIntent().getParcelableExtra("all_stations");
|
||||
allStationsList = main.getListOfAllStations();
|
||||
|
||||
recyclerViewAllStations = findViewById(R.id.recyclerViewAllStations);
|
||||
|
||||
WeatherStationRecyclerViewAdapter adapter = null;
|
||||
|
||||
adapter = new WeatherStationRecyclerViewAdapter(allStationsList, this, ParceableFavsCallReason.Reason.ALL_STATIONS);
|
||||
refreshLayout = findViewById(R.id.refreshAllStationsView);
|
||||
refreshLayout.setOnRefreshListener(
|
||||
() -> ((Main) getApplication()).startGetAllStationsService()
|
||||
);
|
||||
|
||||
RecyclerView recyclerViewAllStations = findViewById(R.id.recyclerViewAllStations);
|
||||
adapter = new WeatherStationRecyclerViewAdapter(
|
||||
new LinkedList<>(), this, ParceableFavsCallReason.Reason.ALL_STATIONS);
|
||||
recyclerViewAllStations.setAdapter(adapter);
|
||||
|
||||
recyclerViewAllStations.setLayoutManager(new LinearLayoutManager(this));
|
||||
|
||||
handleIntent(getIntent());
|
||||
}
|
||||
|
||||
|
||||
private void handleIntent(Intent intent) {
|
||||
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
|
||||
String query = intent.getStringExtra(SearchManager.QUERY);
|
||||
filterStationList(query);
|
||||
}
|
||||
}
|
||||
|
||||
private void filterStationList(String searchQuery) {
|
||||
if (allStationsList == null || allStationsList.isEmpty())
|
||||
return;
|
||||
|
||||
if(searchQuery.isEmpty())
|
||||
adapter.update(allStationsList);
|
||||
|
||||
List<WeatherStation> newList = allStationsList.stream()
|
||||
.filter(station -> station.getDisplayedName()
|
||||
.toLowerCase(Locale.ROOT).contains(searchQuery.toLowerCase(Locale.ROOT)))
|
||||
.collect(Collectors.toList());
|
||||
adapter.update(newList);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
EventBus.getDefault().register(this);
|
||||
updateStationList(((Main) getApplication()).getListOfAllStations());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.main_activity_all_stations, menu);
|
||||
|
||||
// Associate searchable configuration with the SearchView
|
||||
SearchManager searchManager =
|
||||
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
|
||||
SearchView searchView =
|
||||
(SearchView) menu.findItem(R.id.search).getActionView();
|
||||
searchView.setSearchableInfo(
|
||||
searchManager.getSearchableInfo(getComponentName()));
|
||||
searchView.setMaxWidth(Integer.MAX_VALUE);
|
||||
|
||||
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
|
||||
|
||||
@Override
|
||||
public boolean onQueryTextSubmit(String s) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onQueryTextChange(String s) {
|
||||
filterStationList(s);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
searchView.setOnCloseListener(() -> {
|
||||
adapter.update(allStationsList);
|
||||
return false;
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updateStationList(List<WeatherStation> stations) {
|
||||
if (stations != null) {
|
||||
refreshLayout.setRefreshing(false);
|
||||
allStationsList = stations;
|
||||
adapter.update(stations);
|
||||
} else {
|
||||
EventBus.getDefault().post(new StartStationsRefreshEvent());
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void allStationsEventHandler(@NonNull AllStationsReceivedEvent event) {
|
||||
updateStationList(event.getStations());
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void startStationsRefreshEventHandler(@NonNull StartStationsRefreshEvent event) {
|
||||
refreshLayout.setRefreshing(true);
|
||||
Toast.makeText(this, R.string.refreshing_station_list, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
|
@ -1,33 +1,50 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.Bundle;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.Main;
|
||||
import cc.pogoda.mobile.meteosystem.R;
|
||||
import cc.pogoda.mobile.meteosystem.adapter.WeatherStationRecyclerViewAdapter;
|
||||
import cc.pogoda.mobile.meteosystem.type.AllStationsReceivedEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.ParceableFavsCallReason;
|
||||
import cc.pogoda.mobile.meteosystem.type.ParceableStationsList;
|
||||
import cc.pogoda.mobile.meteosystem.type.StartStationsRefreshEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
|
||||
public class FavouritesActivity extends AppCompatActivity {
|
||||
|
||||
Main main;
|
||||
|
||||
RecyclerView recyclerViewFavourites;
|
||||
|
||||
List<WeatherStation> favourites, sortedFavourites;
|
||||
private SwipeRefreshLayout refreshLayout;
|
||||
|
||||
List<WeatherStation> favourites = new LinkedList<>();
|
||||
|
||||
List<WeatherStation> sortedFavourites;
|
||||
|
||||
boolean sorting = false;
|
||||
|
||||
|
@ -35,14 +52,11 @@ public class FavouritesActivity extends AppCompatActivity {
|
|||
|
||||
ParceableFavsCallReason callReason;
|
||||
|
||||
private class WxStationComparator implements Comparator<WeatherStation> {
|
||||
private static class WxStationComparator implements Comparator<WeatherStation> {
|
||||
|
||||
@Override
|
||||
public int compare(WeatherStation station, WeatherStation t1) {
|
||||
String name = station.getDisplayedName();
|
||||
String name1 = t1.getDisplayedName();
|
||||
|
||||
return (name.compareTo(name1));
|
||||
return (station.getDisplayedName().compareTo(t1.getDisplayedName()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,8 +96,6 @@ public class FavouritesActivity extends AppCompatActivity {
|
|||
recyclerViewFavourites.setAdapter(adapter);
|
||||
}
|
||||
|
||||
break;
|
||||
case R.id.fav_remove_noext:
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -93,43 +105,68 @@ public class FavouritesActivity extends AppCompatActivity {
|
|||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_favourites);
|
||||
|
||||
//favourites = getIntent().getParcelableExtra("favs");
|
||||
main = (Main)getApplication();
|
||||
|
||||
favourites = main.getFavs();
|
||||
sortedFavourites = new ArrayList<>(favourites);
|
||||
|
||||
sortedFavourites.sort(new WxStationComparator());
|
||||
recyclerViewFavourites = findViewById(R.id.recyclerViewFavourites);
|
||||
refreshLayout = findViewById(R.id.refreshViewFavourites);
|
||||
refreshLayout.setOnRefreshListener(
|
||||
() -> ((Main) getApplication()).startGetAllStationsService()
|
||||
);
|
||||
|
||||
callReason = getIntent().getParcelableExtra("callReason");
|
||||
adapter = new WeatherStationRecyclerViewAdapter(favourites,
|
||||
this, callReason.getReason());
|
||||
recyclerViewFavourites.setAdapter(adapter);
|
||||
recyclerViewFavourites.setLayoutManager(new LinearLayoutManager(this));
|
||||
}
|
||||
|
||||
if (favourites == null || favourites.size() == 0) {
|
||||
setContentView(R.layout.activity_favourites_empty);
|
||||
}
|
||||
else {
|
||||
setContentView(R.layout.activity_favourites);
|
||||
@Override
|
||||
protected void onResume() {
|
||||
Logger.debug("[onResume]");
|
||||
|
||||
recyclerViewFavourites = findViewById(R.id.recyclerViewFavourites);
|
||||
super.onResume();
|
||||
EventBus.getDefault().register(this);
|
||||
updateStationList();
|
||||
}
|
||||
|
||||
if (recyclerViewFavourites != null) {
|
||||
adapter = new WeatherStationRecyclerViewAdapter(favourites, this, callReason.getReason());
|
||||
|
||||
adapter.createAndStartUpdater();
|
||||
|
||||
recyclerViewFavourites.setAdapter(adapter);
|
||||
|
||||
recyclerViewFavourites.setLayoutManager(new LinearLayoutManager(this));
|
||||
}
|
||||
}
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
adapter.stopUpdater();
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
if (adapter != null) {
|
||||
adapter.stopUpdater();
|
||||
private void updateStationList() {
|
||||
List favList = ((Main) getApplication()).getFavs();
|
||||
|
||||
if(favList != null) {
|
||||
favourites.clear();
|
||||
favourites.addAll(favList);
|
||||
refreshLayout.setRefreshing(false);
|
||||
sortedFavourites = new ArrayList<>(favourites);
|
||||
sortedFavourites.sort(new WxStationComparator());
|
||||
adapter.notifyDataSetChanged();
|
||||
if (!favList.isEmpty()) {
|
||||
adapter.createAndStartUpdater();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void allStationsEventHandler(@NonNull AllStationsReceivedEvent event) {
|
||||
Logger.info("[event = " + event.toString() +"]");
|
||||
updateStationList();
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void startStationsRefreshEventHandler(@NonNull StartStationsRefreshEvent event) {
|
||||
refreshLayout.setRefreshing(true);
|
||||
Toast.makeText(this, R.string.refreshing_station_list, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,38 +2,32 @@ package cc.pogoda.mobile.meteosystem.activity;
|
|||
|
||||
// https://www.softicons.com/web-icons/vector-stylish-weather-icons-by-bartosz-kaszubowski/sun-rays-cloud-icon#google_vignette
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.StrictMode;
|
||||
import android.os.strictmode.Violation;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.ImageButton;
|
||||
|
||||
import com.jakewharton.threetenabp.AndroidThreeTen;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.google.android.material.color.MaterialColors;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
import org.threeten.bp.LocalDateTime;
|
||||
import org.threeten.bp.format.DateTimeFormatter;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.Main;
|
||||
|
@ -43,38 +37,18 @@ import cc.pogoda.mobile.meteosystem.activity.handler.MainActImageButtonExportCli
|
|||
import cc.pogoda.mobile.meteosystem.activity.handler.MainActImageButtonFavouritesClickEvent;
|
||||
import cc.pogoda.mobile.meteosystem.activity.handler.MainActImageButtonSettingsClickEvent;
|
||||
import cc.pogoda.mobile.meteosystem.config.AppConfiguration;
|
||||
import cc.pogoda.mobile.meteosystem.dao.AllStationsDao;
|
||||
import cc.pogoda.mobile.meteosystem.file.ConfigurationFile;
|
||||
import cc.pogoda.mobile.meteosystem.file.CopyLog;
|
||||
import cc.pogoda.mobile.meteosystem.file.FavouritiesFile;
|
||||
import cc.pogoda.mobile.meteosystem.file.FileNames;
|
||||
import cc.pogoda.mobile.meteosystem.type.ParceableStationsList;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStationListEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.ThemeColours;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
private Main main;
|
||||
|
||||
private Context baseContext;
|
||||
|
||||
private MainActImageButtonFavouritesClickEvent mainActImageButtonFavouritesClickEvent = null;
|
||||
|
||||
private ImageButton imageButtonFavourites;
|
||||
|
||||
private ImageButton exportButton;
|
||||
|
||||
private ImageButton settingsButton;
|
||||
|
||||
public MainActivity() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
Logger.info("[MainActivity][onDestroy]");
|
||||
Logger.info("[onDestroy]");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -83,7 +57,7 @@ public class MainActivity extends AppCompatActivity {
|
|||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
Logger.info("[MainActivity][onResume]");
|
||||
Logger.info("[onResume]");
|
||||
|
||||
}
|
||||
|
||||
|
@ -91,53 +65,75 @@ public class MainActivity extends AppCompatActivity {
|
|||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
Logger.info("[MainActivity][onCreate]");
|
||||
Logger.info("[onCreate]");
|
||||
|
||||
main = (Main) getApplication();
|
||||
|
||||
baseContext = getApplicationContext();
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[MainActivity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default")) {
|
||||
Logger.debug("[AppConfiguration.locale = "
|
||||
+ AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
Configuration config = resources.getConfiguration();
|
||||
config.setLocale(locale);
|
||||
Logger.debug("[MainActivity][onCreate][locale = " + locale.toLanguageTag() + "]");
|
||||
Logger.debug("[locale = " + locale.toLanguageTag() + "]");
|
||||
resources.updateConfiguration(config, resources.getDisplayMetrics());
|
||||
}
|
||||
|
||||
// create an event handler fired when a user click 'favourites' button
|
||||
mainActImageButtonFavouritesClickEvent = new MainActImageButtonFavouritesClickEvent(this);
|
||||
|
||||
// assign on click listener
|
||||
if (imageButtonFavourites != null) {
|
||||
imageButtonFavourites.setOnClickListener(mainActImageButtonFavouritesClickEvent);
|
||||
}
|
||||
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
ImageButton imageButtonAllStations = (ImageButton)findViewById(R.id.imageButtonAllStations);
|
||||
if (imageButtonAllStations != null)
|
||||
imageButtonAllStations.setOnClickListener(new MainActImageButtonAllStationsClickEvent(this));
|
||||
ImageButton imageButtonAllStations = findViewById(R.id.imageButtonAllStations);
|
||||
imageButtonAllStations.setOnClickListener(
|
||||
new MainActImageButtonAllStationsClickEvent(this));
|
||||
|
||||
imageButtonFavourites = (ImageButton)findViewById(R.id.imageButtonFavourites);
|
||||
if (imageButtonFavourites != null) {
|
||||
imageButtonFavourites.setOnClickListener(new MainActImageButtonFavouritesClickEvent(this));
|
||||
}
|
||||
ImageButton imageButtonFavourites = findViewById(R.id.imageButtonFavourites);
|
||||
imageButtonFavourites.setOnClickListener(
|
||||
new MainActImageButtonFavouritesClickEvent(this));
|
||||
|
||||
// set an action for clicking on export data button
|
||||
exportButton = (ImageButton)findViewById(R.id.imageButtonExport);
|
||||
if (exportButton != null) {
|
||||
exportButton.setOnClickListener(new MainActImageButtonExportClickEvent(this));
|
||||
}
|
||||
ImageButton exportButton = findViewById(R.id.imageButtonExport);
|
||||
exportButton.setOnClickListener(new MainActImageButtonExportClickEvent(this));
|
||||
|
||||
settingsButton = (ImageButton) findViewById(R.id.imageButtonSettings);
|
||||
if (settingsButton != null) {
|
||||
settingsButton.setOnClickListener(new MainActImageButtonSettingsClickEvent(this, main.getConfFile()));
|
||||
}
|
||||
ImageButton settingsButton = findViewById(R.id.imageButtonSettings);
|
||||
settingsButton.setOnClickListener(
|
||||
new MainActImageButtonSettingsClickEvent(this, main.getConfFile()));
|
||||
|
||||
ThemeColours colours = ((Main) getApplication()).getThemeColours();
|
||||
|
||||
TypedValue typedValue = new TypedValue();
|
||||
Resources.Theme theme = getTheme();
|
||||
|
||||
//MaterialColors.getColor(, R.attr.colorOnPrimary);
|
||||
|
||||
theme.resolveAttribute(R.attr.colorPrimary, typedValue, true);
|
||||
TypedArray arr = obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorPrimary});
|
||||
colours.colorPrimary = arr.getColor(0, -1);
|
||||
arr.recycle();
|
||||
|
||||
theme.resolveAttribute(R.attr.colorPrimaryVariant, typedValue, true);
|
||||
arr = obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorPrimaryVariant});
|
||||
colours.colorPrimaryVariant = arr.getColor(0, -1);
|
||||
arr.recycle();
|
||||
|
||||
theme.resolveAttribute(R.attr.colorOnPrimary, typedValue, true);
|
||||
arr = obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorOnPrimary});
|
||||
colours.colorOnPrimary = arr.getColor(0, -1);
|
||||
arr.recycle();
|
||||
|
||||
theme.resolveAttribute(R.attr.colorSecondary, typedValue, true);
|
||||
arr = obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorSecondary});
|
||||
colours.colorSecondary = arr.getColor(0, -1);
|
||||
arr.recycle();
|
||||
|
||||
theme.resolveAttribute(R.attr.colorSecondaryVariant, typedValue, true);
|
||||
arr = obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorSecondaryVariant});
|
||||
colours.colorSecondaryVariant = arr.getColor(0, -1);
|
||||
arr.recycle();
|
||||
|
||||
theme.resolveAttribute(R.attr.colorOnSecondary, typedValue, true);
|
||||
arr = obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorOnSecondary});
|
||||
colours.colorOnSecondary = arr.getColor(0, -1);
|
||||
arr.recycle();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -146,21 +142,23 @@ public class MainActivity extends AppCompatActivity {
|
|||
if (requestCode == 123 && resultCode == RESULT_OK) {
|
||||
Uri uri = data.getData();
|
||||
|
||||
Logger.debug("[MainActivity][onActivityResult][requestCode = 123][uri.getPath() = " + uri.getPath() +"]");
|
||||
Logger.debug("[requestCode = 123][uri.getPath() = "
|
||||
+ uri.getPath() + "]");
|
||||
|
||||
grantUriPermission(getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
grantUriPermission(getPackageName(), uri,
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
getContentResolver().takePersistableUriPermission(uri,
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
|
||||
try {
|
||||
CopyLog.forDay(main.getFileNames(), LocalDateTime.now(), getContentResolver().openOutputStream(uri));
|
||||
CopyLog.forDay(main.getFileNames(), LocalDateTime.now(),
|
||||
getContentResolver().openOutputStream(uri));
|
||||
} catch (FileNotFoundException e) {
|
||||
Logger.error("[MainActivity][onActivityResult][FileNotFoundException]");
|
||||
Logger.error("[FileNotFoundException][e = " + e.toString() +"]");
|
||||
}
|
||||
|
||||
// getContentResolver().openOutputStream(exportUri)
|
||||
|
||||
//exportUri = uri;
|
||||
|
||||
}
|
||||
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
@ -183,7 +181,8 @@ public class MainActivity extends AppCompatActivity {
|
|||
"CZE: Sylwiusz Pachel\r\n" +
|
||||
"GER: Jakub Fiałek\r\n" +
|
||||
"LAT: Andris Stikāns\r\n" +
|
||||
"UKR, RUS: Влад Поливач \r\n(Wład Polywacz)\r\n\r\nProgram Icon: Bartosz Kaszubowski");
|
||||
"UKR, RUS: Влад Поливач \r\n" +
|
||||
"(Wład Polywacz)\r\n\r\nProgram Icon: Bartosz Kaszubowski");
|
||||
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
|
||||
var1.dismiss();
|
||||
});
|
||||
|
@ -193,11 +192,12 @@ public class MainActivity extends AppCompatActivity {
|
|||
break;
|
||||
}
|
||||
|
||||
case (R.id.menu_item_log_export) : {
|
||||
case (R.id.menu_item_log_export): {
|
||||
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(Intent.EXTRA_TITLE, "meteosystem_" +LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE) + ".log");
|
||||
intent.putExtra(Intent.EXTRA_TITLE, "meteosystem_" +
|
||||
LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE) + ".log");
|
||||
|
||||
startActivityForResult(intent, 123);
|
||||
|
||||
|
@ -209,21 +209,11 @@ public class MainActivity extends AppCompatActivity {
|
|||
}
|
||||
|
||||
public boolean listOfAllStationsReady() {
|
||||
if (main != null) {
|
||||
return main.listOfAllStationsReady();
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return main.listOfAllStationsReady() && main != null;
|
||||
}
|
||||
|
||||
public boolean listOfAllFavsReady() {
|
||||
if (main != null) {
|
||||
return main.listOfFavsReady();
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return main.listOfFavsReady() && main != null;
|
||||
}
|
||||
|
||||
}
|
|
@ -38,7 +38,7 @@ public class SettingsActivity extends AppCompatActivity {
|
|||
|
||||
private static String languageNameFromShort(String shortName) {
|
||||
|
||||
Logger.info("[SettingsActivity][languageNameFromShort][shortName = " + shortName +"]");
|
||||
Logger.info("[shortName = " + shortName +"]");
|
||||
|
||||
switch (shortName) {
|
||||
case "en-rUS": return "English";
|
||||
|
@ -70,7 +70,7 @@ public class SettingsActivity extends AppCompatActivity {
|
|||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_settings);
|
||||
|
||||
Logger.info("[SettingsActivity][onCreate]");
|
||||
Logger.info("[onCreate]");
|
||||
|
||||
confFile = new ConfigurationFile(getBaseContext());
|
||||
|
||||
|
@ -148,7 +148,7 @@ public class SettingsActivity extends AppCompatActivity {
|
|||
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
String languageSelected = adapterView.getItemAtPosition(i).toString();
|
||||
|
||||
Logger.debug("[SettingsActivity][onCreate][AdapterView.OnItemSelectedListener()][languageSelected = " + languageSelected +"]");
|
||||
Logger.debug("[AdapterView.OnItemSelectedListener()][languageSelected = " + languageSelected +"]");
|
||||
|
||||
switch (languageSelected) {
|
||||
case "English": AppConfiguration.locale = "en-rUS"; break;
|
||||
|
|
|
@ -167,10 +167,10 @@ public class StationDetailsActivity extends AppCompatActivity {
|
|||
act = this;
|
||||
station = (WeatherStation) getIntent().getSerializableExtra("station");
|
||||
|
||||
Logger.info("[StationDetailsActivity][onCreate][station.getSystemName() = " + station.getSystemName() +"]");
|
||||
Logger.info("[station.getSystemName() = " + station.getSystemName() +"]");
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[StationDetailsActivity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
|
|
|
@ -132,10 +132,10 @@ public class StationDetailsPlotsDirection extends AppCompatActivity implements S
|
|||
|
||||
station = (WeatherStation) getIntent().getSerializableExtra("station");
|
||||
|
||||
Logger.info("[StationDetailsPlotsDirection][onCreate][station.getSystemName() = " + station.getSystemName() +"][dataLn = " + dataLn +"]");
|
||||
Logger.info("[station.getSystemName() = " + station.getSystemName() +"][dataLn = " + dataLn +"]");
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[StationDetailsActivity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
|
@ -342,7 +342,7 @@ public class StationDetailsPlotsDirection extends AppCompatActivity implements S
|
|||
// utc timestamp
|
||||
long utcTimestamp = utcTime.toEpochSecond();
|
||||
|
||||
Logger.debug("[StationDetailsPlotsDirection][downloadDataFromWebservice][station.getSystemName() = " + station.getSystemName() +"]");
|
||||
Logger.debug("[station.getSystemName() = " + station.getSystemName() +"]");
|
||||
|
||||
if (this.dataLn < 0 || this.dataLn > 2) {
|
||||
// last 2000 points of data, regardless the timescale
|
||||
|
@ -365,7 +365,7 @@ public class StationDetailsPlotsDirection extends AppCompatActivity implements S
|
|||
|
||||
if (data != null) {
|
||||
|
||||
Logger.debug("[StationDetailsPlotsDirection][downloadDataFromWebservice][data.list_of_station_data.length = " + data.list_of_station_data.length +"]");
|
||||
Logger.debug("[data.list_of_station_data.length = " + data.list_of_station_data.length +"]");
|
||||
|
||||
for (StationData d : data.list_of_station_data) {
|
||||
valuesWindDirection.add(new Entry(d.epoch * 1000, d.winddir));
|
||||
|
|
|
@ -153,7 +153,7 @@ public class StationDetailsPlotsHumidity extends AppCompatActivity implements Se
|
|||
dataLn = (int)getIntent().getExtras().get("data_ln");
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[StationDetailsPlotsHumidity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
|
|
|
@ -96,7 +96,7 @@ public class StationDetailsPlotsTemperature extends AppCompatActivity implements
|
|||
// utc timestamp
|
||||
long utcTimestamp = utcTime.toEpochSecond();
|
||||
|
||||
Logger.debug("[StationDetailsPlotsTemperature][downloadDataFromWebservice][station.getSystemName() = " + station.getSystemName() +"]");
|
||||
Logger.debug("[station.getSystemName() = " + station.getSystemName() +"]");
|
||||
|
||||
if (this.dataLn < 0 || this.dataLn > 2) {
|
||||
// last 2000 points of data, regardless the timescale
|
||||
|
@ -117,7 +117,7 @@ public class StationDetailsPlotsTemperature extends AppCompatActivity implements
|
|||
|
||||
if (data instanceof ListOfStationData) {
|
||||
|
||||
Logger.debug("[StationDetailsPlotsTemperature][downloadDataFromWebservice][data.list_of_station_data.length = " + data.list_of_station_data.length +"]");
|
||||
Logger.debug("[data.list_of_station_data.length = " + data.list_of_station_data.length +"]");
|
||||
|
||||
for (StationData d : data.list_of_station_data) {
|
||||
valuesTemperature.add(new Entry(d.epoch * 1000, d.temperature));
|
||||
|
|
|
@ -105,10 +105,10 @@ public class StationDetailsPlotsWind extends AppCompatActivity implements SeekBa
|
|||
|
||||
station = (WeatherStation) getIntent().getSerializableExtra("station");
|
||||
|
||||
Logger.info("[StationDetailsPlotsWind][onCreate][station.getSystemName() = " + station.getSystemName() +"][dataLn = " + dataLn +"]");
|
||||
Logger.info("[station.getSystemName() = " + station.getSystemName() +"][dataLn = " + dataLn +"]");
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[StationDetailsPlotsHumidity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
|
@ -218,7 +218,7 @@ public class StationDetailsPlotsWind extends AppCompatActivity implements SeekBa
|
|||
// utc timestamp
|
||||
long utcTimestamp = utcTime.toEpochSecond();
|
||||
|
||||
Logger.debug("[StationDetailsPlotsWind][downloadDataFromWebservice][station.getSystemName() = " + station.getSystemName() +"]");
|
||||
Logger.debug("[station.getSystemName() = " + station.getSystemName() +"]");
|
||||
|
||||
if (this.dataLn < 0 || this.dataLn > 2) {
|
||||
// last 2000 points of data, regardless the timescale
|
||||
|
@ -242,7 +242,7 @@ public class StationDetailsPlotsWind extends AppCompatActivity implements SeekBa
|
|||
|
||||
if (data instanceof ListOfStationData) {
|
||||
|
||||
Logger.debug("[StationDetailsPlotsWind][downloadDataFromWebservice][data.list_of_station_data.length = " + data.list_of_station_data.length +"]");
|
||||
Logger.debug("[data.list_of_station_data.length = " + data.list_of_station_data.length +"]");
|
||||
|
||||
for (StationData d : data.list_of_station_data) {
|
||||
valuesWindSpeed.add(new Entry(d.epoch * 1000, d.windspeed));
|
||||
|
|
|
@ -16,8 +16,9 @@ import java.util.Locale;
|
|||
|
||||
import cc.pogoda.mobile.meteosystem.Main;
|
||||
import cc.pogoda.mobile.meteosystem.R;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.StationDetailsValuesOnActivityFromSummaryUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.StationDetailsValuesOnActivityFromFavsUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.StationDetailsValuesOnActivityUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.thread.StationSummaryUpdaterThread;
|
||||
import cc.pogoda.mobile.meteosystem.config.AppConfiguration;
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.StationSummaryActElements;
|
||||
|
@ -30,9 +31,11 @@ public class StationDetailsSummaryActivity extends AppCompatActivity {
|
|||
|
||||
WeatherStation station = null;
|
||||
|
||||
StationSummaryUpdaterThread updaterThread = null;
|
||||
|
||||
StationDetailsValuesOnActivityUpdater valuesOnActUpdater = null;
|
||||
|
||||
StationDetailsValuesOnActivityFromSummaryUpdater valuesFromSummaryUpdater = null;
|
||||
StationDetailsValuesOnActivityFromFavsUpdater valuesFromFavsSummaryUpdater = null;
|
||||
|
||||
Handler handler = null;
|
||||
|
||||
|
@ -45,7 +48,7 @@ public class StationDetailsSummaryActivity extends AppCompatActivity {
|
|||
|
||||
elems = new StationSummaryActElements();
|
||||
|
||||
int color = ContextCompat.getColor(this, android.R.color.secondary_text_light);
|
||||
int color = main.getThemeColours().colorOnSecondary;
|
||||
|
||||
Summary summary = null;
|
||||
SummaryDao summary_dao = new SummaryDao();
|
||||
|
@ -54,10 +57,10 @@ public class StationDetailsSummaryActivity extends AppCompatActivity {
|
|||
|
||||
station = (WeatherStation) getIntent().getSerializableExtra("station");
|
||||
|
||||
Logger.info("[StationDetailsSummaryActivity][onCreate][station.getSystemName() = " + station.getSystemName() +"]");
|
||||
Logger.info("[station.getSystemName() = " + station.getSystemName() +"]");
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[StationDetailsPlotsHumidity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
|
@ -89,11 +92,6 @@ public class StationDetailsSummaryActivity extends AppCompatActivity {
|
|||
elems.goodColor = color;
|
||||
elems.badColor = Color.RED;
|
||||
|
||||
// get the summary data for this station
|
||||
summary = summary_dao.getStationSummary(station.getSystemName());
|
||||
|
||||
elems.updateFromSummary(summary, station.getAvailableParameters());
|
||||
|
||||
// create a handler to update station data in background
|
||||
handler = new Handler();
|
||||
|
||||
|
@ -101,24 +99,42 @@ public class StationDetailsSummaryActivity extends AppCompatActivity {
|
|||
boolean onFavs = main.checkIsOnFavsList(station.getSystemName());
|
||||
|
||||
if (onFavs) {
|
||||
valuesFromSummaryUpdater = new StationDetailsValuesOnActivityFromSummaryUpdater(elems, handler, station, main.getStationSystemNameToSummary());
|
||||
valuesFromFavsSummaryUpdater = new StationDetailsValuesOnActivityFromFavsUpdater(elems, handler, station, main.getHashmapFavStationSystemNameToSummary());
|
||||
|
||||
if (handler != null && valuesFromSummaryUpdater != null) {
|
||||
handler.post(valuesFromSummaryUpdater);
|
||||
if (handler != null && valuesFromFavsSummaryUpdater != null) {
|
||||
handler.post(valuesFromFavsSummaryUpdater);
|
||||
}
|
||||
}
|
||||
else {
|
||||
updaterThread = new StationSummaryUpdaterThread(station.getSystemName());
|
||||
|
||||
// create a copy of updater class for this station
|
||||
valuesOnActUpdater = new StationDetailsValuesOnActivityUpdater(elems, handler, station.getSystemName(), station);
|
||||
valuesOnActUpdater = new StationDetailsValuesOnActivityUpdater(elems, handler, updaterThread, station);
|
||||
|
||||
if (handler != null && valuesOnActUpdater != null) {
|
||||
handler.post(valuesOnActUpdater);
|
||||
updaterThread.start(50);
|
||||
|
||||
handler.postDelayed(valuesOnActUpdater, 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
if (updaterThread != null) {
|
||||
updaterThread.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
if (updaterThread != null) {
|
||||
updaterThread.start(50);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -128,6 +144,20 @@ public class StationDetailsSummaryActivity extends AppCompatActivity {
|
|||
handler.removeCallbacks(valuesOnActUpdater);
|
||||
}
|
||||
|
||||
if (updaterThread != null) {
|
||||
updaterThread.stop();
|
||||
}
|
||||
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
|
||||
if (updaterThread != null) {
|
||||
updaterThread.stop();
|
||||
}
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
|
@ -2,6 +2,7 @@ package cc.pogoda.mobile.meteosystem.activity;
|
|||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
|
||||
|
@ -9,8 +10,9 @@ import org.tinylog.Logger;
|
|||
|
||||
import cc.pogoda.mobile.meteosystem.Main;
|
||||
import cc.pogoda.mobile.meteosystem.R;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.StationDetailsValuesOnActivityFromSummaryUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.StationDetailsValuesOnActivityFromFavsUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.StationDetailsValuesOnActivityUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.thread.StationSummaryUpdaterThread;
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.StationWindRoseActElements;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
|
@ -22,9 +24,11 @@ public class StationDetailsWindRoseActivity extends AppCompatActivity {
|
|||
|
||||
Summary summary;
|
||||
|
||||
StationSummaryUpdaterThread updaterThread = null;
|
||||
|
||||
StationDetailsValuesOnActivityUpdater onActivityUpdater = null;
|
||||
|
||||
StationDetailsValuesOnActivityFromSummaryUpdater fromSummaryUpdater = null;
|
||||
StationDetailsValuesOnActivityFromFavsUpdater fromSummaryUpdater = null;
|
||||
|
||||
Handler handler = null;
|
||||
|
||||
|
@ -43,7 +47,7 @@ public class StationDetailsWindRoseActivity extends AppCompatActivity {
|
|||
|
||||
station = (WeatherStation) getIntent().getSerializableExtra("station");
|
||||
|
||||
Logger.info("[StationDetailsWindRoseActivity][onCreate][station.getSystemName() = " + station.getSystemName() +"]");
|
||||
Logger.info("[station.getSystemName() = " + station.getSystemName() +"]");
|
||||
|
||||
main = (Main)getApplication();
|
||||
|
||||
|
@ -57,6 +61,8 @@ public class StationDetailsWindRoseActivity extends AppCompatActivity {
|
|||
elements.maxGust = findViewById(R.id.textViewWindRoseMaxHourGust);
|
||||
elements.minAverage = findViewById(R.id.textViewWindRoseMinHourSpeed);
|
||||
elements.pressure = findViewById(R.id.textViewWindRosePressure);
|
||||
elements.goodColor = ((Main) getApplication()).getThemeColours().colorOnSecondary;
|
||||
elements.badColor = Color.RED;
|
||||
elements.setActivity(this);
|
||||
|
||||
// create the handler which will update the screen in background
|
||||
|
@ -64,36 +70,52 @@ public class StationDetailsWindRoseActivity extends AppCompatActivity {
|
|||
|
||||
SummaryDao summary_dao = new SummaryDao();
|
||||
|
||||
// get the set of current values to preconfigure all elements on this activity
|
||||
summary = summary_dao.getStationSummary(station.getSystemName());
|
||||
|
||||
// update parameters (like turn the wind direction arrow)
|
||||
elements.updateFromSummary(summary, station.getAvailableParameters());
|
||||
|
||||
handler = new Handler();
|
||||
|
||||
// check if this station is on favourites list
|
||||
boolean onFavs = main.checkIsOnFavsList(station.getSystemName());
|
||||
|
||||
if (onFavs) {
|
||||
fromSummaryUpdater = new StationDetailsValuesOnActivityFromSummaryUpdater(elements, handler, station, main.getStationSystemNameToSummary());
|
||||
fromSummaryUpdater = new StationDetailsValuesOnActivityFromFavsUpdater(elements, handler, station, main.getHashmapFavStationSystemNameToSummary());
|
||||
|
||||
if (handler != null && fromSummaryUpdater != null) {
|
||||
handler.post(fromSummaryUpdater);
|
||||
}
|
||||
}
|
||||
else {
|
||||
onActivityUpdater = new StationDetailsValuesOnActivityUpdater(elements, handler, station.getSystemName(), station);
|
||||
updaterThread = new StationSummaryUpdaterThread(station.getSystemName());
|
||||
|
||||
onActivityUpdater = new StationDetailsValuesOnActivityUpdater(elements, handler, updaterThread, station);
|
||||
|
||||
if (handler != null && onActivityUpdater != null) {
|
||||
updaterThread.start(50);
|
||||
|
||||
// start the handler to update the wind rose activity in background
|
||||
handler.post(onActivityUpdater);
|
||||
handler.postDelayed(onActivityUpdater, 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
if (updaterThread != null) {
|
||||
updaterThread.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
if (updaterThread != null && updaterThread.isEnabled() == false) {
|
||||
updaterThread.start(50);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
|
||||
|
@ -102,6 +124,19 @@ public class StationDetailsWindRoseActivity extends AppCompatActivity {
|
|||
handler.removeCallbacks(onActivityUpdater);
|
||||
}
|
||||
|
||||
if (updaterThread != null) {
|
||||
updaterThread.stop();
|
||||
}
|
||||
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
if (updaterThread != null) {
|
||||
updaterThread.stop();
|
||||
}
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
|
@ -38,7 +38,7 @@ public class TrendActivity extends AppCompatActivity {
|
|||
String stationName = (String)getIntent().getExtras().get("station");
|
||||
|
||||
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
|
||||
Logger.debug("[StationDetailsPlotsHumidity][onCreate][AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
|
||||
Locale locale = new Locale(AppConfiguration.locale);
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = this.getResources();
|
||||
|
|
|
@ -12,27 +12,15 @@ import cc.pogoda.mobile.meteosystem.type.ParceableStationsList;
|
|||
public class MainActImageButtonAllStationsClickEvent implements View.OnClickListener {
|
||||
|
||||
MainActivity parent;
|
||||
|
||||
Intent intent;
|
||||
|
||||
public MainActImageButtonAllStationsClickEvent(MainActivity parent) {
|
||||
this.parent = parent;
|
||||
|
||||
intent = new Intent(this.parent, AllStationsActivity.class);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (parent.listOfAllStationsReady()) {
|
||||
launchActivity();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
private void launchActivity() {
|
||||
parent.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ public class MainActImageButtonExportClickEvent implements View.OnClickListener{
|
|||
@Override
|
||||
public void onClick(View view) {
|
||||
|
||||
Logger.info("[MainActImageButtonExportClickEvent][onClick]");
|
||||
Logger.info("[onClick]");
|
||||
|
||||
parent.startActivity(intent);
|
||||
}
|
||||
|
|
|
@ -27,9 +27,6 @@ public class MainActImageButtonFavouritesClickEvent implements View.OnClickListe
|
|||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (parent.listOfAllFavsReady()) {
|
||||
parent.startActivity(intent);
|
||||
|
||||
}
|
||||
parent.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity.updater;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.DETAILS_ON_FAVS_LIST_DEFAULT_UPDATE;
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.DETAILS_ON_FAVS_LIST_REUPDATE;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.graphics.Color;
|
||||
import android.os.Handler;
|
||||
|
@ -12,15 +15,17 @@ import java.util.Map;
|
|||
import java.util.Set;
|
||||
import java.util.Vector;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.thread.FavouritesStationSummaryUpdaterThread;
|
||||
import cc.pogoda.mobile.meteosystem.dao.AvailableParametersDao;
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.AvailableParameters;
|
||||
import cc.pogoda.mobile.meteosystem.type.ThemeColours;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.AvailableParametersWeb;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.QualityFactor;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
/**
|
||||
* This class is used to update entries (TextView) on Favourites list using HashMap
|
||||
* which is updated by {@link FavouritesStationSummaryUpdater}
|
||||
* which is updated by {@link FavouritesStationSummaryUpdaterThread}
|
||||
*/
|
||||
public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
||||
|
||||
|
@ -38,10 +43,11 @@ public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private AvailableParametersDao availableParametersDao = null;
|
||||
//private AvailableParametersDao availableParametersDao = null;
|
||||
private HashMap<String, AvailableParameters> availParams;
|
||||
|
||||
/**
|
||||
* This map comes from 'Main' class and it is shared with @link{{@link FavouritesStationSummaryUpdater}}
|
||||
* This map comes from 'Main' class and it is shared with @link{{@link FavouritesStationSummaryUpdaterThread}}
|
||||
*/
|
||||
HashMap<String, Summary> stationNameSummary = null;
|
||||
|
||||
|
@ -51,11 +57,17 @@ public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
|||
*/
|
||||
private boolean enabled;
|
||||
|
||||
public FavouritesStationDetailsOnListUpdater(Handler _handler, HashMap<String, Summary> _station_system_name_to_summary) {
|
||||
/**
|
||||
* Used everywhere, where a colour of any element is set programatically (not globally from the theme)
|
||||
*/
|
||||
private ThemeColours themeColours;
|
||||
|
||||
public FavouritesStationDetailsOnListUpdater(Handler _handler, HashMap<String, Summary> _station_system_name_to_summary, HashMap<String, AvailableParameters> _avail_params, ThemeColours _themeColours) {
|
||||
handler = _handler;
|
||||
stationsToUpdate = new HashMap<>();
|
||||
availableParametersDao = new AvailableParametersDao();
|
||||
availParams = _avail_params;
|
||||
stationNameSummary = _station_system_name_to_summary;
|
||||
themeColours = _themeColours;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
|
@ -74,6 +86,8 @@ public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
|||
@Override
|
||||
public void run() {
|
||||
|
||||
int nextExecutionDelay = DETAILS_ON_FAVS_LIST_DEFAULT_UPDATE;
|
||||
|
||||
if (stationNameSummary != null && enabled && stationsToUpdate != null && stationsToUpdate.size() > 0) {
|
||||
|
||||
// get a set of all elements stored in the map
|
||||
|
@ -93,19 +107,19 @@ public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
|||
Summary summary = stationNameSummary.get(stationSystemName);
|
||||
|
||||
// query for available parameters
|
||||
AvailableParametersWeb params = availableParametersDao.getAvaliableParamsByStationName(stationSystemName);
|
||||
AvailableParameters params = availParams.get(stationSystemName);
|
||||
|
||||
// if data has been collected
|
||||
if (summary != null && params != null) {
|
||||
Logger.debug("[FavouritesStationDetailsOnListUpdater][run][stationSystemName = " + stationSystemName +"][summary.last_timestamp = " + summary.last_timestamp +"]");
|
||||
Logger.debug("[stationSystemName = " + stationSystemName +"][summary.last_timestamp = " + summary.last_timestamp +"]");
|
||||
|
||||
String str;
|
||||
|
||||
// check if this station transmits wind information
|
||||
if (params.hasWind) {
|
||||
if (params.windSpeed) {
|
||||
|
||||
// check if station transmits humidity
|
||||
if (params.hasHumidity) {
|
||||
if (params.humidity) {
|
||||
str = String.format("%s %d%% %s %s max %s", summary.getTemperatureStr(false, true), summary.humidity, summary.getWindDirStr(), summary.getWindspeedStr(false), summary.getWindgustsStr(false));
|
||||
}
|
||||
else {
|
||||
|
@ -113,7 +127,7 @@ public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
|||
}
|
||||
}
|
||||
else {
|
||||
if (params.hasHumidity) {
|
||||
if (params.humidity) {
|
||||
str = String.format("%s %d%%", summary.getTemperatureStr(false, true), summary.humidity);
|
||||
}
|
||||
else {
|
||||
|
@ -125,22 +139,23 @@ public class FavouritesStationDetailsOnListUpdater implements Runnable {
|
|||
// update text view on the favourites list
|
||||
toUpdate.setText(str);
|
||||
|
||||
if ( (params.hasHumidity && summary.humidity_qf_native.equals(QualityFactor.NOT_AVALIABLE)) ||
|
||||
if ( (params.humidity && summary.humidity_qf_native.equals(QualityFactor.NOT_AVALIABLE)) ||
|
||||
(summary.temperature_qf_native.equals(QualityFactor.NOT_AVALIABLE)) ||
|
||||
(params.hasWind && summary.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)))
|
||||
(params.windSpeed && summary.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)))
|
||||
{
|
||||
toUpdate.setTextColor(Color.RED);
|
||||
}
|
||||
else {
|
||||
toUpdate.setTextColor(androidx.activity.R.color.secondary_text_default_material_light);
|
||||
toUpdate.setTextColor(themeColours.colorPrimary);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Logger.error("[FavouritesStationDetailsOnListUpdater][run][summary object is null!! Maybe the API responds exeptionally slow?]");
|
||||
Logger.error("[stationSystemName = " + stationSystemName + "][summary object is null!! Maybe the API responds exceptionally slow?]");
|
||||
nextExecutionDelay = DETAILS_ON_FAVS_LIST_REUPDATE;
|
||||
}
|
||||
}
|
||||
|
||||
handler.postDelayed(this, 3000);
|
||||
handler.postDelayed(this, nextExecutionDelay);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity.updater;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.NORMAL_UPDATE_VALUES_ON_ACTIVITY;
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL;
|
||||
|
||||
import android.os.Handler;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.thread.FavouritesStationSummaryUpdaterThread;
|
||||
import cc.pogoda.mobile.meteosystem.type.StationActivityElements;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
/**
|
||||
* This class uses external HashMap updated by @link{{@link FavouritesStationSummaryUpdaterThread}}
|
||||
*/
|
||||
public class StationDetailsValuesOnActivityFromFavsUpdater implements Runnable {
|
||||
|
||||
HashMap<String, Summary> mapWithSummary;
|
||||
|
||||
StationActivityElements elementsToUpdate;
|
||||
|
||||
Handler handler;
|
||||
|
||||
WeatherStation stationToUpdate;
|
||||
|
||||
public StationDetailsValuesOnActivityFromFavsUpdater(StationActivityElements elems, Handler h, WeatherStation station, HashMap<String, Summary> _map_with_summary_data) {
|
||||
stationToUpdate = station;
|
||||
handler = h;
|
||||
elementsToUpdate = elems;
|
||||
mapWithSummary = _map_with_summary_data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
if (mapWithSummary != null && elementsToUpdate != null) {
|
||||
|
||||
Logger.info("[stationToUpdate.getSystemName() = " + stationToUpdate.getSystemName() +"]");
|
||||
|
||||
Summary summary = mapWithSummary.get(stationToUpdate.getSystemName());
|
||||
|
||||
if (summary != null) {
|
||||
elementsToUpdate.updateFromSummary(summary, stationToUpdate.getAvailableParameters());
|
||||
handler.postDelayed(this, NORMAL_UPDATE_VALUES_ON_ACTIVITY);
|
||||
}
|
||||
else {
|
||||
handler.postDelayed(this, REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity.updater;
|
||||
|
||||
import android.os.Handler;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.type.StationActivityElements;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
/**
|
||||
* This class uses external HashMap updated by @link{{@link FavouritesStationSummaryUpdater}}
|
||||
*/
|
||||
public class StationDetailsValuesOnActivityFromSummaryUpdater implements Runnable {
|
||||
|
||||
HashMap<String, Summary> mapWithSummary;
|
||||
|
||||
StationActivityElements elementsToUpdate;
|
||||
|
||||
Handler handler;
|
||||
|
||||
WeatherStation stationToUpdate;
|
||||
|
||||
public StationDetailsValuesOnActivityFromSummaryUpdater(StationActivityElements elems, Handler h, WeatherStation station, HashMap<String, Summary> _map_with_summary_data) {
|
||||
stationToUpdate = station;
|
||||
handler = h;
|
||||
elementsToUpdate = elems;
|
||||
mapWithSummary = _map_with_summary_data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
if (mapWithSummary != null && elementsToUpdate != null) {
|
||||
|
||||
Logger.info("[StationDetailsValuesOnActivityFromSummaryUpdater][run][stationToUpdate.getSystemName() = " + stationToUpdate.getSystemName() +"]");
|
||||
|
||||
elementsToUpdate.updateFromSummary(mapWithSummary.get(stationToUpdate.getSystemName()), stationToUpdate.getAvailableParameters());
|
||||
|
||||
handler.postDelayed(this, 90000);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,9 +1,13 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity.updater;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.NORMAL_UPDATE_VALUES_ON_ACTIVITY;
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL;
|
||||
|
||||
import android.os.Handler;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.thread.StationSummaryUpdaterThread;
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.StationActivityElements;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
|
@ -23,16 +27,19 @@ public class StationDetailsValuesOnActivityUpdater implements Runnable {
|
|||
|
||||
SummaryDao dao = null;
|
||||
|
||||
StationSummaryUpdaterThread updater_thread;
|
||||
|
||||
Summary station_summary = null;
|
||||
|
||||
String station_name;
|
||||
|
||||
WeatherStation station;
|
||||
|
||||
public StationDetailsValuesOnActivityUpdater(StationActivityElements elems, Handler h, String station_name, WeatherStation station) {
|
||||
public StationDetailsValuesOnActivityUpdater(StationActivityElements elems, Handler h, StationSummaryUpdaterThread updaterThread, WeatherStation station) {
|
||||
elements = elems;
|
||||
handler = h;
|
||||
this.station_name = station_name;
|
||||
updater_thread = updaterThread;
|
||||
this.station_name = station.getSystemName();
|
||||
this.station = station;
|
||||
|
||||
dao = new SummaryDao();
|
||||
|
@ -42,19 +49,26 @@ public class StationDetailsValuesOnActivityUpdater implements Runnable {
|
|||
@Override
|
||||
public void run() {
|
||||
|
||||
if (elements == null) {
|
||||
if (elements == null || updater_thread == null) {
|
||||
Logger.error("[something is null even if it shouldn't!!!!]");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// get the current data from the Web Service
|
||||
station_summary = dao.getStationSummary(station_name);
|
||||
station_summary = updater_thread.getSummary();
|
||||
|
||||
Logger.debug("[StationDetailsValuesOnActivityUpdater][run][station_name = " + station_name +"]");
|
||||
Logger.debug("[station_name = " + station_name +"]");
|
||||
|
||||
// null check is done inside this call
|
||||
elements.updateFromSummary(station_summary, station.getAvailableParameters());
|
||||
|
||||
handler.postDelayed(this, 90000);
|
||||
if (station_summary != null) {
|
||||
// null check is done inside this call
|
||||
elements.updateFromSummary(station_summary, station.getAvailableParameters());
|
||||
handler.postDelayed(this, NORMAL_UPDATE_VALUES_ON_ACTIVITY);
|
||||
}
|
||||
else {
|
||||
// 'station_summary' might be null if internet connection is poor and background
|
||||
// thread wasn't able to download a summary on time
|
||||
handler.postDelayed(this, REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity.updater;
|
||||
package cc.pogoda.mobile.meteosystem.activity.updater.thread;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.telephony.SubscriptionManager;
|
||||
|
@ -15,19 +17,26 @@ import java.util.concurrent.ScheduledFuture;
|
|||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.dao.AvailableParametersDao;
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.AvailableParameters;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.AvailableParametersWeb;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
/**
|
||||
* This class is a runnable executed from background Thread by ScheduledExecuter
|
||||
* which periodically download current Summary for all stations stored on favourites list
|
||||
*/
|
||||
public class FavouritesStationSummaryUpdater implements Runnable {
|
||||
public class FavouritesStationSummaryUpdaterThread implements Runnable {
|
||||
|
||||
private HashMap<String, Summary> map;
|
||||
|
||||
private HashMap<String, AvailableParameters> availableParametersHashMap;
|
||||
|
||||
private SummaryDao summaryDao;
|
||||
|
||||
private AvailableParametersDao availableParametersDao;
|
||||
|
||||
private ScheduledExecutorService executor;
|
||||
|
||||
private ScheduledFuture scheduledTask;
|
||||
|
@ -39,9 +48,12 @@ public class FavouritesStationSummaryUpdater implements Runnable {
|
|||
*/
|
||||
private boolean forceUpdate = false;
|
||||
|
||||
public FavouritesStationSummaryUpdater(HashMap<String, Summary> _out_map) {
|
||||
public FavouritesStationSummaryUpdaterThread(HashMap<String, Summary> _out_map, HashMap<String, AvailableParameters> _avail_params_map) {
|
||||
map = _out_map;
|
||||
availableParametersHashMap = _avail_params_map;
|
||||
|
||||
summaryDao = new SummaryDao();
|
||||
availableParametersDao = new AvailableParametersDao();
|
||||
|
||||
executor = Executors.newScheduledThreadPool(5);
|
||||
}
|
||||
|
@ -51,6 +63,8 @@ public class FavouritesStationSummaryUpdater implements Runnable {
|
|||
// check if map was set so something
|
||||
if (map != null && map.size() > 0) {
|
||||
|
||||
Logger.info("[map.size() = " + map.size() +"]");
|
||||
|
||||
// get a set of all stations from favourites
|
||||
Set<Map.Entry<String, Summary>> _set_of_stations_names = map.entrySet();
|
||||
|
||||
|
@ -66,14 +80,32 @@ public class FavouritesStationSummaryUpdater implements Runnable {
|
|||
|
||||
Summary summary = summaryDao.getStationSummary(station_name);
|
||||
|
||||
Logger.debug("[FavouritesStationSummaryUpdater][run][station_name = " + station_name +"][summary.last_timestamp = " + summary.last_timestamp +"]");
|
||||
// check if summary was returned (as it will not in case on HTTP 500 or something else)
|
||||
if (summary != null) {
|
||||
Logger.info("[station_name = " + station_name + "][summary.last_timestamp = " + summary.last_timestamp + "]");
|
||||
|
||||
// put the summary back into the map
|
||||
map.put(station_name, summary);
|
||||
// put the summary back into the map
|
||||
map.put(station_name, summary);
|
||||
}
|
||||
|
||||
AvailableParameters parameters = AvailableParameters.fromWebData(availableParametersDao.getAvaliableParamsByStationName(station_name));
|
||||
|
||||
if (parameters != null) {
|
||||
availableParametersHashMap.put(station_name, parameters);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else {
|
||||
// no station to update may be caused by two reasons
|
||||
// 1. there is no weather station to update
|
||||
// 2. API responds very slow or there is a problem with internet connection
|
||||
Logger.info("[no station to update]");
|
||||
|
||||
stop();
|
||||
start(REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL);
|
||||
}
|
||||
|
||||
if (forceUpdate) {
|
||||
forceUpdate = false;
|
||||
|
@ -92,7 +124,7 @@ public class FavouritesStationSummaryUpdater implements Runnable {
|
|||
|
||||
public void start(int _initial_delay) {
|
||||
|
||||
Logger.debug("[FavouritesStationSummaryUpdater][start][_initial_delay = " + _initial_delay +"]");
|
||||
Logger.debug("[_initial_delay = " + _initial_delay +"]");
|
||||
|
||||
if (enabled) {
|
||||
stop();
|
|
@ -0,0 +1,89 @@
|
|||
package cc.pogoda.mobile.meteosystem.activity.updater.thread;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.ConstAppConfiguration.REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
import cc.pogoda.mobile.meteosystem.type.web.Summary;
|
||||
|
||||
/**
|
||||
* This class is simmilar to {@link FavouritesStationSummaryUpdaterThread}, but it
|
||||
* downloads summary data for any defined weather station
|
||||
*/
|
||||
public class StationSummaryUpdaterThread implements Runnable {
|
||||
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
boolean enabled = false;
|
||||
|
||||
@NonNull
|
||||
String systemName;
|
||||
|
||||
ScheduledExecutorService executorService;
|
||||
|
||||
ScheduledFuture scheduledTask;
|
||||
|
||||
Summary summary = null;
|
||||
|
||||
public Summary getSummary() {
|
||||
return summary;
|
||||
}
|
||||
|
||||
public StationSummaryUpdaterThread(@NonNull String stationSystemName) {
|
||||
systemName = stationSystemName;
|
||||
|
||||
executorService = Executors.newScheduledThreadPool(3);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (systemName != null) {
|
||||
Logger.info("[StationSummaryUpdaterThread][run][systemName = " + systemName +"]");
|
||||
|
||||
SummaryDao summaryDao = new SummaryDao();
|
||||
|
||||
summary = summaryDao.getStationSummary(systemName);
|
||||
|
||||
if (summary == null) {
|
||||
// no ssummary data may be caused by two reasons
|
||||
// 1. there is no weather station to update
|
||||
// 2. API responds very slow or there is a problem with internet connection
|
||||
Logger.info("[no station to update]");
|
||||
|
||||
stop();
|
||||
start(REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void start(int _initial_delay) {
|
||||
|
||||
Logger.info("[_initial_delay = " + _initial_delay +"]");
|
||||
|
||||
if (enabled) {
|
||||
stop();
|
||||
}
|
||||
|
||||
scheduledTask = executorService.scheduleAtFixedRate(this, _initial_delay, 60000, TimeUnit.MILLISECONDS);
|
||||
enabled = true;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if (enabled) {
|
||||
Logger.info("[systemName = " + systemName +"]");
|
||||
scheduledTask.cancel(true);
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -21,23 +21,17 @@ import cc.pogoda.mobile.meteosystem.R;
|
|||
import cc.pogoda.mobile.meteosystem.activity.handler.AllStationsActRecyclerViewButtonClickEvent;
|
||||
import cc.pogoda.mobile.meteosystem.activity.updater.FavouritesStationDetailsOnListUpdater;
|
||||
import cc.pogoda.mobile.meteosystem.activity.view.AllStationsActRecyclerViewHolder;
|
||||
import cc.pogoda.mobile.meteosystem.dao.AvailableParametersDao;
|
||||
import cc.pogoda.mobile.meteosystem.dao.SummaryDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.ParceableFavsCallReason;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
|
||||
public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter<AllStationsActRecyclerViewHolder> {
|
||||
public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
|
||||
private List<WeatherStation> stations;
|
||||
final private List<WeatherStation> stations;
|
||||
|
||||
AppCompatActivity activity;
|
||||
|
||||
ParceableFavsCallReason.Reason reason;
|
||||
|
||||
SummaryDao summaryDao;
|
||||
|
||||
AvailableParametersDao paramsDao;
|
||||
|
||||
/**
|
||||
* This updater takes data stored in the hashmap and then updates TextViews on View Holders on
|
||||
* Favourites list
|
||||
|
@ -51,88 +45,116 @@ public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter<AllS
|
|||
*/
|
||||
Main main;
|
||||
|
||||
public WeatherStationRecyclerViewAdapter(List<WeatherStation> stations, AppCompatActivity parentActivity, ParceableFavsCallReason.Reason callReason) {
|
||||
private static final int VIEW_TYPE_EMPTY_LIST = 0;
|
||||
private static final int VIEW_TYPE_OBJECT = 1;
|
||||
|
||||
public WeatherStationRecyclerViewAdapter(
|
||||
List<WeatherStation> stations,
|
||||
AppCompatActivity parentActivity,
|
||||
ParceableFavsCallReason.Reason callReason) {
|
||||
this.stations = stations;
|
||||
this.activity = parentActivity;
|
||||
this.reason = callReason;
|
||||
this.summaryDao = new SummaryDao();
|
||||
this.paramsDao = new AvailableParametersDao();
|
||||
this.main = (Main) parentActivity.getApplication();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public AllStationsActRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
Context context = parent.getContext();
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
|
||||
View view;
|
||||
|
||||
// check the call reason
|
||||
if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) {
|
||||
// inflate custom layout
|
||||
view = inflater.inflate(R.layout.activity_favourites_linear_layout_data, parent, false);
|
||||
}
|
||||
else {
|
||||
// Inflate the custom layout without current data
|
||||
view = inflater.inflate(R.layout.activity_all_stations_linear_layout, parent, false);
|
||||
}
|
||||
switch (viewType){
|
||||
case VIEW_TYPE_OBJECT:
|
||||
// check the call reason
|
||||
if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) {
|
||||
// inflate custom layout
|
||||
view = inflater.inflate(R.layout.activity_favourites_linear_layout_data,
|
||||
parent, false);
|
||||
}
|
||||
else {
|
||||
// Inflate the custom layout without current data
|
||||
view = inflater.inflate(R.layout.activity_all_stations_linear_layout,
|
||||
parent, false);
|
||||
}
|
||||
return new AllStationsActRecyclerViewHolder(view, reason);
|
||||
|
||||
// Return a new holder instance
|
||||
AllStationsActRecyclerViewHolder viewHolder = new AllStationsActRecyclerViewHolder(view, reason);
|
||||
return viewHolder;
|
||||
case VIEW_TYPE_EMPTY_LIST:
|
||||
default:
|
||||
if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) {
|
||||
view = inflater.inflate(R.layout.activity_favourites_empty, parent,
|
||||
false);
|
||||
} else {
|
||||
view = inflater.inflate(R.layout.activity_all_stations_empty, parent,
|
||||
false);
|
||||
}
|
||||
return new EmptyViewHolder(view);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull AllStationsActRecyclerViewHolder holder, int position) {
|
||||
// this TextView shows the station name
|
||||
TextView textView = holder.textView;
|
||||
public int getItemViewType(int position) {
|
||||
if (stations.isEmpty()) {
|
||||
return VIEW_TYPE_EMPTY_LIST;
|
||||
} else {
|
||||
return VIEW_TYPE_OBJECT;
|
||||
}
|
||||
}
|
||||
|
||||
// this TextView shows station data if this is favourites list
|
||||
TextView textViewData = holder.textViewData;
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||
|
||||
// button to go to the StationDetailsActivity
|
||||
Button button = holder.button;
|
||||
if(viewHolder instanceof AllStationsActRecyclerViewHolder) {
|
||||
AllStationsActRecyclerViewHolder holder =
|
||||
(AllStationsActRecyclerViewHolder) viewHolder;
|
||||
|
||||
// get the station object from a list of either all stations or favourites
|
||||
WeatherStation station = stations.get(position);
|
||||
// this TextView shows the station name
|
||||
TextView textView = holder.textView;
|
||||
|
||||
if (station != null) {
|
||||
textView.setText(station.getDisplayedName());
|
||||
button.setText(R.string.select_station);
|
||||
// this TextView shows station data if this is favourites list
|
||||
TextView textViewData = holder.textViewData;
|
||||
|
||||
// button to go to the StationDetailsActivity
|
||||
Button button = holder.button;
|
||||
|
||||
// get the station object from a list of either all stations or favourites
|
||||
WeatherStation station = stations.get(position);
|
||||
|
||||
if (station != null) {
|
||||
textView.setText(station.getDisplayedName());
|
||||
button.setText(R.string.select_station);
|
||||
|
||||
if (!reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) {
|
||||
if (station.getDisplayedName().length() > 22) {
|
||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20.0f);
|
||||
} else {
|
||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22.0f);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (station.getDisplayedName().length() > 22) {
|
||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20.0f);
|
||||
} else {
|
||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22.0f);
|
||||
}
|
||||
|
||||
button.setOnClickListener(new AllStationsActRecyclerViewButtonClickEvent(station, activity, reason));
|
||||
}
|
||||
|
||||
button.setOnClickListener(new AllStationsActRecyclerViewButtonClickEvent(station, activity, reason));
|
||||
}
|
||||
|
||||
// this if distinguish between All Stations and Favorites view
|
||||
if (textViewData != null && favsUpdater != null) {
|
||||
|
||||
favsUpdater.addNewStation(station.getSystemName(), textViewData);
|
||||
// this if distinguish between All Stations and Favorites view
|
||||
if (textViewData != null && favsUpdater != null) {
|
||||
|
||||
favsUpdater.addNewStation(station.getSystemName(), textViewData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void update(@NonNull List<WeatherStation> updatedStations) {
|
||||
stations.clear();
|
||||
stations.addAll(updatedStations);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return stations.size();
|
||||
// In case of empty station list at least 1 should be returned to properly select view type
|
||||
// and render empty list info.
|
||||
return stations.isEmpty() ? 1 : stations.size();
|
||||
}
|
||||
|
||||
|
||||
public void createAndStartUpdater() {
|
||||
|
||||
// check if there is previous instance of updater
|
||||
|
@ -141,17 +163,30 @@ public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter<AllS
|
|||
}
|
||||
|
||||
handler = new Handler(Looper.getMainLooper());
|
||||
favsUpdater = new FavouritesStationDetailsOnListUpdater(handler, main.getStationSystemNameToSummary());
|
||||
favsUpdater = new FavouritesStationDetailsOnListUpdater(
|
||||
handler,
|
||||
main.getHashmapFavStationSystemNameToSummary(),
|
||||
main.getHashmapAllStationSystemNameToAvailParameters(),
|
||||
main.getThemeColours());
|
||||
|
||||
handler.postDelayed(favsUpdater, 100);
|
||||
favsUpdater.setEnabled(true);
|
||||
}
|
||||
|
||||
public void stopUpdater() {
|
||||
if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) {
|
||||
if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)
|
||||
&& handler != null && favsUpdater != null) {
|
||||
handler.removeCallbacks(favsUpdater);
|
||||
favsUpdater.setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private class EmptyViewHolder extends RecyclerView.ViewHolder{
|
||||
|
||||
public EmptyViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
package cc.pogoda.mobile.meteosystem.config;
|
||||
|
||||
public class ConstAppConfiguration {
|
||||
|
||||
public static final int REUPDATE_VALUES_ON_ACTIVITY_ON_FAIL = 1000;
|
||||
|
||||
public static final int NORMAL_UPDATE_VALUES_ON_ACTIVITY = 60000;
|
||||
|
||||
/**
|
||||
* This is an interval how often labels on Favourites List (with station
|
||||
* summary) are updated.
|
||||
*/
|
||||
public static final int DETAILS_ON_FAVS_LIST_REUPDATE = 500;
|
||||
|
||||
public static final int DETAILS_ON_FAVS_LIST_DEFAULT_UPDATE = 45000;
|
||||
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package cc.pogoda.mobile.meteosystem.config;
|
||||
|
||||
public class WebIoConfig {
|
||||
|
||||
public static final int TIMEOUT_SECOND = 20;
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
package cc.pogoda.mobile.meteosystem.dao;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.WebIoConfig.TIMEOUT_SECOND;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
@ -32,7 +34,7 @@ public class AllStationsDao {
|
|||
try {
|
||||
resp = consumer.getAllStations().execute();
|
||||
} catch (Exception e) {
|
||||
Logger.error("[AllStationsDao][Worker][Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
package cc.pogoda.mobile.meteosystem.dao;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.WebIoConfig.TIMEOUT_SECOND;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.type.web.AvailableParametersWeb;
|
||||
import cc.pogoda.mobile.meteosystem.web.AvailableParametersConsumer;
|
||||
import cc.pogoda.mobile.meteosystem.web.RestClientConfig;
|
||||
|
@ -25,10 +29,26 @@ public class AvailableParametersDao {
|
|||
|
||||
try {
|
||||
response = consumer.getParametersForStation(stationName).execute();
|
||||
} catch (Exception e) {
|
||||
Logger.error("[AvailableParametersDao][Worker][Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
} catch (IOException e) {
|
||||
Logger.error("[IOException][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
} catch (RuntimeException e) {
|
||||
Logger.error("[RuntimeException][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (Exception e) {
|
||||
Logger.error("[Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (response == null) {
|
||||
Logger.error("[worker is done, response is null]");
|
||||
}
|
||||
else {
|
||||
Logger.info("[worker is done][response.code() = " + response.code() +"]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +65,9 @@ public class AvailableParametersDao {
|
|||
try {
|
||||
t.join();
|
||||
|
||||
out = response.body();
|
||||
if (response != null) {
|
||||
out = response.body();
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package cc.pogoda.mobile.meteosystem.dao;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.WebIoConfig.TIMEOUT_SECOND;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.type.web.ListOfStationData;
|
||||
|
@ -25,7 +27,7 @@ public class LastStationDataDao {
|
|||
try {
|
||||
response = consumer.getLastDataForStation(station, true, true).execute();
|
||||
} catch (Exception e) {
|
||||
Logger.error("[LastStationDataDao][Worker][Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ public class StationDataDao {
|
|||
try {
|
||||
response = consumer.getDataForStation(station, from, to).execute();
|
||||
} catch (Exception e) {
|
||||
Logger.error("[StationDataDao][Worker][Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -52,7 +52,9 @@ public class StationDataDao {
|
|||
thread.start();
|
||||
thread.join();
|
||||
|
||||
out = response.body();
|
||||
if (response != null) {
|
||||
out = response.body();
|
||||
}
|
||||
}
|
||||
catch (InterruptedException ex) {
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package cc.pogoda.mobile.meteosystem.dao;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.WebIoConfig.TIMEOUT_SECOND;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -32,11 +34,29 @@ public class SummaryDao {
|
|||
SummaryConsumer consumer = restClient.getWeatherStationClient().create(SummaryConsumer.class);
|
||||
|
||||
try {
|
||||
Logger.info("[station = " + station +"]");
|
||||
|
||||
response = consumer.getSummaryForStation(station).execute();
|
||||
} catch (IOException e) {
|
||||
Logger.error("[SummaryDao][Worker][Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[station = " + station + "][IOException][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
} catch (RuntimeException e) {
|
||||
Logger.error("[station = " + station + "][RuntimeException][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (Exception e) {
|
||||
Logger.error("[station = " + station + "][Exception][e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (response == null) {
|
||||
Logger.error("[station = " + station + "][worker is done, response is null]");
|
||||
}
|
||||
else {
|
||||
Logger.info("[station = " + station + "][worker is done][response.code() = " + response.code() +"]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -67,9 +87,17 @@ public class SummaryDao {
|
|||
out.humidity_qf_native = QualityFactor.valueOf(out.humidity_qf);
|
||||
out.qnh_qf_native = QualityFactor.valueOf(out.qnh_qf);
|
||||
}
|
||||
else {
|
||||
Logger.error("[station = " + station +"][response.code() = " + response.code() +"][response body is nulll, probably HTTP error" +
|
||||
"]");
|
||||
}
|
||||
}
|
||||
else {
|
||||
Logger.error("[station = " + station +"][response is null!!]");
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
Logger.error("[station = " + station +"][InterruptedException]");
|
||||
}
|
||||
|
||||
return out;
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package cc.pogoda.mobile.meteosystem.dao;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.WebIoConfig.TIMEOUT_SECOND;
|
||||
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -48,7 +50,9 @@ public class TrendDao {
|
|||
try {
|
||||
thread.join();
|
||||
|
||||
out = trend.body();
|
||||
if (trend != null) {
|
||||
out = trend.body();
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ public class ConfigurationFile {
|
|||
} catch (IOException | JSONException e) {
|
||||
e.printStackTrace();
|
||||
|
||||
Logger.error("[ConfigurationFile][restoreFromFile][e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[e = " + e.getLocalizedMessage() +"]");
|
||||
|
||||
AppConfiguration.locale = "default";
|
||||
AppConfiguration.replaceMsWithKnots = false;
|
||||
|
|
|
@ -39,10 +39,10 @@ public class CopyLog {
|
|||
streamWriter.flush();
|
||||
streamWriter.close();
|
||||
|
||||
Logger.info("[CopyLog][CopyLogRunner][run][log file copied succesfully]");
|
||||
Logger.info("[log file copied succesfully]");
|
||||
}
|
||||
catch (IOException e) {
|
||||
Logger.error("[CopyLog][CopyLogRunner][run][IOException e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[IOException e = " + e.getLocalizedMessage() +"]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ public class CopyLog {
|
|||
|
||||
File logfile = new File(baseDir.getAbsolutePath() + "/logs/log_" + _date.format(formatter) + ".txt");
|
||||
|
||||
Logger.debug("[CopyLog][forDay][logfile.getAbsolutePath() = " + logfile.getAbsolutePath() +"][logfile.length() = " + logfile.length() +"]");
|
||||
Logger.debug("[logfile.getAbsolutePath() = " + logfile.getAbsolutePath() +"][logfile.length() = " + logfile.length() +"]");
|
||||
|
||||
try {
|
||||
// create an input stream to load log file
|
||||
|
@ -74,7 +74,7 @@ public class CopyLog {
|
|||
|
||||
}
|
||||
catch (IOException e) {
|
||||
Logger.error("[CopyLog][forDay][IOException e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[IOException e = " + e.getLocalizedMessage() +"]");
|
||||
}
|
||||
|
||||
// log_{date:yyyy-MM-dd}.txt
|
||||
|
|
|
@ -30,7 +30,7 @@ public class FavouritiesFile {
|
|||
|
||||
File file = fileNames.getFavJsonFile();
|
||||
|
||||
Logger.info("[FavouritiesFile][loadFavourites][file = " + file + "]");
|
||||
Logger.info("[file = " + file + "]");
|
||||
|
||||
try {
|
||||
// create an input stream to load file content
|
||||
|
@ -60,7 +60,7 @@ public class FavouritiesFile {
|
|||
|
||||
out.add(station);
|
||||
|
||||
Logger.debug("[FavouritiesFile][loadFavourites][i = " + i +"][station.getSystemName() = " + station.getSystemName() + "]");
|
||||
Logger.debug("[i = " + i +"][station.getSystemName() = " + station.getSystemName() + "]");
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
@ -86,7 +86,7 @@ public class FavouritiesFile {
|
|||
// main array for all stations
|
||||
JSONArray mainArray = new JSONArray();
|
||||
|
||||
Logger.info("[FavouritiesFile][persistFavourities][favourites.size() = " + favourites.size() + "]");
|
||||
Logger.info("[favourites.size() = " + favourites.size() + "]");
|
||||
|
||||
for (WeatherStation wx : favourites) {
|
||||
JSONObject obj = new JSONObject();
|
||||
|
@ -103,7 +103,7 @@ public class FavouritiesFile {
|
|||
|
||||
mainArray.put(obj);
|
||||
|
||||
Logger.debug("[FavouritiesFile][persistFavourities][wx.getSystemName() = " + wx.getSystemName() + "]");
|
||||
Logger.debug("[wx.getSystemName() = " + wx.getSystemName() + "]");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
package cc.pogoda.mobile.meteosystem.service;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.app.JobIntentService;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import cc.pogoda.mobile.meteosystem.dao.AllStationsDao;
|
||||
import cc.pogoda.mobile.meteosystem.dao.AvailableParametersDao;
|
||||
import cc.pogoda.mobile.meteosystem.type.AllStationsReceivedEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.AvailableParameters;
|
||||
import cc.pogoda.mobile.meteosystem.type.StartStationsRefreshEvent;
|
||||
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
|
||||
|
||||
public class GetAllStationsService extends JobIntentService {
|
||||
private static final int JOB_ID = 1;
|
||||
|
||||
public static void enqueueWork(@NonNull Context context, @NonNull Intent intent) {
|
||||
enqueueWork(context, GetAllStationsService.class, JOB_ID, intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHandleWork(@NonNull Intent intent) {
|
||||
EventBus.getDefault().post(new StartStationsRefreshEvent());
|
||||
|
||||
// download all stations
|
||||
List<WeatherStation> allStations = new AllStationsDao().getAllStations();
|
||||
if (allStations != null){
|
||||
|
||||
EventBus.getDefault().post(new AllStationsReceivedEvent(allStations));
|
||||
Logger.debug("onHandleWork done. allStations size:" + allStations.size());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package cc.pogoda.mobile.meteosystem.type;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class AllStationsReceivedEvent {
|
||||
List<WeatherStation> stations;
|
||||
|
||||
public AllStationsReceivedEvent(@NonNull List<WeatherStation> stations) {
|
||||
this.stations = stations;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<WeatherStation> getStations(){
|
||||
return this.stations;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[AllStationsReceivedEvent][stations.size() = " + stations.size() +"]";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
package cc.pogoda.mobile.meteosystem.type;
|
||||
|
||||
public class StartStationsRefreshEvent {
|
||||
}
|
|
@ -94,7 +94,7 @@ public class StationSummaryActElements implements StationActivityElements {
|
|||
|
||||
long minutes_difference = last_station_data.until(current, ChronoUnit.MINUTES);
|
||||
|
||||
Logger.debug("[StationSummaryActElements][updateFromSummary][last_station_data = " + last_station_data.format(DateTimeFormatter. ISO_LOCAL_DATE_TIME) +"]");
|
||||
Logger.debug("[last_station_data = " + last_station_data.format(DateTimeFormatter. ISO_LOCAL_DATE_TIME) +"]");
|
||||
|
||||
// calculate the duration between
|
||||
Duration duration = Duration.between(last_station_data, current);
|
||||
|
|
|
@ -87,7 +87,7 @@ public class StationWindRoseActElements implements StationActivityElements {
|
|||
// current date and time (in current time zone set in system configuration)
|
||||
LocalDateTime current = LocalDateTime.now();
|
||||
|
||||
Logger.debug("[StationWindRoseActElements][updateFromSummary][last_station_data = " + last_station_data.format(DateTimeFormatter. ISO_LOCAL_DATE_TIME) +"]");
|
||||
Logger.debug("[last_station_data = " + last_station_data.format(DateTimeFormatter. ISO_LOCAL_DATE_TIME) +"]");
|
||||
|
||||
// calculate the duration between
|
||||
Duration duration = Duration.between(last_station_data, current);
|
||||
|
@ -98,7 +98,7 @@ public class StationWindRoseActElements implements StationActivityElements {
|
|||
}
|
||||
}
|
||||
|
||||
Logger.debug("[StationWindRoseActElements][updateFromSummary][no_data = " + no_data +"][old_data = " + old_data+"]");
|
||||
Logger.debug("[no_data = " + no_data +"][old_data = " + old_data+"]");
|
||||
|
||||
// create strings with wind speed, gusts etc
|
||||
String average_speed = String.format("%s", data.getWindspeedStr(true));
|
||||
|
@ -115,12 +115,14 @@ public class StationWindRoseActElements implements StationActivityElements {
|
|||
|
||||
if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) {
|
||||
windSpeed.setText(average_speed);
|
||||
windSpeed.setTextColor(goodColor);
|
||||
} else {
|
||||
windSpeed.setText("---");
|
||||
}
|
||||
|
||||
if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) {
|
||||
windGusts.setText(gusts_speed);
|
||||
windGusts.setTextColor(goodColor);
|
||||
} else {
|
||||
windGusts.setText("---");
|
||||
|
||||
|
@ -128,6 +130,7 @@ public class StationWindRoseActElements implements StationActivityElements {
|
|||
|
||||
if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) {
|
||||
windDirection.setText(String.valueOf(data.direction) + activity.getResources().getString(R.string.degrees_sign));
|
||||
windDirection.setTextColor(goodColor);
|
||||
} else {
|
||||
windDirection.setText("---");
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
package cc.pogoda.mobile.meteosystem.type;
|
||||
|
||||
public class ThemeColours {
|
||||
public int colorPrimary;
|
||||
public int colorPrimaryVariant;
|
||||
public int colorOnPrimary;
|
||||
public int colorSecondary;
|
||||
public int colorSecondaryVariant;
|
||||
public int colorOnSecondary;
|
||||
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
package cc.pogoda.mobile.meteosystem.web;
|
||||
|
||||
import static cc.pogoda.mobile.meteosystem.config.WebIoConfig.TIMEOUT_SECOND;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
|
@ -8,6 +10,7 @@ import java.util.concurrent.TimeUnit;
|
|||
import cc.pogoda.mobile.meteosystem.type.CustomLocalDateTime;
|
||||
import cc.pogoda.mobile.meteosystem.web.deserializer.CustomLocalDateTimeDeserializer;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.logging.HttpLoggingInterceptor;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.gson.GsonConverterFactory;
|
||||
|
||||
|
@ -20,12 +23,15 @@ public class RestClientConfig {
|
|||
|
||||
OkHttpClient.Builder builder = new OkHttpClient.Builder();
|
||||
|
||||
builder.readTimeout(20, TimeUnit.SECONDS);
|
||||
builder.writeTimeout(20, TimeUnit.SECONDS);
|
||||
builder.connectTimeout(20, TimeUnit.SECONDS);
|
||||
builder.callTimeout(20, TimeUnit.SECONDS);
|
||||
builder.readTimeout(TIMEOUT_SECOND, TimeUnit.SECONDS);
|
||||
builder.writeTimeout(TIMEOUT_SECOND, TimeUnit.SECONDS);
|
||||
builder.connectTimeout(TIMEOUT_SECOND, TimeUnit.SECONDS);
|
||||
builder.callTimeout(TIMEOUT_SECOND, TimeUnit.SECONDS);
|
||||
|
||||
OkHttpClient client = builder.build();//new OkHttpClient(builder);
|
||||
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
|
||||
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
|
||||
|
||||
OkHttpClient client = builder.addInterceptor(loggingInterceptor).build();//new OkHttpClient(builder);
|
||||
|
||||
out = new Retrofit.Builder().baseUrl("http://pogoda.cc:8080/").addConverterFactory(GsonConverterFactory.create(gson)).client(client).build();
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ public class StationBackgroundDownloader implements Runnable {
|
|||
try {
|
||||
URL url = new java.net.URL(station.getImageUrl());
|
||||
|
||||
Logger.debug("[StationBackgroundDownloader][run][url = " + url.toString() +"]");
|
||||
Logger.debug("[url = " + url.toString() +"]");
|
||||
|
||||
in = url.openStream();
|
||||
bitmap = BitmapFactory.decodeStream(in);
|
||||
|
@ -41,7 +41,7 @@ public class StationBackgroundDownloader implements Runnable {
|
|||
in.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
Logger.error("[StationBackgroundDownloader][run][IOException][e = " + e.getLocalizedMessage() +"]");
|
||||
Logger.error("[IOException][e = " + e.getLocalizedMessage() +"]");
|
||||
e.printStackTrace();
|
||||
bitmap = null;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
|
||||
</vector>
|
|
@ -5,11 +5,18 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".activity.AllStationsActivity">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recyclerViewAllStations"
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/refreshAllStationsView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:layout_editor_absoluteX="83dp"
|
||||
tools:layout_editor_absoluteY="95dp" />
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recyclerViewAllStations"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:layout_editor_absoluteX="83dp"
|
||||
tools:layout_editor_absoluteY="95dp" />
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textViewEmpty1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="32dp"
|
||||
android:layout_marginTop="32dp"
|
||||
android:layout_marginEnd="32dp"
|
||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||
android:text="@string/all_stations_empty_list1"
|
||||
android:textAlignment="center"
|
||||
android:textSize="30sp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/textViewEmpty2"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textViewEmpty2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||
android:text="@string/all_station_empty_list2"
|
||||
android:textAlignment="center"
|
||||
android:textSize="24sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textViewEmpty1" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -1,10 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recyclerViewFavourites"
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
android:id="@+id/refreshViewFavourites"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recyclerViewFavourites"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -40,6 +40,7 @@
|
|||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/loading"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/station_button_fav"
|
||||
app:layout_constraintEnd_toStartOf="@+id/station_button_fav"
|
||||
|
|
|
@ -248,12 +248,11 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||
android:text="@string/credits_2"
|
||||
android:textSize="28sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toTopOf="@+id/textViewCredits3"
|
||||
app:layout_constraintBottom_toTopOf="@+id/textViewCreditsRafal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textViewCredits1" />
|
||||
|
@ -262,6 +261,7 @@
|
|||
android:id="@+id/textViewCredits3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="32dp"
|
||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||
android:text="@string/credits_3"
|
||||
android:textSize="24sp"
|
||||
|
@ -294,6 +294,19 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textViewCredits4" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textViewCreditsRafal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||
android:text="@string/credits_2_rafal"
|
||||
android:textSize="28sp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/textViewCredits3"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textViewCredits2" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
android:id="@+id/textViewTemperatureValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="TextView"
|
||||
android:text="@string/please_wait"
|
||||
android:textAlignment="center"
|
||||
android:textSize="50sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
@ -62,7 +62,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="TextView"
|
||||
android:text="---"
|
||||
android:textAlignment="center"
|
||||
android:textSize="50sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
@ -90,7 +90,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="TextView"
|
||||
android:text="---"
|
||||
android:textAlignment="center"
|
||||
android:textSize="50sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
@ -118,7 +118,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="TextView"
|
||||
android:text="---"
|
||||
android:textAlignment="center"
|
||||
android:textSize="50sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
@ -145,7 +145,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="TextView"
|
||||
android:text="---"
|
||||
android:textAlignment="center"
|
||||
android:textSize="50sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
@ -172,7 +172,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="TextView"
|
||||
android:text="---"
|
||||
android:textAlignment="center"
|
||||
android:textSize="50sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:id="@+id/search"
|
||||
android:title="@string/search_bar"
|
||||
android:icon="@drawable/ic_search"
|
||||
app:actionViewClass="android.widget.SearchView"
|
||||
app:showAsAction="always" />
|
||||
|
||||
</menu>
|
|
@ -8,7 +8,4 @@
|
|||
<item
|
||||
android:id="@+id/fav_sort_add_order"
|
||||
android:title="@string/sort_in_adding_order" />
|
||||
<item
|
||||
android:id="@+id/fav_remove_noext"
|
||||
android:title="@string/clear_from_non_existent" />
|
||||
</menu>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
|
||||
<string name="select_station">VYBRAT</string>
|
||||
|
||||
|
@ -187,5 +186,10 @@
|
|||
<string name="export_decimation">Decimace eskportovaných údajov</string>
|
||||
<string name="export_decimation_minutes">Minimální krok v minutách</string>
|
||||
<string name="www_link">URL pro více informací</string>
|
||||
<string name="please_wait">Please Wait</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Načítání...</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
|
||||
<string name="select_station">VYBRAT</string>
|
||||
|
||||
|
@ -187,5 +186,10 @@
|
|||
<string name="export_decimation">Decimace eskportovaných údajov</string>
|
||||
<string name="export_decimation_minutes">Minimální krok v minutách</string>
|
||||
<string name="www_link">URL pro více informací</string>
|
||||
<string name="please_wait">Please Wait</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Načítání...</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Auswählen</string>
|
||||
<string name="select_station">Auswählen</string>
|
||||
<string name="all_stations">Alle Stationen</string>
|
||||
<string name="fav_stations">Favoriten </string>
|
||||
<string name="station_summary">Akutelle Werte</string>
|
||||
|
@ -116,6 +115,11 @@
|
|||
<string name="export_decimation">Dezimierung exportierten Dateien </string>
|
||||
<string name="export_decimation_minutes">Minimaler Schritt in Minuten </string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Warten Sie bitte</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Wird geladen...</string>
|
||||
</resources>
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Auswählen</string>
|
||||
<string name="select_station">Auswählen</string>
|
||||
<string name="all_stations">Alle Stationen</string>
|
||||
<string name="fav_stations">Favoriten </string>
|
||||
<string name="station_summary">Akutelle Werte</string>
|
||||
|
@ -116,6 +115,11 @@
|
|||
<string name="export_decimation">Dezimierung exportierten Dateien </string>
|
||||
<string name="export_decimation_minutes">Minimaler Schritt in Minuten </string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Warten Sie bitte</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Wird geladen...</string>
|
||||
</resources>
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Auswählen</string>
|
||||
<string name="select_station">Auswählen</string>
|
||||
<string name="all_stations">Alle Stationen</string>
|
||||
<string name="fav_stations">Favoriten </string>
|
||||
<string name="station_summary">Akutelle Werte</string>
|
||||
|
@ -116,6 +115,11 @@
|
|||
<string name="export_decimation">Dezimierung exportierten Dateien </string>
|
||||
<string name="export_decimation_minutes">Minimaler Schritt in Minuten </string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Warten Sie bitte</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Wird geladen...</string>
|
||||
</resources>
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">SELECT</string>
|
||||
<string name="all_stations">All Stations</string>
|
||||
<string name="fav_stations">Favourities</string>
|
||||
|
@ -70,7 +69,7 @@
|
|||
<string name="sort_in_adding_order">Sort in adding order</string>
|
||||
<string name="clear_from_non_existent">Clear removed stations</string>
|
||||
<string name="days_3">Three days</string>
|
||||
<string name="plot_data_lenght">Plots data lenght</string>
|
||||
<string name="plot_data_lenght">Plots data length</string>
|
||||
<string name="pressure">Pressure</string>
|
||||
<string name="wind">Wind</string>
|
||||
<string name="current_value">Current Value</string>
|
||||
|
@ -90,7 +89,7 @@
|
|||
<string name="forecast">Weather forecast</string>
|
||||
<string name="from">From</string>
|
||||
<string name="to">To</string>
|
||||
<string name="language">Laguage</string>
|
||||
<string name="language">Language</string>
|
||||
<string name="unit_of_measure">Unit of measure</string>
|
||||
<string name="wind_unit_of_measure">Windspeed unit</string>
|
||||
<string name="filter">Filter</string>
|
||||
|
@ -114,4 +113,10 @@
|
|||
<string name="export_decimation">Export data decimation</string>
|
||||
<string name="export_decimation_minutes">Minimum time resolution</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="please_wait">Please Wait</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">ATLASĪT</string>
|
||||
<string name="all_stations">Visas stacijas</string>
|
||||
<string name="fav_stations">Izlase</string>
|
||||
|
@ -114,4 +113,9 @@
|
|||
<string name="export_decimation">Export data decimation</string>
|
||||
<string name="export_decimation_minutes">Minimum time resolution</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Please Wait</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">ATLASĪT</string>
|
||||
<string name="all_stations">Visas stacijas</string>
|
||||
<string name="fav_stations">Izlase</string>
|
||||
|
@ -114,4 +113,9 @@
|
|||
<string name="export_decimation">Export data decimation</string>
|
||||
<string name="export_decimation_minutes">Minimum time resolution</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Please Wait</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
<!-- Base application theme. -->
|
||||
<style name="Theme.Meteosystem" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_200</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorPrimary">@color/white</item>
|
||||
<item name="colorPrimaryVariant">@color/white</item>
|
||||
<item name="colorOnPrimary">@color/black</item>
|
||||
<!-- Secondary brand color. -->
|
||||
<item name="colorSecondary">@color/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_200</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<item name="colorOnSecondary">@color/white</item>
|
||||
<!-- Status bar color. -->
|
||||
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="l">@color/black</item>
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">WYBIERZ</string>
|
||||
<string name="all_stations">Wszystkie Stacje</string>
|
||||
<string name="fav_stations">Ulubione</string>
|
||||
|
@ -114,4 +113,11 @@
|
|||
<string name="export_decimation">Decymacja eskportowanych danych</string>
|
||||
<string name="export_decimation_minutes">Minimalny krok w minutach</string>
|
||||
<string name="www_link">Więcej informacji</string>
|
||||
<string name="refreshing_station_list">Odświeżanie listy stacji</string>
|
||||
<string name="all_stations_empty_list1">Brak stacji na liście.</string>
|
||||
<string name="all_station_empty_list2">Proszę poczekać lub pociągnąć w dół aby odświeżyć.</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="loading">Ładowanie...</string>
|
||||
<string name="search_for_station">Wyszukaj stacji</string>
|
||||
<string name="search_bar">Wyszukaj</string>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">WYBIERZ</string>
|
||||
<string name="all_stations">Wszystkie Stacje</string>
|
||||
<string name="fav_stations">Ulubione</string>
|
||||
|
@ -114,4 +113,11 @@
|
|||
<string name="export_decimation">Decymacja eskportowanych danych</string>
|
||||
<string name="export_decimation_minutes">Minimalny krok w minutach</string>
|
||||
<string name="www_link">Więcej informacji</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Ładowanie...</string>
|
||||
<string name="search_for_station">Wyszukaj stacji</string>
|
||||
<string name="search_bar">Wyszukaj</string>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Выбрать</string>
|
||||
<string name="all_stations">Все станции</string>
|
||||
<string name="fav_stations">Избранные</string>
|
||||
|
@ -114,4 +113,9 @@
|
|||
<string name="export_decimation">Децимация экспортируемых данных</string>
|
||||
<string name="export_decimation_minutes">Минимальный шаг в минутах</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Выбрать</string>
|
||||
<string name="all_stations">Все станции</string>
|
||||
<string name="fav_stations">Избранные</string>
|
||||
|
@ -114,4 +113,9 @@
|
|||
<string name="export_decimation">Децимация экспортируемых данных</string>
|
||||
<string name="export_decimation_minutes">Минимальный шаг в минутах</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Выбрать</string>
|
||||
<string name="all_stations">Все станции</string>
|
||||
<string name="fav_stations">Избранные</string>
|
||||
|
@ -114,4 +113,9 @@
|
|||
<string name="export_decimation">Децимация экспортируемых данных</string>
|
||||
<string name="export_decimation_minutes">Минимальный шаг в минутах</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Вибрати</string>
|
||||
<string name="all_stations">Усі станції</string>
|
||||
<string name="fav_stations">Улюблені</string>
|
||||
|
@ -114,4 +113,8 @@
|
|||
<string name="export_decimation">Децимація експортованих даних</string>
|
||||
<string name="export_decimation_minutes">Мінімальний крок у хвилинах</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="select_station">Вибрати</string>
|
||||
<string name="all_stations">Усі станції</string>
|
||||
<string name="fav_stations">Улюблені</string>
|
||||
|
@ -114,4 +113,9 @@
|
|||
<string name="export_decimation">Децимація експортованих даних</string>
|
||||
<string name="export_decimation_minutes">Мінімальний крок у хвилинах</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="please_wait">Proszę czekać</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="loading">Loading...</string>
|
||||
</resources>
|
|
@ -1,5 +1,5 @@
|
|||
<resources>
|
||||
<string name="app_name">MeteoSystem</string>
|
||||
<string name="app_name" translatable="false">Meteo System</string>
|
||||
<string name="select_station">SELECT</string>
|
||||
<string name="all_stations">All Stations</string>
|
||||
<string name="fav_stations">Favourities</string>
|
||||
|
@ -94,7 +94,7 @@
|
|||
<string name="test_warning">Warning! This is a test version of the application!</string>
|
||||
<string name="credits_1">Developed by:</string>
|
||||
<string name="credits_2" translatable="false">Mateusz Lubecki</string>
|
||||
<string name="credits_3" translatable="false">Bielsko - Biała 2020, 2021</string>
|
||||
<string name="credits_3" translatable="false">Bielsko - Biała 2020, 2021, 2022</string>
|
||||
<string name="credits_4" translatable="false">sp8ebc@gmail.com</string>
|
||||
<string name="credits_5" translatable="false">tel: +48 660 43 44 46</string>
|
||||
<string name="camera">Online Camera</string>
|
||||
|
@ -144,4 +144,12 @@
|
|||
</string-array>
|
||||
<string name="lang_change_req_restart" translatable="false">Changing language requires app restart after making a choose in this window.</string>
|
||||
<string name="www_link">URL to more information</string>
|
||||
<string name="refreshing_station_list">Refreshing station list</string>
|
||||
<string name="all_stations_empty_list1">There are no stations on this list.</string>
|
||||
<string name="all_station_empty_list2">Please wait or pull down to refresh list.</string>
|
||||
<string name="please_wait">Please Wait</string>
|
||||
<string name="loading">Loading...</string>
|
||||
<string name="credits_2_rafal" translatable="false">Rafał Woloszyn</string>
|
||||
<string name="search_for_station">Search for station</string>
|
||||
<string name="search_bar">Search</string>
|
||||
</resources>
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:label="@string/app_name"
|
||||
android:hint="@string/search_for_station" />
|
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 90 KiB |
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 732 KiB |
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 49 KiB |
Ładowanie…
Reference in New Issue