package cn.scau.scautreasure.ui; import android.content.Intent; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; import com.devspark.appmsg.AppMsg; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Background; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.rest.RestService; import org.androidannotations.annotations.sharedpreferences.Pref; import org.springframework.web.client.HttpStatusCodeException; import java.util.ArrayList; import java.util.List; import cn.scau.scautreasure.AppContext; import cn.scau.scautreasure.R; import cn.scau.scautreasure.adapter.ClassAdapter; import cn.scau.scautreasure.adapter.ClassAdapter_; import cn.scau.scautreasure.adapter.ClassTableAdapter; import cn.scau.scautreasure.api.EdusysApi; import cn.scau.scautreasure.helper.ActionBarHelper; import cn.scau.scautreasure.helper.ClassHelper; import cn.scau.scautreasure.helper.UIHelper; import cn.scau.scautreasure.impl.OnTabSelectListener; import cn.scau.scautreasure.impl.ServerOnChangeListener; import cn.scau.scautreasure.model.ClassModel; import cn.scau.scautreasure.util.DateUtil; import cn.scau.scautreasure.widget.ClassTabWidget; import static cn.scau.scautreasure.helper.UIHelper.LISTVIEW_EFFECT_MODE.EXPANDABLE_ALPHA; /** * 课程表 * User: Special Leung * Date: 13-7-28 * Time: 下午11:09 * Mail: specialcyci@gmail.com */ @EFragment( R.layout.classtable ) @OptionsMenu ( R.menu.menu_classtable ) public class ClassTable extends CommonFragment implements ServerOnChangeListener, OnTabSelectListener, ActionBar.TabListener { @Pref cn.scau.scautreasure.AppConfig_ config; @RestService EdusysApi api; @ViewById ViewPager pager; @ViewById cn.scau.scautreasure.widget.ClassTabWidget_ titles; @ViewById SwipeRefreshLayout swipe_refresh; @ViewById WebView week_classtable; @ViewById LinearLayout day_classtable_container; @Bean DateUtil dateUtil; @Bean ClassHelper classHelper; private ArrayList<View> listViews; private ClassTableAdapter adapter; /** 课程表筛选显示模式 */ public static final int MODE_ALL = 0; public static final int MODE_PARAMS = 1; private String getTitle(){ StringBuilder builder = new StringBuilder(); builder.append(dateUtil.getWeekOfDate()); return builder.toString(); } private String getSubTitle(){ StringBuilder builder = new StringBuilder(); builder.append(getString(R.string.widget_week_start)); builder.append(classHelper.getSchoolWeek()); builder.append(getString(R.string.widget_week_end)); return builder.toString(); } // 由于全周课表还没有搞好,先注释了 // @AfterViews // void initActionBar(){ // // // 给 Action Bar 增加 "单日", "全周" 的切换 Tab。 // ActionBar actionBar = getSherlockActivity().getSupportActionBar(); // ActionBarHelper.enableEmbeddedTabs(actionBar); // // boolean isSelectedDay = config.classTableSelectedTab().get() == 0; // actionBar.addTab(actionBar.newTab() // .setText(app.getString(R.string.actionbar_tab_day)) // .setTabListener(this), // isSelectedDay); // actionBar.addTab(actionBar.newTab() // .setText(app.getString(R.string.actionbar_tab_week)) // .setTabListener(this), // !isSelectedDay // ); // actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // } @AfterViews void initView(){ listViews = new ArrayList<View>(); adapter = new ClassTableAdapter(); pager.setOffscreenPageLimit(3); pager.setOnPageChangeListener(onPageChangeListener); titles.setListener(onTabChangeListener); showClassTable(); showTab(); setSwipeRefresh(); // // week_classtable.getSettings().setJavaScriptEnabled(true); // week_classtable.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); // week_classtable.loadUrl("file:///android_asset/weekclasstable/weekclasstable.html"); // week_classtable.addJavascriptInterface(new WebWeekClasstableHelper(week_classtable, config, dateUtil, classHelper), "Android"); } private void setSwipeRefresh() { swipe_refresh.setEnabled(false); // 顶部刷新的样式 swipe_refresh.setColorScheme(R.color.swipe_refresh_1, R.color.swipe_refresh_2, R.color.swipe_refresh_3, R.color.swipe_refresh_4); } /** * 添加课程; */ @OptionsItem void menu_add_class(){ startActivityForResult(ClassEditor_.intent(getSherlockActivity()) .isNewClass(true) .model(new ClassModel()).get(), UIHelper.QUERY_FOR_EDIT_CLASS); } /** * 刷新课程菜单点击 */ @OptionsItem void menu_refresh_classtable() { if (app.eduSysPassword == null || app.eduSysPassword.equals("")){ Login_.intent(this).startTips(getString(R.string.start_tips_edusys)).start(); } else { swipe_refresh.setRefreshing(true); loadData(); } } /** * 切换到加载所有课程模式; */ @OptionsItem void menu_load_classtable_all(){ config.classTableShowMode().put(MODE_ALL); showClassTable(); } /** * 切换到智能加载课程模式; */ @OptionsItem void menu_load_classtable_with_params(MenuItem item){ config.classTableShowMode().put(MODE_PARAMS); showClassTable(); } /** * 星期标签的点击,同时viewPager设置到相应位置; */ private ClassTabWidget.onTabChangeListener onTabChangeListener = new ClassTabWidget.onTabChangeListener() { @Override public void change(int posistion) { pager.setCurrentItem(posistion); } }; /** * viewPager滑动监听,同时同步课程表上方的tab位置; */ private ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i2) { } @Override public void onPageSelected(int i) { titles.changeWeekDay(i); } @Override public void onPageScrollStateChanged(int i) { } }; /** * 修改课程表后,接收来自修改课程表activiy回传的model,写入数据库,并且更新到界面; * @param resultCode * @param data */ @OnActivityResult(UIHelper.QUERY_FOR_EDIT_CLASS) void modifyClassOnResult(int resultCode,Intent data){ if(resultCode == getSherlockActivity().RESULT_OK){ ClassModel model = (ClassModel) data.getSerializableExtra("class"); createOrUpdateClassInformation(model); } } /** * 线程添加或修改课程表信息 * @param model */ @Background void createOrUpdateClassInformation(ClassModel model){ classHelper.createOrUpdateLesson(model); showClassTable(); } /** * 线程删除课程; * @param model */ @Background public void deleteClass(ClassModel model){ classHelper.deleteLesson(model); showClassTable(); } /** * 使课程表上方的TAB移动到今天的位置,由于太早执行可能控件尚未绘制完成,导致getWidth() = 0, * 引发一系列BUG,这里延迟500ms执行; */ @UiThread(delay = 500) void showTab(){ int currentDay = dateUtil.getDayOfWeek() - 1; // 这句不能去掉,当日期为星期一时,就不重绘了,只有移动下它才重绘 if(currentDay == 0) titles.changeWeekDay(1); pager.setCurrentItem(currentDay); titles.changeWeekDay(currentDay); } /** * 展示网络加载异常结果 * @param ctx * @param requestCode */ @Override @UiThread void showErrorResult(ActionBarActivity ctx, int requestCode){ swipe_refresh.setRefreshing(false); if(requestCode == 404){ AppMsg.makeText(ctx, R.string.tips_classtable_null, AppMsg.STYLE_ALERT).show(); }else{ app.showError(requestCode,ctx); } } @UiThread void showSuccess(){ AppMsg.makeText(getSherlockActivity(), "课表更新完成" , AppMsg.STYLE_INFO).show(); } @UiThread void closeSwipeRefresh(){ swipe_refresh.setRefreshing(false); } /** * 展示课程表,同时将课程表切换到今天. */ @UiThread() void showClassTable(){ // 以下是刷新日课表; int prevPosition = pager.getCurrentItem(); UIHelper.getDialog().dismiss(); listViews.clear(); for (int i = 1; i <= 7; i++) { List<ClassModel> dayClassList = null; String chineseDay = dateUtil.numDayToChinese(i); if(config.classTableShowMode().get() == MODE_ALL){ dayClassList = classHelper.getDayLesson(chineseDay); }else{ dayClassList = classHelper.getDayLessonWithParams(chineseDay); } buildDayClassTableAdapter(dayClassList); } adapter.setViewList(listViews); pager.setAdapter(adapter); adapter.notifyDataSetChanged(); pager.setCurrentItem(prevPosition); onTabSelect(); // 以下是刷新全周课表 week_classtable.reload(); } private void buildDayClassTableAdapter(List<ClassModel> dayClassList){ ListView classListView = UIHelper.buildClassListView(getSherlockActivity()); ClassAdapter cAdapter = ClassAdapter_.getInstance_(getSherlockActivity()); BaseAdapter _adapter = UIHelper.buildEffectAdapter(cAdapter, (AbsListView) classListView,EXPANDABLE_ALPHA); cAdapter.addAll(dayClassList); cAdapter.setFragment(this); classListView.setAdapter(_adapter); listViews.add(classListView); } /** * 线程从服务器加载课程表,同时保存在本地数据库,再行操作; */ @Background( id = UIHelper.CANCEL_FLAG ) void loadData(Object... params) { try{ ClassModel.ClassList l = api.getClassTable(AppContext.userName, app.getEncodeEduSysPassword(), AppContext.server); config.termStartDate().put(l.getTermStartDate()); // save data in sqlite; classHelper.replaceAllLesson(l.getClasses()); showSuccess(); showClassTable(); showTab(); }catch (HttpStatusCodeException e){ showErrorResult(getSherlockActivity(), e.getStatusCode().value(), this); }catch (Exception e){ handleNoNetWorkError(getSherlockActivity()); } closeSwipeRefresh(); } @Override public void onChangeServer() { menu_refresh_classtable(); } // 横竖屏切换到额时候,重新绘制课程表日期下划线. @UiThread(delay = 300) void updateTabOnOrientationChange(){ titles.changeWeekDay(pager.getCurrentItem()); ActionBarHelper.enableEmbeddedTabs(getSherlockActivity().getSupportActionBar()); } @Override public void onConfigurationChanged(android.content.res.Configuration newConfig) { super.onConfigurationChanged(newConfig); updateTabOnOrientationChange(); } /* * --------------------------------------------------------- * 底部 Tab 选择切换区域; * --------------------------------------------------------- */ @Override public void onTabSelect() { setTitle(getTitle()); setSubTitle(getSubTitle()); // getSherlockActivity().getSupportActionBar() // .setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); } /* * --------------------------------------------------------- * Action Bar Tab 选择切换区域; * --------------------------------------------------------- */ @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { if ( tab.getPosition() == 0 ){ week_classtable.setVisibility(View.GONE); day_classtable_container.setVisibility(View.VISIBLE); } else if ( tab.getPosition() == 1 ) { week_classtable.setVisibility(View.VISIBLE); day_classtable_container.setVisibility(View.GONE); } // 储存用户当前选择的 Tab ; config.classTableSelectedTab().put(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } }