Giter VIP home page Giter VIP logo

forecastie's Introduction

Forecastie

Release Circle CI Android CI

A simple, copylefted libre software weather app for Android. It gathers data from OpenWeatherMap, via their public API.

Features

  • Simple design
  • Detailed 5 day forecast
  • Multiple units
  • Works with any city in the world
  • Offline functionality

Screenshots

Demo

Video Walkthrough

Contribution

If you have any ideas or issues, don't hesitate to make contact via the Issues page. Every contribution is welcome. See Contributing for further information.

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

Contributor Covenant

Licence

GNU GPLv3 Image

This application is Free Software: You can use, study share and improve it at your will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

The weather data is provided by OpenWeatherMap, under the Creative Commons licence.

Icons are Weather Icons, by Lukas Bischoff and Erik Flowers, under the SIL OFL 1.1 license.

forecastie's People

Contributors

abika avatar aresiel avatar arucard21 avatar baesi avatar beriain avatar carminemassarelli avatar chancevermilion avatar di72nn avatar fantel avatar fridodeluxe avatar friederbluemle avatar githubuser232 avatar icasdri avatar igor-cali avatar linkid avatar martykan avatar naofum avatar nevyn-hira avatar robinpaulson avatar ryankinnard avatar simseungmin avatar sotpapathe avatar spiritcroc avatar splitowo avatar twikedk avatar uxcam-mobile avatar vmazoyer avatar vvoland avatar yonniii avatar zoff99 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

forecastie's Issues

Widget has partial functionality

I'm running on a Moto E (Cyanogenmod 13.0, Android 6.0.1 equivalent), and I only get the icon that shows the weather condition outside (cloudy, stormy, clear, etc.) but no other data. It's not an issue of the app getting the data, because when I open the app proper all the info is right there, I just don't know why the widget isn't

Screenshot here.

F-Droid update

Hi,
Please update the source code to 1.0 to let F-Droid team build the latest version.
Thanks again for this great app.

Inches for snow

The app shows "Snow (1.6 mm)". I wish it would show "Snow (0.1 in)" [inches]

I see options to change every unit (temperature, barometer, wind speed), except the unit for the amount of snow.

(By the way, I love the app!)

Feature request: indicate last update in widget

Since I don't have a data plan on my mobile phone it is normally not online unless I'm somewhere with WIFI access (home, work, friends). That means that I cannot tell for sure when was the last time that forecastie had the opportunity to update its weather information. If I want to go sure that it's updated, I hit the small update button (round arrow) on the widget. However, the only indication that the information has been updated is if the information shown changes, which can be hard to tell if the changes are slight ("It says 4.2 degrees now, but was it 4.3 before or did it not change at all???").

Hence it would be nice if the widget should either show a time stamp that indicates when the information has been updated the last time or at least some indicator that an update is currently performed and when it has finished – something like the update arrow rotating while the update is in progress.

Feature Request: % Chance of Rain

It would be helpful to see a % chance of rain on the forecasts. An extremely low possibility of rain on other apps/services will still just show 'rain' on Forecastie

Crash at start parsing json

This morning the Forcastie app v1.0 from F-Droid was unable to run, perhaps due to unexpected data arriving from OpenWeatherMap.

Here is the exception which brought down the app:

E/AndroidRuntime(17172): FATAL EXCEPTION: AsyncTask #4
E/AndroidRuntime(17172): Process: cz.martykan.forecastie, PID: 17172
E/AndroidRuntime(17172): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(17172):    at android.os.AsyncTask$3.done(AsyncTask.java:304)
E/AndroidRuntime(17172):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
E/AndroidRuntime(17172):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
E/AndroidRuntime(17172):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
E/AndroidRuntime(17172):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
E/AndroidRuntime(17172):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E/AndroidRuntime(17172):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime(17172):    at java.lang.Thread.run(Thread.java:818)
E/AndroidRuntime(17172): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.getString(java.lang.String)' on a null object reference
E/AndroidRuntime(17172):    at cz.martykan.forecastie.MainActivity.parseLongTermJson(MainActivity.java:475)
E/AndroidRuntime(17172):    at cz.martykan.forecastie.MainActivity$LongTermWeatherTask.parseResponse(MainActivity.java:898)
E/AndroidRuntime(17172):    at cz.martykan.forecastie.MainActivity$GenericRequestTask.doInBackground(MainActivity.java:790)
E/AndroidRuntime(17172):    at cz.martykan.forecastie.MainActivity$GenericRequestTask.doInBackground(MainActivity.java:712)
E/AndroidRuntime(17172):    at android.os.AsyncTask$2.call(AsyncTask.java:292)
E/AndroidRuntime(17172):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
E/AndroidRuntime(17172):    ... 4 more

Widget stops getting updated

After some time, the widget stops getting updated. This might be because I walk around and lose internet connection at some point, but I don't know the exact cause. The end result is that the time widget gets stuck on an old time, and starting the app gives the following crash log:

08-14 23:42:18.216 31144 31144 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at cz.martykan.forecastie.activities.MainActivity.updateTodayWeatherUI(MainActivity.java:414)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at cz.martykan.forecastie.activities.MainActivity.access$200(MainActivity.java:77)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at cz.martykan.forecastie.activities.MainActivity$TodayWeatherTask.updateMainUI(MainActivity.java:830)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at cz.martykan.forecastie.tasks.GenericRequestTask.onPostExecute(GenericRequestTask.java:131)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at cz.martykan.forecastie.activities.MainActivity$TodayWeatherTask.onPostExecute(MainActivity.java:812)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at cz.martykan.forecastie.activities.MainActivity$TodayWeatherTask.onPostExecute(MainActivity.java:799)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at android.os.AsyncTask.finish(AsyncTask.java:651)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at android.os.AsyncTask.-wrap1(AsyncTask.java)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:148)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:5461)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
08-14 23:42:18.216 31144 31144 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-14 23:42:18.220  1897  5625 W ActivityManager:   Force finishing activity cz.martykan.forecastie/.activities.MainActivity

Edit: This issue might be related to #112.

-0,0°C

it would be better if it only says 0°C

forecastie crashed on start

Hi. When in phone don't have internet not at all, it run application cause crash.

If app download in data early on 3 days it nice to have if these daty later offline

sunrise and sunset

Hi,
could you please consider to add sunrise and sunset time to the main screen?

Thanks for your app
Luca

Error parsing JSON

Recently updated Forecastie to v0.7.
Ever since I'm getting "Error parsing JSON".
I'm running CM13.1 (Android 6.0.1) on Oppo Find 7.

01-28 10:00:21.936 15435-15488/? W/System.err: java.io.FileNotFoundException: http://api.openweathermap.org/data/2.5/weather?q=London&lang=en&appid=2de143494c0b295cca9337e1e96b00e0
01-28 10:00:21.936 15435-15488/? W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
01-28 10:00:21.936 15435-15488/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetWeatherTask.doInBackground(MainActivity.java:487)
01-28 10:00:21.936 15435-15488/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetWeatherTask.doInBackground(MainActivity.java:465)
01-28 10:00:21.936 15435-15488/? W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
01-28 10:00:21.936 15435-15488/? W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-28 10:00:21.936 15435-15488/? W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
01-28 10:00:21.936 15435-15488/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
01-28 10:00:21.936 15435-15488/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
01-28 10:00:21.936 15435-15488/? W/System.err:     at java.lang.Thread.run(Thread.java:818)
01-28 10:00:21.940 254-254/? E/Region: Region::boolean_operation(op=7) invalid Rect={0,955,92,720}
01-28 10:00:21.940 254-254/? E/Region: Region::boolean_operation(op=7) invalid Rect={1423,955,1624,720}
01-28 10:00:21.958 15435-15435/? W/System.err: org.json.JSONException: End of input at character 0 of 
01-28 10:00:21.958 15435-15435/? W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
01-28 10:00:21.958 15435-15435/? W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
01-28 10:00:21.958 15435-15435/? W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
01-28 10:00:21.958 15435-15435/? W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
01-28 10:00:21.958 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity.parseTodayJson(MainActivity.java:271)
01-28 10:00:21.958 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity.access$200(MainActivity.java:48)
01-28 10:00:21.958 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetWeatherTask.onPostExecute(MainActivity.java:511)
01-28 10:00:21.958 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetWeatherTask.onPostExecute(MainActivity.java:465)
01-28 10:00:21.958 15435-15435/? W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:651)
01-28 10:00:21.958 15435-15435/? W/System.err:     at android.os.AsyncTask.-wrap1(AsyncTask.java)
01-28 10:00:21.958 15435-15435/? W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
01-28 10:00:21.958 15435-15435/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
01-28 10:00:21.958 15435-15435/? W/System.err:     at android.os.Looper.loop(Looper.java:148)
01-28 10:00:21.959 15435-15435/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5466)
01-28 10:00:21.959 15435-15435/? W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
01-28 10:00:21.959 15435-15435/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-28 10:00:21.959 15435-15435/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-28 10:00:22.116 15435-15488/? W/System.err: java.io.FileNotFoundException: http://api.openweathermap.org/data/2.5/forecast?q=London&lang=en&mode=json&appid=2de143494c0b295cca9337e1e96b00e0
01-28 10:00:22.116 15435-15488/? W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
01-28 10:00:22.116 15435-15488/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetLongTermWeatherTask.doInBackground(MainActivity.java:537)
01-28 10:00:22.116 15435-15488/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetLongTermWeatherTask.doInBackground(MainActivity.java:515)
01-28 10:00:22.116 15435-15488/? W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
01-28 10:00:22.116 15435-15488/? W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-28 10:00:22.117 15435-15488/? W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
01-28 10:00:22.117 15435-15488/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
01-28 10:00:22.117 15435-15488/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
01-28 10:00:22.117 15435-15488/? W/System.err:     at java.lang.Thread.run(Thread.java:818)
01-28 10:00:22.151 15435-15435/? W/System.err: org.json.JSONException: End of input at character 0 of 
01-28 10:00:22.151 15435-15435/? W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
01-28 10:00:22.151 15435-15435/? W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
01-28 10:00:22.151 15435-15435/? W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
01-28 10:00:22.151 15435-15435/? W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
01-28 10:00:22.151 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity.parseLongTermJson(MainActivity.java:353)
01-28 10:00:22.151 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetLongTermWeatherTask.onPostExecute(MainActivity.java:561)
01-28 10:00:22.151 15435-15435/? W/System.err:     at cz.martykan.forecastie.MainActivity$GetLongTermWeatherTask.onPostExecute(MainActivity.java:515)
01-28 10:00:22.151 15435-15435/? W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:651)
01-28 10:00:22.151 15435-15435/? W/System.err:     at android.os.AsyncTask.-wrap1(AsyncTask.java)
01-28 10:00:22.151 15435-15435/? W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
01-28 10:00:22.151 15435-15435/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
01-28 10:00:22.151 15435-15435/? W/System.err:     at android.os.Looper.loop(Looper.java:148)
01-28 10:00:22.151 15435-15435/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5466)
01-28 10:00:22.151 15435-15435/? W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
01-28 10:00:22.151 15435-15435/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-28 10:00:22.151 15435-15435/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-28 10:00:22.293 2644-13165/? D/NetworkMonitor/NetworkAgentInfo [MOBILE (LTE) - 107]: Checking http://connectivitycheck.gstatic.com/generate_204 on three.co.uk, connectivitycheck.gstatic.com=216.58.213.174
01-28 10:00:22.296 2644-13165/? D/NetworkMonitor/NetworkAgentInfo [MOBILE (LTE) - 107]: Proba

Crash when updating and rotating screen

I've observed that if the phone is rotated (causing the layout to change) while the weather information is updating there is a chance that the application will crash. The following is the stack trace from the crash:

V/WindowManager(  747): Adding window Window{274759ee u0 cz.martykan.forecastie/cz.martykan.forecastie.MainActivity} at 16 of 24 (before Window{327b04b5 u0 cz.martykan.forecastie/cz.martykan.forecastie.MainActivity})
D/AndroidRuntime(16138): Shutting down VM
E/AndroidRuntime(16138): FATAL EXCEPTION: main
E/AndroidRuntime(16138): Process: cz.martykan.forecastie, PID: 16138
E/AndroidRuntime(16138): java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{161404fa V.E..... R......D 0,0-1166,348} not attached to window manager
E/AndroidRuntime(16138):    at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396)
E/AndroidRuntime(16138):    at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322)
E/AndroidRuntime(16138):    at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
E/AndroidRuntime(16138):    at android.app.Dialog.dismissDialog(Dialog.java:341)
E/AndroidRuntime(16138):    at android.app.Dialog.dismiss(Dialog.java:324)
E/AndroidRuntime(16138):    at cz.martykan.forecastie.MainActivity$GenericRequestTask.onPostExecute(MainActivity.java:804)
E/AndroidRuntime(16138):    at cz.martykan.forecastie.MainActivity$GenericRequestTask.onPostExecute(MainActivity.java:712)
E/AndroidRuntime(16138):    at android.os.AsyncTask.finish(AsyncTask.java:636)
E/AndroidRuntime(16138):    at android.os.AsyncTask.access$500(AsyncTask.java:177)
E/AndroidRuntime(16138):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
E/AndroidRuntime(16138):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(16138):    at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(16138):    at android.app.ActivityThread.main(ActivityThread.java:5291)
E/AndroidRuntime(16138):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(16138):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(16138):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
E/AndroidRuntime(16138):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
W/ActivityManager(  747):   Force finishing activity 1 cz.martykan.forecastie/.MainActivity

This was observed on a Nexus 5 running Android 5.1.1

Widget not tap-able

But when I tab on the widget nothing happen, nice would be when it open's the app.
Maybe it just doesn't work on my device ( Motorola Razr I x86, CM 11, Android 4.4.4)

More frequent Releases

The last release has been almost two months ago. In that time, there have been lots of fixes and improvements according to git log.

It would be cool if you could do releases more frequently, maybe somewhere between every week and every month.

Compact view

This is a feature request for a compact view so that you can see a full day (or more) at a time on the screen.

If this is not the direction you want to take the app, feel free to close.

[FR] Differentiate days on later tab

Separate the days with a separate material cards, or slightly shade the days backgrounds different shades. The days get progressively darker, or alternate between two shades.

Custom Refresh Intervals

It would be great to be able to select a background refresh interval. For example, 15min, 30min, 1h, 4hr, 12hr, 24hr. Thanks for the great app!

Make widget show multiple days

I'd like to overview a few days on a widget if it's big enough.
Also, indeed the layout needs a work on it. And clicking on a widget usually makes the app to show up.
Thanks!

Support multiple locations

I love the simplicity of the app! However, for many users it might be useful to easily access/see the weather for multiple locations (e.g. when traveling, living in multiple places etc)

two ideas for UI design

  • list of recently viewed cities in search dialog
  • slide in side menu OR separate screen with list of saved locations

open to suggestions and willing to work on this feature

Screenshots from Google Weather app on Android 6.0.1
saved location as 'autocomplete' for search input
saved location as 'autocomplete' for search input

allow user to easily add searched location to list
allow user to easily add searched location to list

act as a weather provider for Android 6

Android 6 supports weather provider plugins. Right now there aren't any on F-droid and it looks like Yahoo has been removed from CM. It'd be great if this functionality could be provided by forecastie.

Widget improvements

Hey,
The app is very nice, yesterday I tried also the widget. For me I can use it only as 4x3 widget to see the full informations and then I have a lot of empty space inside the widget. Is it possible to improve the font size and line gap for use as 4x2 or make the text scrollable?

http://tinyurl.com/jr4wynj

Edit: replaced link

Detect Location does not work

Versions:

  • Android: CM 12.1-20160329-Nigtly for Xperia Z3 Compact
  • Kernel: 3.4.0
  • Forcastie: 0.9.1 insalled via f-droid

I have the Privacy Guard activated.
The app doesn't ask for permission to use the Location.
Even after allow access to the location, the app doesn't apper in the lis of apps, which used the location.
Side note, instead of gapps I'm using microG apps. https://microg.org
But I think, that it is not related to microG, because to me it seems, that the app doesn't try to use the location.

Crash on first refresh

The application crashes if you try to refresh for the first time without network connectivity.

Refreshes after the first run do display the 'No network connection' snackbar successfully if there's no network.

Running CM13 on OnePlus One with the F-Droid 0.9.1 version.

Parsing JSON fails after fresh install (NPE on MainActivity line 501)

When you're looking in line 459 (just one example, further examples are also available in the result) there is:
"wind":null,

JSON
`
{
"city":{
"id":2643743,
"name":"London",
"coord":{
"lon":-0.12574,
"lat":51.50853
},
"country":"GB",
"population":0,
"sys":{
"population":0
}
},
"cod":"200",
"message":0.005,
"cnt":34,
"list":[
{
"dt":1466704800,
"main":{
"temp":293.43,
"temp_min":291.568,
"temp_max":293.43,
"pressure":1019.13,
"sea_level":1029.04,
"grnd_level":1019.13,
"humidity":100,
"temp_kf":1.86
},
"weather":[
{
"id":501,
"main":"Rain",
"description":"mäßiger Regen",
"icon":"10d"
}
],
"clouds":{
"all":68
},
"wind":{
"speed":2.21,
"deg":306.504
},
"rain":{
"3h":3.6675
},
"sys":{
"pod":"d"
},
"dt_txt":"2016-06-23 18:00:00"
},
{
"dt":1466715600,
"main":{
"temp":291.08,
"temp_min":289.326,
"temp_max":291.08,
"pressure":1020.25,
"sea_level":1029.96,
"grnd_level":1020.25,
"humidity":89,
"temp_kf":1.76
},
"weather":[
{
"id":501,
"main":"Rain",
"description":"mäßiger Regen",
"icon":"10n"
}
],
"clouds":{
"all":80
},
"wind":{
"speed":4.91,
"deg":270.005
},
"rain":{
"3h":11.07
},
"sys":{
"pod":"n"
},
"dt_txt":"2016-06-23 21:00:00"
},
{
"dt":1466726400,
"main":{
"temp":288.51,
"temp_min":286.858,
"temp_max":288.51,
"pressure":1020.71,
"sea_level":1030.65,
"grnd_level":1020.71,
"humidity":92,
"temp_kf":1.65
},
"weather":[
{
"id":801,
"main":"Clouds",
"description":"ein paar Wolken",
"icon":"02n"
}
],
"clouds":{
"all":12
},
"wind":{
"speed":3.51,
"deg":252.502
},
"rain":{

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-24 00:00:00"
  },
  {  
     "dt":1466737200,
     "main":{  
        "temp":287.34,
        "temp_min":285.794,
        "temp_max":287.34,
        "pressure":1031.27,
        "sea_level":1031.27,
        "grnd_level":1031.27,
        "humidity":94,
        "temp_kf":1.55
     },
     "weather":[  
        {  
           "id":804,
           "main":"Clouds",
           "description":"wolkenbedeckt",
           "icon":"04n"
        }
     ],
     "clouds":{  
        "all":92
     },
     "wind":{  
        "speed":3.26,
        "deg":271.505
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-24 03:00:00"
  },
  {  
     "dt":1466769600,
     "main":{  
        "temp":292.47,
        "temp_min":291.028,
        "temp_max":292.47,
        "pressure":1021.23,
        "sea_level":1031.01,
        "grnd_level":1021.23,
        "humidity":100,
        "temp_kf":1.45
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01d"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":4.76,
        "deg":220.5
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-24 12:00:00"
  },
  {  
     "dt":1466780400,
     "main":{  
        "temp":291.94,
        "temp_min":290.601,
        "temp_max":291.94,
        "pressure":1020.54,
        "sea_level":1030.39,
        "grnd_level":1020.54,
        "humidity":93,
        "temp_kf":1.34
     },
     "weather":[  
        {  
           "id":803,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"04d"
        }
     ],
     "clouds":{  
        "all":68
     },
     "wind":{  
        "speed":6.22,
        "deg":223.002
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-24 15:00:00"
  },
  {  
     "dt":1466791200,
     "main":{  
        "temp":290.2,
        "temp_min":288.962,
        "temp_max":290.2,
        "pressure":1020.59,
        "sea_level":1030.44,
        "grnd_level":1020.59,
        "humidity":88,
        "temp_kf":1.24
     },
     "weather":[  
        {  
           "id":500,
           "main":"Rain",
           "description":"leichter Regen",
           "icon":"10d"
        }
     ],
     "clouds":{  
        "all":64
     },
     "wind":{  
        "speed":5.32,
        "deg":220.501
     },
     "rain":{  
        "3h":0.065
     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-24 18:00:00"
  },
  {  
     "dt":1466802000,
     "main":{  
        "temp":288.41,
        "temp_min":287.273,
        "temp_max":288.41,
        "pressure":1020.91,
        "sea_level":1030.71,
        "grnd_level":1020.91,
        "humidity":0,
        "temp_kf":1.14
     },
     "weather":[  
        {  
           "id":803,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"04n"
        }
     ],
     "clouds":{  
        "all":56
     },
     "wind":{  
        "speed":3.43,
        "deg":253.003
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-24 21:00:00"
  },
  {  
     "dt":1466812800,
     "main":{  
        "temp":285.97,
        "temp_min":284.94,
        "temp_max":285.97,
        "pressure":1020.99,
        "sea_level":1030.93,
        "grnd_level":1020.99,
        "humidity":93,
        "temp_kf":1.03
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"02n"
        }
     ],
     "clouds":{  
        "all":8
     },
     "wind":{  
        "speed":3.22,
        "deg":253.002
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-25 00:00:00"
  },
  {  
     "dt":1466823600,
     "main":{  
        "temp":284.05,
        "temp_min":283.121,
        "temp_max":284.05,
        "pressure":1020.65,
        "sea_level":1030.64,
        "grnd_level":1020.65,
        "humidity":94,
        "temp_kf":0.93
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01n"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":2.66,
        "deg":250.504
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-25 03:00:00"
  },
  {  
     "dt":1466834400,
     "main":{  
        "temp":285.4,
        "temp_min":284.573,
        "temp_max":285.4,
        "pressure":1020.59,
        "sea_level":1030.53,
        "grnd_level":1020.59,
        "humidity":97,
        "temp_kf":0.83
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01d"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":2.71,
        "deg":243.002
     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-25 06:00:00"
  },
  {  
     "dt":1466845200,
     "main":{  
        "temp":289.35,
        "temp_min":288.623,
        "temp_max":289.35,
        "pressure":1020.66,
        "sea_level":1030.54,
        "grnd_level":1020.66,
        "humidity":100,
        "temp_kf":0.72
     },
     "weather":[  
        {  
           "id":801,
           "main":"Clouds",
           "description":"ein paar Wolken",
           "icon":"02d"
        }
     ],
     "clouds":{  
        "all":20
     },
     "wind":{  
        "speed":2.83,
        "deg":244.502
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-25 09:00:00"
  },
  {  
     "dt":1466856000,
     "main":{  
        "temp":290.62,
        "temp_min":289.995,
        "temp_max":290.62,
        "pressure":1020.47,
        "sea_level":1030.32,
        "grnd_level":1020.47,
        "humidity":88,
        "temp_kf":0.62
     },
     "weather":[  
        {  
           "id":803,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"04d"
        }
     ],
     "clouds":{  
        "all":76
     },
     "wind":null,
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-25 12:00:00"
  },
  {  
     "dt":1466866800,
     "main":{  
        "temp":290.62,
        "temp_min":290.103,
        "temp_max":290.62,
        "pressure":1020.21,
        "sea_level":1029.98,
        "grnd_level":1020.21,
        "humidity":82,
        "temp_kf":0.52
     },
     "weather":[  
        {  
           "id":802,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"03d"
        }
     ],
     "clouds":{  
        "all":36
     },
     "wind":null,
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-25 15:00:00"
  },
  {  
     "dt":1466877600,
     "main":{  
        "temp":289.56,
        "temp_min":289.15,
        "temp_max":289.56,
        "pressure":1020.3,
        "sea_level":1030.14,
        "grnd_level":1020.3,
        "humidity":87,
        "temp_kf":0.41
     },
     "weather":[  
        {  
           "id":804,
           "main":"Clouds",
           "description":"wolkenbedeckt",
           "icon":"04d"
        }
     ],
     "clouds":{  
        "all":92
     },
     "wind":{  
        "speed":3.51,
        "deg":277.502
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-25 18:00:00"
  },
  {  
     "dt":1466888400,
     "main":{  
        "temp":287.76,
        "temp_min":287.451,
        "temp_max":287.76,
        "pressure":1021.01,
        "sea_level":1030.95,
        "grnd_level":1021.01,
        "humidity":83,
        "temp_kf":0.31
     },
     "weather":[  
        {  
           "id":802,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"03n"
        }
     ],
     "clouds":{  
        "all":36
     },
     "wind":null,
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-25 21:00:00"
  },
  {  
     "dt":1466899200,
     "main":{  
        "temp":286.41,
        "temp_min":286.207,
        "temp_max":286.41,
        "pressure":1030.93,
        "sea_level":1030.93,
        "grnd_level":1030.93,
        "humidity":88,
        "temp_kf":0.21
     },
     "weather":[  
        {  
           "id":803,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"04n"
        }
     ],
     "clouds":{  
        "all":56
     },
     "wind":{  
        "speed":3.11,
        "deg":274.502
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-26 00:00:00"
  },
  {  
     "dt":1466920800,
     "main":{  
        "temp":286.87,
        "temp_min":286.771,
        "temp_max":286.87,
        "pressure":1021.35,
        "sea_level":1031.33,
        "grnd_level":1021.35,
        "humidity":92,
        "temp_kf":0.1
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"02d"
        }
     ],
     "clouds":{  
        "all":8
     },
     "wind":{  
        "speed":4.71,
        "deg":292.5
     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-26 06:00:00"
  },
  {  
     "dt":1466931600,
     "main":{  
        "temp":289.23,
        "temp_min":289.23,
        "temp_max":289.23,
        "pressure":1031.73,
        "sea_level":1031.73,
        "grnd_level":1031.73,
        "humidity":92,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":802,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"03d"
        }
     ],
     "clouds":{  
        "all":44
     },
     "wind":{  
        "speed":4.67,
        "deg":306.004
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-26 09:00:00"
  },
  {  
     "dt":1466942400,
     "main":{  
        "temp":291.173,
        "temp_min":291.173,
        "temp_max":291.173,
        "pressure":1021.73,
        "sea_level":1031.55,
        "grnd_level":1021.73,
        "humidity":85,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":802,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"03d"
        }
     ],
     "clouds":{  
        "all":32
     },
     "wind":{  
        "speed":4.5,
        "deg":291.001
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-26 12:00:00"
  },
  {  
     "dt":1466953200,
     "main":{  
        "temp":291.611,
        "temp_min":291.611,
        "temp_max":291.611,
        "pressure":1021.33,
        "sea_level":1031.09,
        "grnd_level":1021.33,
        "humidity":75,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01d"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":5.23,
        "deg":276.011
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-26 15:00:00"
  },
  {  
     "dt":1466964000,
     "main":{  
        "temp":290.387,
        "temp_min":290.387,
        "temp_max":290.387,
        "pressure":1021.11,
        "sea_level":1030.92,
        "grnd_level":1021.11,
        "humidity":73,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01d"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":5.01,
        "deg":267.002
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-26 18:00:00"
  },
  {  
     "dt":1466985600,
     "main":{  
        "temp":288.061,
        "temp_min":288.061,
        "temp_max":288.061,
        "pressure":1020.54,
        "sea_level":1030.36,
        "grnd_level":1020.54,
        "humidity":91,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":804,
           "main":"Clouds",
           "description":"wolkenbedeckt",
           "icon":"04n"
        }
     ],
     "clouds":{  
        "all":88
     },
     "wind":{  
        "speed":4.21,
        "deg":241.005
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-27 00:00:00"
  },
  {  
     "dt":1466996400,
     "main":{  
        "temp":287.117,
        "temp_min":287.117,
        "temp_max":287.117,
        "pressure":1019.37,
        "sea_level":1029.29,
        "grnd_level":1019.37,
        "humidity":92,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":803,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"04n"
        }
     ],
     "clouds":{  
        "all":76
     },
     "wind":null,
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-27 03:00:00"
  },
  {  
     "dt":1467007200,
     "main":{  
        "temp":287.666,
        "temp_min":287.666,
        "temp_max":287.666,
        "pressure":1019.31,
        "sea_level":1029.21,
        "grnd_level":1019.31,
        "humidity":92,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":804,
           "main":"Clouds",
           "description":"wolkenbedeckt",
           "icon":"04d"
        }
     ],
     "clouds":{  
        "all":92
     },
     "wind":{  
        "speed":5.16,
        "deg":255
     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-27 06:00:00"
  },
  {  
     "dt":1467018000,
     "main":{  
        "temp":288.087,
        "temp_min":288.087,
        "temp_max":288.087,
        "pressure":1019.15,
        "sea_level":1029.01,
        "grnd_level":1019.15,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":501,
           "main":"Rain",
           "description":"mäßiger Regen",
           "icon":"10d"
        }
     ],
     "clouds":{  
        "all":68
     },
     "wind":{  
        "speed":3.31,
        "deg":271.001
     },
     "rain":{  
        "3h":4.69
     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-27 09:00:00"
  },
  {  
     "dt":1467039600,
     "main":{  
        "temp":293.096,
        "temp_min":293.096,
        "temp_max":293.096,
        "pressure":1021.02,
        "sea_level":1030.8,
        "grnd_level":1021.02,
        "humidity":80,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":802,
           "main":"Clouds",
           "description":"überwiegend bewölkt",
           "icon":"03d"
        }
     ],
     "clouds":{  
        "all":44
     },
     "wind":{  
        "speed":4.83,
        "deg":297.502
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-27 15:00:00"
  },
  {  
     "dt":1467050400,
     "main":{  
        "temp":291.964,
        "temp_min":291.964,
        "temp_max":291.964,
        "pressure":1021.69,
        "sea_level":1031.58,
        "grnd_level":1021.69,
        "humidity":71,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"02d"
        }
     ],
     "clouds":{  
        "all":8
     },
     "wind":{  
        "speed":4.3,
        "deg":313.5
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-27 18:00:00"
  },
  {  
     "dt":1467061200,
     "main":{  
        "temp":288.088,
        "temp_min":288.088,
        "temp_max":288.088,
        "pressure":1023.08,
        "sea_level":1032.96,
        "grnd_level":1023.08,
        "humidity":71,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01n"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":2.76,
        "deg":336.502
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-27 21:00:00"
  },
  {  
     "dt":1467072000,
     "main":{  
        "temp":284.621,
        "temp_min":284.621,
        "temp_max":284.621,
        "pressure":1023.88,
        "sea_level":1033.86,
        "grnd_level":1023.88,
        "humidity":81,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01n"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":2.27,
        "deg":357.5
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-28 00:00:00"
  },
  {  
     "dt":1467082800,
     "main":{  
        "temp":282.415,
        "temp_min":282.415,
        "temp_max":282.415,
        "pressure":1034.09,
        "sea_level":1034.09,
        "grnd_level":1034.09,
        "humidity":89,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01n"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":1.26,
        "deg":334.501
     },
     "rain":{  

     },
     "sys":{  
        "pod":"n"
     },
     "dt_txt":"2016-06-28 03:00:00"
  },
  {  
     "dt":1467093600,
     "main":{  
        "temp":285.535,
        "temp_min":285.535,
        "temp_max":285.535,
        "pressure":1024.39,
        "sea_level":1034.23,
        "grnd_level":1024.39,
        "humidity":84,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"01d"
        }
     ],
     "clouds":{  
        "all":0
     },
     "wind":{  
        "speed":1.32,
        "deg":293.503
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-28 06:00:00"
  },
  {  
     "dt":1467104400,
     "main":{  
        "temp":289.767,
        "temp_min":289.767,
        "temp_max":289.767,
        "pressure":1024.28,
        "sea_level":1034.09,
        "grnd_level":1024.28,
        "humidity":0,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":800,
           "main":"Clear",
           "description":"klarer Himmel",
           "icon":"02d"
        }
     ],
     "clouds":{  
        "all":8
     },
     "wind":{  
        "speed":1.97,
        "deg":182.509
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-28 09:00:00"
  },
  {  
     "dt":1467126000,
     "main":{  
        "temp":290.681,
        "temp_min":290.681,
        "temp_max":290.681,
        "pressure":1022.46,
        "sea_level":1032.22,
        "grnd_level":1022.46,
        "humidity":73,
        "temp_kf":0
     },
     "weather":[  
        {  
           "id":804,
           "main":"Clouds",
           "description":"wolkenbedeckt",
           "icon":"04d"
        }
     ],
     "clouds":{  
        "all":92
     },
     "wind":{  
        "speed":3.96,
        "deg":229.5
     },
     "rain":{  

     },
     "sys":{  
        "pod":"d"
     },
     "dt_txt":"2016-06-28 15:00:00"
  }

]
}
`

Translations needed

We have some new strings for v0.4 and we need to translate them. These are a bit more complicated, so Google Translate won't be enough. We need them in Spanish, Basque (@beriain could help), Japanese (@naofum), French, Italian, Dutch, Russian. It's better to have them before release, than after release, where everything changes anyway.

<string name="setting_imperialDate">Use imperial date format</string>
<string name="setting_imperialDate_description">12/31/2001 instead of 31.12.2001</string>
<string name="setting_showDay">Show day of the week</string>
<string name="setting_speedUnits">Speed units</string>
<string name="setting_tempUnits">Temperature units</string>
<string name="setting_pressureUnits">Pressure units</string>

I know we won't get it in all languages, but let's try to get as much as possible.

Crash when adding Widget

I just got this crash on a fresh install. Steps to reproduce:

  1. Install Forecastie
  2. Do not start Forecastie
  3. Add widget to homescreen
FATAL EXCEPTION: main
Process: cz.martykan.forecastie, PID: 13594
Theme: themes:{}
java.lang.RuntimeException: Unable to start receiver cz.martykan.forecastie.widgets.TimeWidgetProvider: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2766)
    at android.app.ActivityThread.-wrap14(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1440)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5461)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
    at android.graphics.Canvas.drawText(Canvas.java:1656)
    at cz.martykan.forecastie.widgets.AbstractWidgetProvider.getWeatherIcon(AbstractWidgetProvider.java:41)
    at cz.martykan.forecastie.widgets.TimeWidgetProvider.onUpdate(TimeWidgetProvider.java:57)
    at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:66)
    at cz.martykan.forecastie.widgets.TimeWidgetProvider.onReceive(TimeWidgetProvider.java:72)
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2759)
    at android.app.ActivityThread.-wrap14(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1440) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5461) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Use integer values for temperatures

I don't think people really care about sub-integer temperatures. I mean, 17°C and 17.4°C is essentially the same temperature to me. Moreover, reporting temperature of a 3 hour period with 0.1°C accuracy is not really meaningful since the temperature will surely fluctuate during this time and through the region.

Rounding all temperatures to integer values instead removes some clutter from the app, making it more useful when you want to very quickly check the weather.

At the end, this is my personal taste. Feel free to close this issue. I am already very thankful for this beautiful and useful app that you have made.

Always current location

Hi!
Please add an option to get the current location with every refresh. And please add more refresh rates (2 and 6 hours for example).

Feature Request: Smaller 2x1 widget

Hi,
This is the best weather app for Android I found, but the widget is too big for me. I would like a 2x1 (or 4x1) widget like the weather panel in CMs cLock.
Thanks

Add mm for rain forecast

I think that the data about mm would be very interesting. I have lived in cities where despite it said it was going to rain, you knew that if it wasn´t something higher than 0.5 mm it was very improbable.

Dependency on Google Play Services for Location

A dependency on the proprietary Google Play Services seems to have been introduced by 32ef745 in #40 for resolving coarse location. I wonder if it is possible to resolve location without these services, as introducing such a dependency has a couple important consequences, especially considering Forecastie is aiming to be a FOSS app:

  1. Users of fully-free (or otherwise Google-free) roms would be unable to use our app.
  2. We might get kicked from F-Droid (or F-Droid would have to maintain a separate branch with the proprietary services stripped out).

We may also look into configurable solutions, such as a setting to configure location provider, or as a stop-gap, a setting that guards against importing or creating the proprietary GoogleAPIClient (using dynamic import measures or otherwise). If desirable, I will spend some time looking into this.

A Changelog would be nice :)

Could you make a simple Changelog just to keep us updated about the changes from a release to another?

Thanks

Maps are very slow

I implemented a weather map feature, but the OpenWeatherMap tiles are loading very slowly, it can take up to a minute to load. Does anyone know if this is a limitation of the free service, or are their servers under big load now?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.