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