package com.silencedut.knowweather.model; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.silencedut.knowweather.ModelManager; import com.silencedut.knowweather.WeatherApplication; import com.silencedut.knowweather.citys.adapter.CityInfoData; import com.silencedut.knowweather.common.BaseModel; import com.silencedut.knowweather.common.Constants; import com.silencedut.knowweather.repository.db.DBManage; import com.silencedut.knowweather.model.callbacks.ModelCallback; import com.silencedut.knowweather.repository.PreferencesUtil; import com.silencedut.knowweather.scheduler.TaskCallback; import com.silencedut.knowweather.scheduler.TaskScheduler; import com.silencedut.router.Router; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created by SilenceDut on 16/10/28. */ public class CityModel extends BaseModel { private AMapLocationClient mLocationClient; private String mCityName = Constants.DEFAULT_STR; private String mLocationId = Constants.DEFAULT_STR; private String mDefaultId = Constants.DEFAULT_STR; @Override public void onCreate() { super.onCreate(); mDefaultId = PreferencesUtil.get(Constants.DEFAULT_CITY, Constants.DEFAULT_STR); mLocationId = PreferencesUtil.get(Constants.LOCATION, Constants.DEFAULT_STR); initLocation(); } private CityModel initLocation() { mLocationClient = new AMapLocationClient(WeatherApplication.getContext()); AMapLocationClientOption option = new AMapLocationClientOption(); option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); option.setOnceLocationLatest(true); mLocationClient.setLocationOption(option); mLocationClient.setLocationListener(new AMapLocationListener() { @Override public void onLocationChanged(final AMapLocation aMapLocation) { if (aMapLocation != null) { TaskScheduler.execute(new Runnable() { public void run() { String locationCityId = Constants.DEFAULT_CITY_ID; if (aMapLocation.getErrorCode() == 0) { String district = aMapLocation.getDistrict(); List<CityInfoData> citysInfo = DBManage.getInstance().searchCity(district); //城市库全名不匹配 if (citysInfo.size() == 0) { district = district.substring(0, 2); } citysInfo = DBManage.getInstance().searchCity(district); mCityName = Constants.DEFAULT_STR; //县级不支持,就找上一级市 if (citysInfo.size() == 0) { district = aMapLocation.getCity(); district = district.substring(0, 2); citysInfo = DBManage.getInstance().searchCity(district); } if (citysInfo.size() > 0) { mCityName = citysInfo.get(0).getCityName(); locationCityId = citysInfo.get(0).getCityId(); } mLocationId = locationCityId; PreferencesUtil.put(Constants.LOCATION, mLocationId); } Router.instance().getReceiver(ModelCallback.LocationResult.class) .onLocationComplete(locationCityId, aMapLocation.getErrorCode() == 0); } }); } } }); return this; } public void startLocation() { mLocationClient.startLocation(); } public String getLocationCityId() { return mLocationId; } public String getDefaultId() { return mDefaultId; } public boolean noDefaultCity() { return Constants.DEFAULT_STR.equals(mDefaultId); } public void setDefaultId(String defaultId) { mDefaultId = defaultId; PreferencesUtil.put(Constants.DEFAULT_CITY, defaultId); } public String locationCityName() { return mCityName; } public void getAllCities(final TaskCallback.Success<List<CityInfoData>> taskCallback) { TaskScheduler.runOnBackgroundThread(new Runnable() { @Override public void run() { List<CityInfoData> allCities = DBManage.getInstance().getAllCities(); TaskScheduler.notifySuccessToUI(allCities,taskCallback); } }); } public void matchCities(final String key,final TaskCallback.Success<List<CityInfoData>> matchedCityCallback) { TaskScheduler.runOnBackgroundThread(new Runnable() { @Override public void run() { List<CityInfoData> matchedCities = DBManage.getInstance().searchCity(key); TaskScheduler.notifySuccessToUI(matchedCities,matchedCityCallback); } }); } public void unFollowCity(String cityId) { Set<String> defaultFollowed = new HashSet<>(); defaultFollowed = PreferencesUtil.get(Constants.FOLLOWED_CITIES, defaultFollowed); if (!defaultFollowed.contains(cityId)) { return; } String defaultCityId = getDefaultId(); if (defaultCityId.equals(cityId)) { ModelManager.getModel(WeatherModel.class).updateWeather(getLocationCityId()); } defaultFollowed.remove(cityId); PreferencesUtil.remove(cityId); PreferencesUtil.put(Constants.FOLLOWED_CITIES, defaultFollowed); } @Override public void onDestroy() { super.onDestroy(); mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。 } }