diff --git a/app/src/main/java/com/example/android/sunshine/app/ForecastFragment.java b/app/src/main/java/com/example/android/sunshine/app/ForecastFragment.java index 627e898..f92a41d 100644 --- a/app/src/main/java/com/example/android/sunshine/app/ForecastFragment.java +++ b/app/src/main/java/com/example/android/sunshine/app/ForecastFragment.java @@ -16,9 +16,11 @@ package com.example.android.sunshine.app; import android.content.Intent; +import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; @@ -40,7 +42,7 @@ import com.example.android.sunshine.app.sync.SunshineSyncAdapter; /** * Encapsulates fetching the forecast and displaying it as a {@link ListView} layout. */ -public class ForecastFragment extends Fragment implements LoaderManager.LoaderCallbacks { +public class ForecastFragment extends Fragment implements LoaderManager.LoaderCallbacks, SharedPreferences.OnSharedPreferenceChangeListener { public static final String LOG_TAG = ForecastFragment.class.getSimpleName(); private ForecastAdapter mForecastAdapter; @@ -105,6 +107,20 @@ public class ForecastFragment extends Fragment implements LoaderManager.LoaderCa setHasOptionsMenu(true); } + @Override + public void onResume() { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sp.registerOnSharedPreferenceChangeListener(this); + super.onResume(); + } + + @Override + public void onPause() { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sp.unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.forecastfragment, menu); @@ -281,11 +297,29 @@ public class ForecastFragment extends Fragment implements LoaderManager.LoaderCa if ( null != tv ) { // if cursor is empty, why? do we have an invalid location int message = R.string.empty_forecast_list; - if (!Utility.isNetworkAvailable(getActivity()) ) { - message = R.string.empty_forecast_list_no_network; + @SunshineSyncAdapter.LocationStatus int location = Utility.getLocationStatus(getActivity()); + switch (location) { + case SunshineSyncAdapter.LOCATION_STATUS_SERVER_DOWN: + message = R.string.empty_forecast_list_server_down; + break; + case SunshineSyncAdapter.LOCATION_STATUS_SERVER_INVALID: + message = R.string.empty_forecast_list_server_error; + break; + default: + if (!Utility.isNetworkAvailable(getActivity()) ) { + message = R.string.empty_forecast_list_no_network; + } } tv.setText(message); } } } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if ( key.equals(getString(R.string.pref_location_status_key)) ) { + updateEmptyView(); + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/android/sunshine/app/Utility.java b/app/src/main/java/com/example/android/sunshine/app/Utility.java index b388373..f4865e7 100644 --- a/app/src/main/java/com/example/android/sunshine/app/Utility.java +++ b/app/src/main/java/com/example/android/sunshine/app/Utility.java @@ -22,6 +22,8 @@ import android.net.NetworkInfo; import android.preference.PreferenceManager; import android.text.format.Time; +import com.example.android.sunshine.app.sync.SunshineSyncAdapter; + import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -253,7 +255,7 @@ public class Utility { * Returns true if the network is available or about to become available. * * @param c Context used to get the ConnectivityManager - * @return + * @return true if the network is available */ static public boolean isNetworkAvailable(Context c) { ConnectivityManager cm = @@ -263,4 +265,16 @@ public class Utility { return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } + + /** + * + * @param c Context used to get the SharedPreferences + * @return the location status integer type + */ + @SuppressWarnings("ResourceType") + static public @SunshineSyncAdapter.LocationStatus + int getLocationStatus(Context c){ + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(c); + return sp.getInt(c.getString(R.string.pref_location_status_key), SunshineSyncAdapter.LOCATION_STATUS_UNKNOWN); + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9ed4172..968d787 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -115,6 +115,7 @@ No Weather Information Available No weather information available. The network is not available to fetch weather data. - + No weather information available. The server is not returning data. + No weather information available. The server is not returning valid data. Please check for an updated version of Sunshine. \ No newline at end of file