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); } }