package com.silencedut.knowweather.weather.presenter;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;
import com.silencedut.knowweather.ModelManager;
import com.silencedut.knowweather.R;
import com.silencedut.knowweather.citys.ui.SearchActivity;
import com.silencedut.knowweather.common.BasePresenter;
import com.silencedut.knowweather.common.Constants;
import com.silencedut.knowweather.model.CityModel;
import com.silencedut.knowweather.model.WeatherModel;
import com.silencedut.knowweather.model.callbacks.ModelCallback;
import com.silencedut.knowweather.utils.Check;
import com.silencedut.knowweather.repository.PreferencesUtil;
import com.silencedut.knowweather.scheduler.TaskScheduler;
import com.silencedut.knowweather.weather.entity.WeatherEntity;
import com.silencedut.knowweather.weather.ui.adapter.AqiData;
import com.silencedut.knowweather.weather.ui.adapter.DailyWeatherData;
import com.silencedut.knowweather.weather.ui.adapter.HoursForecastData;
import com.silencedut.knowweather.weather.ui.adapter.LifeIndexData;
import java.util.ArrayList;
import java.util.List;
/**
* Created by SilenceDut on 16/10/29.
*/
public class WeatherPresenter extends BasePresenter<MainView> implements ModelCallback.LocationResult, ModelCallback.WeatherResult {
private CityModel mCityModel;
private WeatherModel mWeatherModel;
private MainView mMainView;
public WeatherPresenter(final MainView mainView) {
super(mainView);
mMainView = mainView;
mCityModel = ModelManager.getModel(CityModel.class);
mWeatherModel = ModelManager.getModel(WeatherModel.class);
mCityModel.startLocation();
TaskScheduler.execute(new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= 23) {
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS, Manifest.permission.WRITE_APN_SETTINGS};
for(String permission:mPermissionList) {
if (ActivityCompat.checkSelfPermission(mMainView.getContext(),permission)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions((Activity) mMainView.getContext(), new String[]{permission},1);
}
}
}
}
});
}
@Override
public void onLocationComplete(String locationId, boolean success) {
if (!success && mCityModel.noDefaultCity()) {
Toast.makeText(getContext(), R.string.add_city_hand_mode, Toast.LENGTH_LONG).show();
SearchActivity.navigationActivity(mMainView.getContext());
return;
}
if (mCityModel.noDefaultCity()||!mCityModel.getDefaultId().equals(locationId)) {
getWeather(locationId);
}
}
public void getDefaultWeather() {
WeatherEntity weatherEntity = mWeatherModel.getCachedWeather();
if (!Check.isNull(weatherEntity)) {
onWeather(weatherEntity);
}
updateDefaultWeather();
}
private void getWeather(final String cityId) {
mMainView.onRefreshing(true);
mWeatherModel.updateWeather(cityId);
}
public void updateDefaultWeather() {
String defaultCity = mCityModel.getDefaultId();
getWeather(defaultCity);
}
@Override
public void onWeather(WeatherEntity weatherEntity) {
if (weatherEntity == null) {
mMainView.onRefreshing(false);
} else {
WeatherEntity.BasicEntity basicEntity = weatherEntity.getBasic();
List<HoursForecastData> hoursForecastDatas = new ArrayList<>();
for (WeatherEntity.HoursForecastEntity hoursForecastEntity : weatherEntity.getHoursForecast()) {
hoursForecastDatas.add(new HoursForecastData(hoursForecastEntity));
}
AqiData aqiData = new AqiData(weatherEntity.getAqi());
List<DailyWeatherData> dailyWeatherDatas = new ArrayList<>();
List<WeatherEntity.DailyForecastEntity> dailyForecastEntities = weatherEntity.getDailyForecast();
for (int count = 0; count < dailyForecastEntities.size() - 2; count++) {
// only take 5 days weather
dailyWeatherDatas.add(new DailyWeatherData(dailyForecastEntities.get(count)));
}
LifeIndexData lifeIndexData = new LifeIndexData(weatherEntity.getLifeIndex());
boolean isLocationCity = weatherEntity.getCityId().equals(PreferencesUtil.get(Constants.LOCATION, Constants.DEFAULT_STR));
mMainView.onBasicInfo(basicEntity, hoursForecastDatas, isLocationCity);
mMainView.onMoreInfo(aqiData, dailyWeatherDatas, lifeIndexData);
}
}
}