package suda.sudamodweather.ui;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import me.drakeet.materialdialog.MaterialDialog;
import suda.sudamodweather.R;
import suda.sudamodweather.dao.CityDao;
import suda.sudamodweather.dao.bean.City;
import suda.sudamodweather.dao.bean.OptDO;
import suda.sudamodweather.dao.greendao.Alarms;
import suda.sudamodweather.dao.greendao.Aqi;
import suda.sudamodweather.dao.greendao.RealWeather;
import suda.sudamodweather.dao.greendao.UseArea;
import suda.sudamodweather.dao.greendao.Zhishu;
import suda.sudamodweather.manager.WeatherInfo;
import suda.sudamodweather.manager.WeatherManager;
import suda.sudamodweather.ui.adapter.OptMenuAdapter;
import suda.sudamodweather.ui.adapter.ZhiShuAdapter;
import suda.sudamodweather.util.Constant;
import suda.sudamodweather.util.GpsUtil;
import suda.sudamodweather.util.ScreenUtil;
import suda.sudamodweather.util.TextUtil;
import suda.sudamodweather.widget.AqiView;
import suda.sudamodweather.widget.HourForeCastView;
import suda.sudamodweather.widget.MyListView;
import suda.sudamodweather.widget.SunRiseView;
import suda.sudamodweather.widget.WeekForecastView;
import suda.sudamodweather.widget.WindForecastView;
import suda.sudamodweather.widget.WindmillView;
import suda.sudamodweather.widget.weather.SkyView;
public class MainActivity extends AppCompatActivity implements BDLocationListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(R.layout.activity_main);
weatherManager = new WeatherManager(this);
initWidget();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getPermission(Manifest.permission.ACCESS_FINE_LOCATION);
} else {
initParam();
}
}
protected void getPermission(final String permission) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{permission}, 0);
} else {
initParam();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
initParam();
}
private void initParam() {
UseArea useArea = weatherManager.queryMianUseArea();
if (useArea == null) {
GpsUtil gpsUtil = new GpsUtil(this, this);
gpsUtil.start();
} else {
weatherID = useArea.getAreaid();
mCurrentAreaTv.setText(useArea.getAreaName());
refresh(true);
}
}
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.d("aaa", bdLocation.getCity() + bdLocation.getDistrict());
String areaName = TextUtil.getFormatArea(bdLocation.getDistrict());
String cityName = TextUtil.getFormatArea(bdLocation.getCity());
City city = cityDao.getCityByCityAndArea(cityName, areaName);
if (city == null) {
city = cityDao.getCityByCityAndArea(cityName, cityName);
if (city == null) {
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
});
return;
}
}
weatherManager.insertNewUseArea(city, true);
weatherID = city.getWeatherId();
mCurrentAreaTv.setText(city.getAreaName());
refresh(true);
}
private void initWidget() {
contentMian = (ScrollView) findViewById(R.id.content_main);
contentMian.setVisibility(View.INVISIBLE);
mCurrentAreaTv = (TextView) findViewById(R.id.tv_topCity);
mCurrentAreaTv.setText("正在刷新");
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh);
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
}
});
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refresh(false);
}
});
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitle("");
setSupportActionBar(mToolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawLayout);
mFirstShowRl = findViewById(R.id.first_show_rl);
TypedArray actionbarSizeTypedArray = this.obtainStyledAttributes(new int[]{android.R.attr.actionBarSize});
int h = (int) actionbarSizeTypedArray.getDimension(0, 0);
mFirstShowRl.getLayoutParams().height = ScreenUtil.getScreenHeight(this) - h - ScreenUtil.getStatusBarHeight(this);
setDrawerLayout();
setRealWeather();
setForeCast();
setWind();
setAqi();
setSunRiseView();
setZhiShu();
}
private void setZhiShu() {
mZhishuLv = (MyListView) findViewById(R.id.lv_livingIndex);
zhishuList = new ArrayList<>();
mZhiShuAdapter = new ZhiShuAdapter(zhishuList, this);
mZhishuLv.setAdapter(mZhiShuAdapter);
}
private void refresh(boolean useLocal) {
weatherManager.refreshWeather(weatherID, useLocal, new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
contentMian.setVisibility(View.VISIBLE);
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
});
if (msg.what == Constant.MSG_ERROR) {
Toast.makeText(MainActivity.this, "刷新失败", Toast.LENGTH_SHORT).show();
} else {
WeatherInfo weatherInfo = (WeatherInfo) msg.obj;
Aqi aqi = weatherInfo.getAqi();
//实时
RealWeather realWeather = weatherInfo.getRealWeather();
mSkyView.setWeather(realWeather.getWeatherCondition(), realWeather.getSunrise(), realWeather.getSundown());
swipeRefreshLayout.setColorSchemeColors(mSkyView.getBackGroundColor());
mCurrentAreaTv.setText(realWeather.getAreaName());
mRealTempTv.setText(realWeather.getTemp() + "");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm");
mUpdateTimeTv.setText(
String.format(getResources().getString(R.string.activity_home_refresh_time), simpleDateFormat.format(realWeather.getLastUpdate()))
);
mRealAqiTv.setText("空气" + aqi.getQuality() + " " + aqi.getAqi());
mWeatherAndFeelTemp.setText(
String.format(getResources().getString(R.string.activity_home_type_and_real_feel_temp),
realWeather.getWeatherCondition(), realWeather.getFeeltemp())
);
//周报&&时报
weekForeCastView.setForeCasts(weatherInfo.getWeekForeCasts());
hourForeCastView.setHourForeCasts(weatherInfo.getHourForeCasts());
windForecastView.setForeCasts(weatherInfo.getWeekForeCasts());
//风速湿度
windViewBig.setWindSpeedDegree(Integer.parseInt(realWeather.getFj().replace("级", "")));
windViewSmall.setWindSpeedDegree(Integer.parseInt(realWeather.getFj().replace("级", "")));
mWindDegreeTv.setText(realWeather.getFx());
mWindLevelTv.setText(realWeather.getFj());
progressBar.setProgress(realWeather.getShidu());
mShiduTv.setText(realWeather.getShidu() + "");
//空气
mAqi.setProgressAndLabel(aqi.getAqi(), "空气" + aqi.getQuality());
mPm2_5Tv.setText(aqi.getPm2_5() + " μg/m³");
mPm10Tv.setText(aqi.getPm10() + " μg/m³");
mSo2Tv.setText(aqi.getSo2() + " μg/m³");
mNo2Tv.setText(aqi.getNo2() + " μg/m³");
//日出
mSunRiseView.setSunRiseDownTime(realWeather.getSunrise(), realWeather.getSundown());
//指数
zhishuList.clear();
zhishuList.addAll(weatherInfo.getZhishu());
mZhiShuAdapter.notifyDataSetChanged();
contentMian.smoothScrollTo(0, 0);
//预警
final Alarms alarms = weatherInfo.getAlarms();
if (alarms != null) {
mRealAqiTv.setClickable(true);
mRealAqiTv.setText(alarms.getAlarmLevelNoDesc() + alarms.getAlarmTypeDesc());
mRealAqiTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AlarmActivity.class);
intent.putExtra("alarminfo", alarms);
startActivity(intent);
}
});
} else
mRealAqiTv.setClickable(false);
}
}
});
}
private void setForeCast() {
weekForeCastView = (WeekForecastView) findViewById(R.id.weekForecast);
hourForeCastView = (HourForeCastView) findViewById(R.id.hourForecast);
windForecastView = (WindForecastView) findViewById(R.id.wind_forecast);
}
/**
* 实时
*/
private void setRealWeather() {
mSkyView = (SkyView) findViewById(R.id.myWeatherView);
mRealTempTv = (TextView) findViewById(R.id.tv_RTTemp);
mWeatherAndFeelTemp = (TextView) findViewById(R.id.tv_RTTypeAndRealFeel);
mRealAqiTv = (TextView) findViewById(R.id.tv_aqi);
mUpdateTimeTv = (TextView) findViewById(R.id.tv_updateTime);
}
/**
* 初始化空气
*/
private void setSunRiseView() {
mSunRiseView = (SunRiseView) findViewById(R.id.view_sun);
mSunRiseView.setSunRiseDownTime("05:00", "18:46");
}
/**
* 初始化空气
*/
private void setAqi() {
mPm2_5Tv = (TextView) findViewById(R.id.tv_pm25);
mPm10Tv = (TextView) findViewById(R.id.tv_pm10);
mSo2Tv = (TextView) findViewById(R.id.tv_so2);
mNo2Tv = (TextView) findViewById(R.id.tv_no2);
mAqi = (AqiView) findViewById(R.id.view_aqi);
}
/**
* 初始化风速
*/
private void setWind() {
progressBar = (ProgressBar) findViewById(R.id.pb_humidity);
mShiduTv = (TextView) findViewById(R.id.tv_humidity);
windViewBig = (WindmillView) findViewById(R.id.windViewBig);
windViewSmall = (WindmillView) findViewById(R.id.windViewSmall);
mWindDegreeTv = (TextView) findViewById(R.id.tv_windDire);
mWindLevelTv = (TextView) findViewById(R.id.tv_windSpeed);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
windViewBig.refreshView();
windViewSmall.refreshView();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private void setDrawerLayout() {
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
mToolbar, R.string.open, R.string.close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu();
openOrClose = false;
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
openOrClose = true;
}
};
mDrawerToggle.syncState();
mDrawerLayout.addDrawerListener(mDrawerToggle);
//初始化菜单
mLvOptItems = (ListView) findViewById(R.id.lv_drawer_menu);
List<OptDO> optDOs = new ArrayList<>();
optDOs.add(new OptDO(null, 0, R.drawable.ic_drawer_add, "城市管理"));
optDOs.add(new OptDO(null, 1, R.drawable.ic_drawer_setting, "应用设置"));
optDOs.add(new OptDO(null, 2, R.drawable.ic_drawer_help, "使用帮助"));
optDOs.add(new OptDO(null, 4, R.drawable.ic_drawer_contact, "联系我们"));
optDOs.add(new OptDO(null, 4, R.drawable.ic_drawer_check_update, "检查更新"));
optDOs.add(new OptDO(null, 5, R.drawable.ic_drawer_about, "关于"));
optMenuAdapter = new OptMenuAdapter(optDOs, this);
mLvOptItems.setAdapter(optMenuAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.weather_preview:
showPreview();
break;
}
return super.onOptionsItemSelected(item);
}
private void showPreview() {
final ArrayAdapter<String> arrayAdapter
= new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1);
arrayAdapter.add("晴");
arrayAdapter.add("多云");
arrayAdapter.add("阴");
arrayAdapter.add("雾");
arrayAdapter.add("雨");
arrayAdapter.add("雨夹雪");
arrayAdapter.add("雪");
arrayAdapter.add("霾");
ListView listView = new ListView(this);
listView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
listView.setDividerHeight(1);
listView.setAdapter(arrayAdapter);
final MaterialDialog alert = new MaterialDialog(this).setContentView(listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSkyView.setWeather(parent.getAdapter().getItem(position).toString());
alert.dismiss();
}
});
alert.setCanceledOnTouchOutside(true);
alert.show();
}
//////////////////////////////////////////////////////
private CityDao cityDao = new CityDao(this);
private String weatherID = "101190501";
private boolean openOrClose = false;
private Toolbar mToolbar;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private TextView mCurrentAreaTv;
private OptMenuAdapter optMenuAdapter;
private ListView mLvOptItems;
private WeatherManager weatherManager;
private SwipeRefreshLayout swipeRefreshLayout;
private ScrollView contentMian;
//实时天气
private TextView mRealTempTv, mWeatherAndFeelTemp;
private TextView mRealAqiTv;
private TextView mUpdateTimeTv;
private SkyView mSkyView;
//风速湿度
private WindmillView windViewBig;
private WindmillView windViewSmall;
private TextView mWindDegreeTv, mWindLevelTv;
private TextView mShiduTv;
private ProgressBar progressBar;
//空气指数
private AqiView mAqi;
private TextView mPm2_5Tv, mPm10Tv, mSo2Tv, mNo2Tv;
//日出日落图
private SunRiseView mSunRiseView;
//周报 时报
private WeekForecastView weekForeCastView;
private HourForeCastView hourForeCastView;
private WindForecastView windForecastView;
//指数
private MyListView mZhishuLv;
private ZhiShuAdapter mZhiShuAdapter;
private List<Zhishu> zhishuList;
private View mFirstShowRl;
}