package com.gizwits.opensource.devicecontrol.ui.activity; import java.util.List; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import com.gizwits.opensource.smartlight.R; import com.gizwits.opensource.devicecontrol.date.GosScheduleData; import com.gizwits.opensource.devicecontrol.tools.GetUTCTimeUtil; import com.gizwits.opensource.devicecontrol.tools.GosScheduleSiteTool; import com.gizwits.opensource.devicecontrol.tools.GosScheduleSiteTool.OnResponListener; import com.gizwits.opensource.devicecontrol.tools.GosScheduleSiteTool.OnResponseGetDeviceDate; import com.gizwits.opensource.devicecontrol.ui.adapter.GosScheduleListAdapter; import com.gizwits.opensource.devicecontrol.ui.adapter.GosScheduleListAdapter.DeleteButtonClickListener; import com.gizwits.opensource.devicecontrol.ui.adapter.GosScheduleListAdapter.ToggleButtonClickListener; import com.lidroid.xutils.DbUtils; import com.lidroid.xutils.DbUtils.DaoConfig; import com.lidroid.xutils.db.sqlite.Selector; import com.lidroid.xutils.db.sqlite.WhereBuilder; import com.lidroid.xutils.exception.DbException; import com.gizwits.opensource.devicecontrol.ui.adapter.SlideListView; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.TextView; public class GosScheduleListActivity extends GosDeviceControlModuleBaseActivity implements OnClickListener { private SlideListView slideListview; private GosScheduleListAdapter mAdapter; private GosScheduleSiteTool siteTool; private DbUtils dbUtils; private TextView tvNoRule; private View diverTop; private View diverBottom; private ImageView ivAdd; private ImageView ivBack; public enum handler_key { /** 在云端删除 */ DELETE, /** 在云端设置 */ SET, /** 在云端设置 失败 */ FAIL, } @SuppressLint("HandlerLeak") Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { handler_key key = handler_key.values()[msg.what]; switch (key) { case DELETE: upDateListViewUI(); break; case SET: upDateListViewUI(); myToast(R.string.site_schedule_success); break; case FAIL: upDateListViewUI(); myToast(R.string.site_schedule_fail); break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_comd_schedule_list); initDate(); initView(); initEvent(); } @Override protected void onResume() { super.onResume(); reflashDateOnSiteOrLocal(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_apm_add: // 点击添加按钮进入编辑界面 Intent intent = new Intent(this, GosScheduleEditDateAcitivty.class); intent.putExtra("position", -1); startActivity(intent); break; case R.id.iv_schedule_back: finish(); break; default: break; } } ////////////////////////////////////////////////////////////// //////////////////////////////////////////// // 注意这里的代码要移动到gosapplication中 private void initDate() { siteTool = new GosScheduleSiteTool(this, device, spf.getString("Token", "")); DbUtils.DaoConfig config = new DaoConfig(this); config.setDbName("gizwits"); config.setDbVersion(1); // db版本 dbUtils = DbUtils.create(config);// db还有其他的一些构造方法,比如含有更新表版本的监听器的DbUtils try { // 创建一张表 dbUtils.createTableIfNotExist(GosScheduleData.class); } catch (DbException e) { e.printStackTrace(); } GosScheduleData.setSiteTool(siteTool); GosScheduleData.setDbUtils(dbUtils); GosScheduleData.setContext(getApplicationContext()); setProgressDialog(getResources().getString(R.string.site_setting_time), true, false); } private void initEvent() { ivAdd.setOnClickListener(this); ivBack.setOnClickListener(this); } private void initView() { slideListview = (SlideListView) findViewById(R.id.slide_listView); slideListview.initSlideMode(SlideListView.MOD_RIGHT); tvNoRule = (TextView) findViewById(R.id.tv_no_rule); diverTop = (View) findViewById(R.id.vw_list_top_divider); diverBottom = (View) findViewById(R.id.vw_list_bottom_divider); ivAdd = (ImageView) findViewById(R.id.iv_apm_add); ivBack = (ImageView) findViewById(R.id.iv_schedule_back); } private void UpDataUI() { if (scheduleDates.size() > 0) { tvNoRule.setVisibility(View.GONE); slideListview.setVisibility(View.VISIBLE); diverTop.setVisibility(View.VISIBLE); diverBottom.setVisibility(View.VISIBLE); } else { tvNoRule.setVisibility(View.VISIBLE); slideListview.setVisibility(View.GONE); diverTop.setVisibility(View.GONE); diverBottom.setVisibility(View.GONE); } mAdapter = new GosScheduleListAdapter(scheduleDates, this, tbListener, deleListener); slideListview.setAdapter(mAdapter); slideListview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击栏目进入编辑 Intent intent = new Intent(GosScheduleListActivity.this, GosScheduleEditDateAcitivty.class); intent.putExtra("position", position); startActivity(intent); } }); } // 用户点击删除按钮 private DeleteButtonClickListener deleListener = new DeleteButtonClickListener() { @Override public void onclick(View v) { final int positon = (Integer) v.getTag(); final GosScheduleData tempDate = scheduleDates.get(positon); // 删除时候先判断该栏目是否已经在云端删除,如果已经在云端删除,则直接删除数据库 if (tempDate.isDeleteOnsite()) { deleInDateBaseAndUpdateUI(positon, tempDate); } else { // 在云端存在,则同时删除云端与数据库 siteTool.deleteTimeOnSite(tempDate.getRuleID(), new OnResponListener() { @Override public void OnRespon(int result, String arg0) { if (result == 0) { deleInDateBaseAndUpdateUI(positon, tempDate); } } }); } } private void deleInDateBaseAndUpdateUI(final int positon, final GosScheduleData tempDate) { // 删除数据库 try { dbUtils.delete(tempDate); } catch (DbException e) { e.printStackTrace(); } // 删除列表 scheduleDates.remove(positon); upDateListViewUI(); slideListview.slideBack(); } }; // 用户点击关闭按钮 private ToggleButtonClickListener tbListener = new ToggleButtonClickListener() { @Override public void onclick(View v) { final GosScheduleData tempDate = scheduleDates.get((Integer) v.getTag()); if (v.isSelected()) { // 打开状态变关闭 deleRuleOnSite(tempDate); } else { // 关闭状态变打开 setRuleOnSite(tempDate); } } }; private void reflashDateOnSiteOrLocal() { // 该用户是否第一次进入该页面,第一次进入则将其数据写入本地 if (spf.getBoolean("isFisrstLoad" + spf.getString("Uid", ""), true)) { // 显示等待栏 setProgressDialog(getResources().getString(R.string.reflashing_data), true, false); progressDialog.show(); siteTool.getTimeOnSite(new OnResponseGetDeviceDate() { @Override public void onReceviceDate(List<ConcurrentHashMap<String, Object>> dataList) { progressDialog.cancel(); if (dataList != null) { spf.edit().putBoolean("isFisrstLoad" + spf.getString("Uid", ""), false).commit(); writeToLocalDatabase(dataList); getDateFromDateBaseAndInitDate(); UpDataUI(); } else { myToast(R.string.updata_fail); finish(); } } }); } else { // 从本地数据库获取数据并赋值给存储的列表scheduleDates getDateFromDateBaseAndInitDate(); } // 更新ui UpDataUI(); } /** * Description:点击关闭按钮,在云端删除规则 * * @param tempDate */ private void deleRuleOnSite(GosScheduleData tempDate) { progressDialog.show(); tempDate.deleteOnSite(handler); } /** * Description:点击打开按钮,在云端创建规则 * * @param scheduleData */ protected void setRuleOnSite(GosScheduleData scheduleData) { progressDialog.show(); // 先判断有没有重复周数 if (scheduleData.getRepeat().equals("none")) { // 没有重复周数,当前时间晚于数据库记录时间,即数据库时间已经无效,需要设置为明天 if (scheduleData.isLocalTimeLaterThanSiteTime()) { if (scheduleData.isTvTimeLaterThanLocalTime()) { // 当前栏显示时间是否比当前的时间晚,是的话设置为今天,这个判断是防止多天后更改定时预约出错 scheduleData.setDateTimeToToday(scheduleData.getTvTime()); } else { scheduleData.setDateTimeToTomorrow(scheduleData.getTvTime()); } } else { // 当前时间早于数据库记录时间,即数据库时间已经有效,可以直接设置 } } scheduleData.setOnSite(handler); } private void getDateFromDateBaseAndInitDate() { String uid = spf.getString("Uid", ""); String did = device.getDid(); try { scheduleDates.clear(); scheduleDates = dbUtils.findAll( Selector.from(GosScheduleData.class).where("uid", "=", uid).and(WhereBuilder.b("did", "=", did))); } catch (DbException e) { e.printStackTrace(); } for (GosScheduleData i : scheduleDates) { i.setViewContent(); } } /** * Description:将云端信息写入到本地数据库 * * @param dataList */ @SuppressWarnings("unchecked") protected void writeToLocalDatabase(List<ConcurrentHashMap<String, Object>> dataList) { String uid = spf.getString("Uid", ""); for (ConcurrentHashMap<String, Object> map : dataList) { String date = (String) map.get("date"); String time = (String) map.get("time"); String repeat = (String) map.get("repeat"); String ruleID = (String) map.get("ruleID"); String did = (String) map.get("did"); ConcurrentHashMap<String, Object> dataMap = (ConcurrentHashMap<String, Object>) map.get("dataMap"); Boolean onOff = (Boolean) dataMap.get("Power_Switch"); GosScheduleData newDate = new GosScheduleData(); newDate.setUid(uid); newDate.setDid(did); newDate.setDate(date); newDate.setTime(time); newDate.setRepeat(repeat); setUserPickRepeat(time, repeat, newDate); newDate.setRuleID(ruleID); newDate.setOnOff(onOff); newDate.setDeleteOnsite(false); try { dbUtils.save(newDate); } catch (DbException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void setUserPickRepeat(String time, String repeat, GosScheduleData newDate) { if (repeat.equals("none")) { newDate.setUserPickRepeat("none"); } else { int tz = TimeZone.getDefault().getRawOffset() / 1000 / 60; String[] str = GetUTCTimeUtil.getLocalTimeFromUTC(time).split(":"); int tm = Integer.parseInt(str[0]) + Integer.parseInt(str[1]) * 60; if (tz > 0 && tz > tm) { newDate.setUserPickRepeat(wentFowardOneDay(repeat)); } else if (tz < 0 && tz < tm) { newDate.setUserPickRepeat(wentBackOneDay(repeat)); } else { newDate.setUserPickRepeat(repeat); } } } private void upDateListViewUI() { progressDialog.cancel(); mAdapter.setmList(scheduleDates); mAdapter.notifyDataSetChanged(); if (scheduleDates.size() == 0) { UpDataUI(); } } }