package com.xiecc.seeWeather.modules.city.ui; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import com.xiecc.seeWeather.R; import com.xiecc.seeWeather.common.C; import com.xiecc.seeWeather.base.ToolbarActivity; import com.xiecc.seeWeather.common.Irrelevant; import com.xiecc.seeWeather.common.utils.RxUtil; import com.xiecc.seeWeather.common.utils.SharedPreferenceUtil; import com.xiecc.seeWeather.common.utils.Util; import com.xiecc.seeWeather.component.OrmLite; import com.xiecc.seeWeather.component.RxBus; import com.xiecc.seeWeather.modules.city.adapter.CityAdapter; import com.xiecc.seeWeather.modules.city.db.DBManager; import com.xiecc.seeWeather.modules.city.db.WeatherDB; import com.xiecc.seeWeather.modules.city.domain.City; import com.xiecc.seeWeather.modules.city.domain.Province; import com.xiecc.seeWeather.modules.main.domain.ChangeCityEvent; import com.xiecc.seeWeather.modules.main.domain.CityORM; import com.xiecc.seeWeather.modules.main.domain.MultiUpdate; import io.reactivex.BackpressureStrategy; import io.reactivex.Flowable; import io.reactivex.FlowableOnSubscribe; import io.reactivex.Observable; import java.util.ArrayList; import java.util.List; public class ChoiceCityActivity extends ToolbarActivity { private RecyclerView mRecyclerView; private ProgressBar mProgressBar; private ArrayList<String> dataList = new ArrayList<>(); private Province selectedProvince; private List<Province> provincesList = new ArrayList<>(); private List<City> cityList; private CityAdapter mAdapter; public static final int LEVEL_PROVINCE = 1; public static final int LEVEL_CITY = 2; private int currentLevel; private boolean isChecked = false; @Override protected int provideContentViewId() { return R.layout.activity_choice_city; } @Override public boolean canBack() { return true; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); Observable.create(emitter -> { DBManager.getInstance().openDatabase(); emitter.onNext(Irrelevant.INSTANCE); emitter.onComplete(); }) .compose(RxUtil.io()) .compose(RxUtil.activityLifecycle(this)) .doOnNext(o -> { initRecyclerView(); queryProvinces(); }) .subscribe(); Intent intent = getIntent(); isChecked = intent.getBooleanExtra(C.MULTI_CHECK, false); if (isChecked && SharedPreferenceUtil.getInstance().getBoolean("Tips", true)) { showTips(); } } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); mProgressBar = (ProgressBar) findViewById(R.id.progressBar); if (mProgressBar != null) { mProgressBar.setVisibility(View.VISIBLE); } } private void initRecyclerView() { mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setHasFixedSize(true); mAdapter = new CityAdapter(this, dataList); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener((view, pos) -> { if (currentLevel == LEVEL_PROVINCE) { selectedProvince = provincesList.get(pos); mRecyclerView.smoothScrollToPosition(0); queryCities(); } else if (currentLevel == LEVEL_CITY) { String city = Util.replaceCity(cityList.get(pos).mCityName); if (isChecked) { OrmLite.getInstance().save(new CityORM(city)); RxBus.getDefault().post(new MultiUpdate()); } else { SharedPreferenceUtil.getInstance().setCityName(city); RxBus.getDefault().post(new ChangeCityEvent()); } quit(); } }); } /** * 查询全国所有的省,从数据库查询 */ private void queryProvinces() { getToolbar().setTitle("选择省份"); Flowable.create((FlowableOnSubscribe<String>) emitter -> { if (provincesList.isEmpty()) { provincesList.addAll(WeatherDB.loadProvinces(DBManager.getInstance().getDatabase())); } dataList.clear(); for (Province province : provincesList) { emitter.onNext(province.mProName); } emitter.onComplete(); }, BackpressureStrategy.BUFFER) .compose(RxUtil.ioF()) .compose(RxUtil.activityLifecycleF(this)) .doOnNext(proName -> dataList.add(proName)) .doOnComplete(() -> { mProgressBar.setVisibility(View.GONE); currentLevel = LEVEL_PROVINCE; mAdapter.notifyDataSetChanged(); }) .subscribe(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.multi_city_menu, menu); menu.getItem(0).setChecked(isChecked); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.multi_check) { if (isChecked) { item.setChecked(false); } else { item.setChecked(true); } isChecked = item.isChecked(); } return super.onOptionsItemSelected(item); } /** * 查询选中省份的所有城市,从数据库查询 */ private void queryCities() { getToolbar().setTitle("选择城市"); dataList.clear(); mAdapter.notifyDataSetChanged(); Flowable.create((FlowableOnSubscribe<String>) emitter -> { cityList = WeatherDB.loadCities(DBManager.getInstance().getDatabase(), selectedProvince.mProSort); for (City city : cityList) { emitter.onNext(city.mCityName); } emitter.onComplete(); }, BackpressureStrategy.BUFFER) .compose(RxUtil.ioF()) .compose(RxUtil.activityLifecycleF(this)) .doOnNext(proName -> dataList.add(proName)) .doOnComplete(() -> { currentLevel = LEVEL_CITY; mAdapter.notifyDataSetChanged(); mRecyclerView.smoothScrollToPosition(0); }) .subscribe(); } @Override public void onBackPressed() { if (currentLevel == LEVEL_PROVINCE) { quit(); } else { queryProvinces(); mRecyclerView.smoothScrollToPosition(0); } } public static void launch(Context context) { context.startActivity(new Intent(context, ChoiceCityActivity.class)); } @Override protected void onDestroy() { super.onDestroy(); DBManager.getInstance().closeDatabase(); } private void showTips() { new AlertDialog.Builder(this) .setTitle("多城市管理模式") .setMessage("您现在是多城市管理模式,直接点击即可新增城市.如果暂时不需要添加," + "在右上选项中关闭即可像往常一样操作.\n因为 api 次数限制的影响,多城市列表最多三个城市.(๑′ᴗ‵๑)") .setPositiveButton("明白", (dialog, which) -> dialog.dismiss()) .setNegativeButton("不再提示", (dialog, which) -> SharedPreferenceUtil.getInstance().putBoolean("Tips", false)) .show(); } private void quit() { ChoiceCityActivity.this.finish(); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } }