package com.xiecc.seeWeather.modules.main.ui;
import android.Manifest;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import butterknife.BindView;
import butterknife.ButterKnife;
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.tbruyelle.rxpermissions2.RxPermissions;
import com.xiecc.seeWeather.R;
import com.xiecc.seeWeather.base.BaseApplication;
import com.xiecc.seeWeather.base.BaseFragment;
import com.xiecc.seeWeather.common.utils.CheckVersion;
import com.xiecc.seeWeather.common.utils.RxUtil;
import com.xiecc.seeWeather.common.utils.SharedPreferenceUtil;
import com.xiecc.seeWeather.common.utils.ToastUtil;
import com.xiecc.seeWeather.common.utils.Util;
import com.xiecc.seeWeather.component.RetrofitSingleton;
import com.xiecc.seeWeather.component.RxBus;
import com.xiecc.seeWeather.modules.main.adapter.WeatherAdapter;
import com.xiecc.seeWeather.modules.main.domain.ChangeCityEvent;
import com.xiecc.seeWeather.modules.main.domain.Weather;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
/**
* Created by HugoXie on 16/7/9.
* <p>
* Email: Hugo3641@gamil.com
* GitHub: https://github.com/xcc3641
* Info:
*/
public class MainFragment extends BaseFragment implements AMapLocationListener {
@BindView(R.id.recyclerview)
RecyclerView mRecyclerView;
@BindView(R.id.swiprefresh)
SwipeRefreshLayout mRefreshLayout;
@BindView(R.id.progressBar)
ProgressBar mProgressBar;
@BindView(R.id.iv_erro)
ImageView mIvError;
private static Weather mWeather = new Weather();
private WeatherAdapter mAdapter;
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
public AMapLocationClientOption mLocationOption = null;
private View view;
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.content_main, container, false);
ButterKnife.bind(this, view);
}
mIsCreateView = true;
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
new RxPermissions(getActivity()).request(Manifest.permission.ACCESS_COARSE_LOCATION)
.doOnNext(granted -> {
if (granted) {
location();
} else {
load();
}
})
.subscribe();
CheckVersion.checkVersion(getActivity());
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RxBus.getDefault()
.toObservable(ChangeCityEvent.class)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(event -> {
if (mRefreshLayout != null) {
mRefreshLayout.setRefreshing(true);
}
load();
})
.subscribe();
}
private void initView() {
if (mRefreshLayout != null) {
mRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
mRefreshLayout.setOnRefreshListener(
() -> mRefreshLayout.postDelayed(this::load, 1000));
}
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mAdapter = new WeatherAdapter(mWeather);
mRecyclerView.setAdapter(mAdapter);
}
private void load() {
fetchDataByNetWork()
.doOnSubscribe(aLong -> mRefreshLayout.setRefreshing(true))
.doOnError(throwable -> {
mIvError.setVisibility(View.VISIBLE);
mRecyclerView.setVisibility(View.GONE);
SharedPreferenceUtil.getInstance().setCityName("北京");
safeSetTitle("找不到城市啦");
})
.doOnNext(weather -> {
mIvError.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
mWeather.status = weather.status;
mWeather.aqi = weather.aqi;
mWeather.basic = weather.basic;
mWeather.suggestion = weather.suggestion;
mWeather.now = weather.now;
mWeather.dailyForecast = weather.dailyForecast;
mWeather.hourlyForecast = weather.hourlyForecast;
safeSetTitle(weather.basic.city);
mAdapter.notifyDataSetChanged();
normalStyleNotification(weather);
})
.doOnComplete(() -> {
mRefreshLayout.setRefreshing(false);
mProgressBar.setVisibility(View.GONE);
ToastUtil.showShort(getString(R.string.complete));
})
.subscribe();
}
/**
* 从网络获取
*/
private Observable<Weather> fetchDataByNetWork() {
String cityName = SharedPreferenceUtil.getInstance().getCityName();
return RetrofitSingleton.getInstance()
.fetchWeather(cityName)
.compose(RxUtil.fragmentLifecycle(this));
}
/**
* 高德定位
*/
private void location() {
mRefreshLayout.setRefreshing(true);
//初始化定位
mLocationClient = new AMapLocationClient(BaseApplication.getAppContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false\
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔 单位毫秒
int tempTime = SharedPreferenceUtil.getInstance().getAutoUpdate();
if (tempTime == 0) {
tempTime = 100;
}
mLocationOption.setInterval(tempTime * SharedPreferenceUtil.ONE_HOUR);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
SharedPreferenceUtil.getInstance().setCityName(Util.replaceCity(aMapLocation.getCity()));
} else {
if (isAdded()) {
ToastUtil.showShort(getString(R.string.errorLocation));
}
}
load();
}
}
@Override
public void onDestroy() {
super.onDestroy();
mLocationClient = null;
mLocationOption = null;
}
/**
* 加载数据操作,在视图创建之前初始化
*/
@Override
protected void lazyLoad() {
}
private void normalStyleNotification(Weather weather) {
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(getActivity());
Notification notification = builder.setContentIntent(pendingIntent)
.setContentTitle(weather.basic.city)
.setContentText(String.format("%s 当前温度: %s℃ ", weather.now.cond.txt, weather.now.tmp))
// 这里部分 ROM 无法成功
.setSmallIcon(SharedPreferenceUtil.getInstance().getInt(weather.now.cond.txt, R.mipmap.none))
.build();
notification.flags = SharedPreferenceUtil.getInstance().getNotificationModel();
NotificationManager manager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
// tag和id都是可以拿来区分不同的通知的
manager.notify(1, notification);
}
}