0

I solved the issue for "checking if location is enabled", but now I'm stuck. I want the app to show a toast if location is disabled, and once it's enabled by the user, I want the app to proceed as normal, like location was enabled at the first place. My code looks correct to me, I don't know where the problem is. Note that I don't have any issues with accessing the location, network and stuff. It's just that I always need to restart the app after enabling location, otherwise it won't proceed and keep giving me the warning toast. Thanks in advance.

Edit: So I just added an alert dialog method instead of Toast messages. Users can now go to settings and turn location and network on using that dialog. I'd like you to take a look at the Network check if-else statement inside getForecast() method. else contains the alert dialog that leads user to Settings-Data Roaming. And when user activated mobile data and returns to the app, everything's fine and app can get info. I did the same for location if-else statement, yet when user turns location on and returns to the app, no matter what I do (wait several minutes, refresh several times), I'm not getting the location info. I need to close and reopen the app every time. That's the exact issue I'm facing.

Code:

public class MainActivity extends AppCompatActivity {

public static final String TAG = MainActivity.class.getSimpleName();
public static final String DAILY_FORECAST = "DAILY_FORECAST";
private Forecast mForecast;

@Bind(R.id.timeLabel) TextView mTimeLabel;
@Bind(R.id.tempLabel) TextView mTempLabel;
@Bind(R.id.humidityValue) TextView mHumidityValue;
@Bind(R.id.precipValue) TextView mPrecipValue;
@Bind(R.id.summaryLabel) TextView mSummaryLabel;
@Bind(R.id.windSpeedValue) TextView mWindSpeedValue;
@Bind(R.id.relativeLayout) RelativeLayout mRelativeLayout;
@Bind(R.id.container) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.locationLabel) TextView mLocationLabel;

double latitude;
double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    final GPSTracker gpsTracker = new GPSTracker(this);

    mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN);
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mSwipeRefreshLayout.setRefreshing(false);
                }
            }, 1500);
            if (gpsTracker.getIsGPSTrackingEnabled()){
                getForecast(gpsTracker);
                updateDisplay(gpsTracker);

            } else {
            Toast.makeText(MainActivity.this, "Please enable location services.!!", Toast.LENGTH_LONG).show();
            gpsTracker.showSettingsAlert();
            }
        }
    });
    getForecast(gpsTracker);
    }


private void getForecast(final GPSTracker gpsTracker) {

        latitude = gpsTracker.getLatitude();
        longitude = gpsTracker.getLongitude();
        String apiKey = "7d22cdb138cd70f2e9e8d2006cd0461c";
        String forecastUrl = "https://api.forecast.io/forecast/" + apiKey
                + "/" + latitude + "," + longitude;

        if (isNetworkAvailable()) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url(forecastUrl).build();

            Call call = client.newCall(request);

            call.enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {
                    alertUserAboutError();
                }

                @Override
                public void onResponse(Response response) throws IOException {
                    try {
                        String jsonData = response.body().string();
                        Log.v(TAG, jsonData);
                        if (response.isSuccessful()) {
                            mForecast = parseForecastDetails(jsonData);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (gpsTracker.getIsGPSTrackingEnabled()) {
                                        updateDisplay(gpsTracker);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Please enable location services.", Toast.LENGTH_LONG).show();
                                    }
                                }
                            });

                        } else {
                            alertUserAboutError();
                        }
                    } catch (IOException | JSONException e) {
                        Log.e(TAG, "Exception caught: ", e);
                    }
            }
        });
        } else {
            gpsTracker.showSettingsAlert2();
        }


}

private void updateDisplay(GPSTracker gpsTracker) {

    Currently currently = mForecast.getCurrently();

        String area = gpsTracker.getSubLocality(this);
        String city = gpsTracker.getAdminArea(this);
        String country = gpsTracker.getCountryName(this);
        mLocationLabel.setText(area + "\n" + city + ", " + country);
        mTempLabel.setText(currently.getTemperature() + "");
        mTimeLabel.setText(currently.getFormattedTime());
        mHumidityValue.setText(currently.getHumidity() + "%");
        mPrecipValue.setText(currently.getPrecipChance() + "%");
        mSummaryLabel.setText(currently.getSummary());
        mWindSpeedValue.setText(currently.getWindSpeed() + "");
        Drawable drawable = getResources().getDrawable(currently.getBackgroundId());
        mRelativeLayout.setBackground(drawable);
}

// irrelevant after this point. (I guess)

private Forecast parseForecastDetails(String jsonData) throws JSONException {
    Forecast forecast = new Forecast();

    forecast.setCurrently(getCurrentlyDetails(jsonData));
    forecast.setHourlyForecast(getHourlyForecast(jsonData));
    forecast.setDailyForecast(getDailyForecast(jsonData));

    return forecast;
}

private Daily[] getDailyForecast(String jsonData) throws JSONException {
    JSONObject forecast = new JSONObject(jsonData);
    String timezone = forecast.getString("timezone");
    JSONObject jsonDaily = forecast.getJSONObject("daily");
    JSONArray data = jsonDaily.getJSONArray("data");

    Daily[] days = new Daily[data.length()];

    for (int i = 0; i < data.length(); i++) {
        JSONObject daily = data.getJSONObject(i);
        Daily day = new Daily();

        day.setSummary(daily.getString("summary"));
        day.setTempMax(daily.getDouble("temperatureMax"));
        day.setTempMin(daily.getDouble("temperatureMin"));
        day.setIcon(daily.getString("icon"));
        day.setTime(daily.getLong("time"));
        day.setTimezone(timezone);

        days[i] = day;
    }
    return days;
}

private Hourly[] getHourlyForecast(String jsonData) throws JSONException{
    JSONObject forecast = new JSONObject(jsonData);
    String timezone = forecast.getString("timezone");
    JSONObject jsonHourly = forecast.getJSONObject("hourly");
    JSONArray data = jsonHourly.getJSONArray("data");

    Hourly[] hours = new Hourly[data.length()];

    for(int i=0; i < data.length(); i++) {
        JSONObject hourly = data.getJSONObject(i);
        Hourly hour = new Hourly();

        hour.setSummary(hourly.getString("summary"));
        hour.setTemp(hourly.getDouble("temperature"));
        hour.setIcon(hourly.getString("icon"));
        hour.setTime(hourly.getLong("time"));
        hour.setTimezone(timezone);

        hours[i] = hour;
    }
    return hours;
}

private Currently getCurrentlyDetails(String jsonData) throws JSONException {
    JSONObject forecast = new JSONObject(jsonData);
    String timezone = forecast.getString("timezone");
    JSONObject currently = forecast.getJSONObject("currently");

    Currently currentWeather = new Currently();
    currentWeather.setHumidity(currently.getDouble("humidity"));
    currentWeather.setTime(currently.getLong("time"));
    currentWeather.setPrecipChance(currently.getDouble("precipProbability"));
    currentWeather.setSummary(currently.getString("summary"));
    currentWeather.setTemperature(currently.getDouble("temperature"));
    currentWeather.setWindSpeed(currently.getDouble("windSpeed"));
    currentWeather.setTimeZone(timezone);
    currentWeather.setBackgroundId(currently.getString("icon"));

    Log.d(TAG, currentWeather.getFormattedTime());

    return currentWeather;
}

private boolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    boolean isAvailable = false;
    if (networkInfo != null && networkInfo.isConnected()){
        isAvailable = true;
    }
    return isAvailable;
}

private void alertUserAboutError() {
    AlertDialogFragment dialog = new AlertDialogFragment();
    dialog.show(getFragmentManager(), "error_dialog");
}

@OnClick (R.id.dailyButton)
public void startDailyActivity(View view){
    Intent intent = new Intent(this, DailyForecastActivity.class);
    intent.putExtra(DAILY_FORECAST, mForecast.getDailyForecast());
    startActivity(intent);
}

}

Onur Çevik
  • 1,560
  • 13
  • 21
  • try something like this instead where it will alert the users rather than toast them -- http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/ – Tasos Jan 03 '16 at 18:37
  • Yeah, that's a solution. However, I want the user to be able to do this through notification panel, without leaving the app. Can you help with that? – Onur Çevik Jan 03 '16 at 19:01
  • I just used that alert dialog method. The same problem exists. I turn on location by going to Settings, and then return to the app, refresh it and get that alert dialog again. I can't make it automatically recognize that location is enabled. I still need to close and reopen the app. @Tasos – Onur Çevik Jan 03 '16 at 20:52
  • hmm strange. refreshing the app while you turn on loc, should be ok. you could try and restart app so its fresh instead of refresh http://stackoverflow.com/questions/15564614/how-to-restart-an-android-application-programmatically – Tasos Jan 04 '16 at 02:20
  • @Tasos This one works. I put that restart statement in onRefresh's else, after gpsTracker.showSettingAlert(); . Yer the problem is, when user enables location, comes back to the app and refreshes it, app will still pop that "No Location" dialog before restarting, and it looks weird. If I put it before dialog statement, it does not even let you enable location and restarts. Do you have any idea where to put it? – Onur Çevik Jan 04 '16 at 19:45
  • gpstracker should be a separate java class. then in main activity you simply call the class to get the cordinates – Tasos Jan 04 '16 at 20:28
  • @Tasos I don't have any issues getting the coordinates. It just does not get them if you enable Location/GPS "after" starting the app. – Onur Çevik Jan 04 '16 at 20:32

0 Answers0