定时设置
【需求】
1.保存数据到xml文件中(数据包含:triggerTime开始时间、 day日期、 repeats是否重复、 power开关状态、 date系统时间、 mImageIndex图标编号、 sceneName场景名称)
2.上传分机
3.其他手机APP保持数据同步
【思路】
1.场景控制中,一个场景对应一个xml文件,文件名为ha_scene_n.xml
场景定时中,所有场景定时数据都保存在ha_task.xml task中的name值与场景文件名匹配(场景文件名==task中的name值,即对应该条的数据值)
2.提取场景文件中所需要的值(文件名,场景名,场景图标编号)统一保存到新的类 sceneTask中,传值给下一级界面
3.SceneTaskManager中负责场景列表的载入,对场景文件的校验
4.XmlToolSceneTask负责对xml文件的解析
【实现】
(1)定时设置管理 :SceneTaskManager
1.载入列表
2.校验场景与定时设置
3.保存文件
4.保存临时文件
5.保存真实文件
6设置sceneTask
7.根据传入的场景列表数据校验场景定时
/**
* 定时设置管理
*/
public class SceneTaskManager {
private static final String TAG = SceneTaskManager.class.getSimpleName();
/**
* 载入场景列表
*/
public static List<SceneTask> loadSceneTasks() {
LogUtils.v(TAG, "loadSceneTasks");
/*
* 定时设置文件的引入路径 filePath=.../smarthome/ha_task.xml
*/
String filePath = User.getInstance().getSmartDir() + File.separator + SmartHomeVer.FileName.SCENE_TASKS;
/*
* 如果该路径下不存在ha_task.xml文件,则从assets中拷贝ha_task.xml到该目录下
*/
if (!FileManager.fileIsExist(filePath)) {
LogUtils.w(TAG, "ha_task.xml not exists, copy from asset dir.");
FileManager.copyAssetFile(SmartHomeVer.FileName.SCENE_TASKS, filePath);
}
/*
* 1.声明一个封装数据的SceneTask对象
* 2.声明一个xml解析工具的对象
* 3.载入xml文件解析
* 4.将xml返回的list添加到SceneTask对象中
* 5.获取场景list
* 6.进行校验
* 7.返回校验后的list
*/
List<SceneTask> sceneTasksInXML = new ArrayList<SceneTask>();
try {
XmlToolSceneTask xmlToolSceneTask = new XmlToolSceneTask();
xmlToolSceneTask.load(filePath);
sceneTasksInXML.addAll(xmlToolSceneTask.getSceneTaskList());
LogUtils.v(TAG, "sceneTasksInXML.size " + sceneTasksInXML.size());
} catch (XmlPullParserException e) {
File file = new File(filePath);
file.delete();
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
List<Scene> mSceneList = SceneManager.loadScenes();
/*
* 校验
* 场景列表 定时场景列表
*/
List<SceneTask> mSceneTaskList = validSceneTask(mSceneList, sceneTasksInXML);
LogUtils.v(TAG, "mSceneTaskList.size " + mSceneTaskList.size());
return mSceneTaskList;
}
/*
* 保存文件(临时、真实)
*/
public static boolean save(final List<SceneTask> pSceneTaskList, final String saveFilePath) {
LogUtils.v(TAG, "save");
boolean saveSucc = false;
if (pSceneTaskList != null && !pSceneTaskList.isEmpty()) {
try {
XmlToolSceneTask mXmlToolSceneTask = new XmlToolSceneTask();
mXmlToolSceneTask.setSceneTaskList(pSceneTaskList);
mXmlToolSceneTask.store(saveFilePath);
saveSucc = true;
} catch (IOException e) {
e.printStackTrace();
}
}
LogUtils.v(TAG, "save result = " + saveSucc);
return saveSucc;
}
/*
* 保存临时文件
*/
public synchronized static boolean saveTemp(final List<SceneTask> pSceneTaskList) {
LogUtils.v(TAG, "saveTemp");
String tempFilePath = User.getInstance().getUserTempDir() + File.separator + SmartHomeVer.FileName.SCENE_TASKS;
return save(pSceneTaskList, tempFilePath);
}
/*
* 保存真实文件
*/
public synchronized static boolean save(final List<SceneTask> pSceneTaskList) {
LogUtils.v(TAG, "save");
String filePath = User.getInstance().getSmartDir() + File.separator + SmartHomeVer.FileName.SCENE_TASKS;
return save(pSceneTaskList, filePath);
}
/*
* 设置sceneTask
*/
public static List<SceneTask> setSceneTask(SceneTask pSceneTask) {
LogUtils.v(TAG, "setSceneTask");
List<SceneTask> mSceneTaskList = loadSceneTasks();
if (pSceneTask != null) {
// 如果存在,修改后返回
for (SceneTask sceneTask : mSceneTaskList) {
if (sceneTask.getName().equals(pSceneTask.getName())) {
sceneTask.setTriggerTime(pSceneTask.getTriggerTime());
sceneTask.setDay(pSceneTask.getDay());
sceneTask.setRepeats(pSceneTask.getRepeats());
sceneTask.setPower(pSceneTask.getPower());
sceneTask.setDate(pSceneTask.getDate());
return mSceneTaskList;
}
}
// 如果不存在,添加
mSceneTaskList.add(pSceneTask);
}
return mSceneTaskList;
}
/**
* 根据传入的场景列表数据校验场景定时
*/
public static List<SceneTask> validSceneTask(final List<Scene> pSceneList, final List<SceneTask> pSceneTaskList) {
LogUtils.v(TAG, "validSceneTask");
List<SceneTask> sceneTaskList = new ArrayList<SceneTask>();
if (pSceneList != null) {
for (Scene scene : pSceneList) {
/**
* 场景文件添加到 定时文件当中
* 场景的文件名 对应 场景定时的name
* 场景的name 对应 场景定时的SceneName
*/
SceneTask sceneTaskAdd = new SceneTask();
sceneTaskAdd.setImageIndex(scene.mImageIndex);
sceneTaskAdd.setSceneName(scene.getName());
sceneTaskAdd.setName(scene.getFileName());
sceneTaskAdd.setTriggerTime("0");
sceneTaskAdd.setDay("");
sceneTaskAdd.setRepeats("");
sceneTaskAdd.setPower("off");
sceneTaskAdd.setDate(DateUtils.getNow("yyyy-MM-dd hh:mm:ss"));
/**
* 场景定时如果不为空
* 场景定时的name与场景的文件名相匹配
* 则:对应属性的数据设置为sceneTask中get的数据
*/
if (pSceneTaskList != null) {
// 如果存在入参的定时列表中,获取相关信息
for (SceneTask sceneTask : pSceneTaskList) {
if (sceneTask.getName().equals(scene.getFileName())) {
sceneTaskAdd.setTriggerTime(sceneTask.getTriggerTime());
sceneTaskAdd.setDay(sceneTask.getDay());
sceneTaskAdd.setDate(sceneTask.getDate());
sceneTaskAdd.setRepeats(sceneTask.getRepeats());
sceneTaskAdd.setPower(sceneTask.getPower());
break;
}
}
}
sceneTaskList.add(sceneTaskAdd);
}
}
LogUtils.d(TAG, "validSceneTask.size " + sceneTaskList.size());
/*
* 返回list
*/
return sceneTaskList;
}
/**
* 根据传入的场景列表数据校验场景定时并保存XML文件
*/
public synchronized static void validSceneTaskInXML() {
LogUtils.v(TAG, "validSceneTaskInXML");
List<Scene> sceneList = SceneManager.loadScenes();
if (sceneList != null) {
List<SceneTask> sceneTasksInXML = new ArrayList<SceneTask>();
String filePath = User.getInstance().getSmartDir() + File.separator + SmartHomeVer.FileName.SCENE_TASKS;
try {
XmlToolSceneTask xmlToolSceneTask = new XmlToolSceneTask();
xmlToolSceneTask.load(filePath);
sceneTasksInXML.addAll(xmlToolSceneTask.getSceneTaskList());
LogUtils.v(TAG, "sceneTasksInXML.size " + sceneTasksInXML.size());
} catch (Exception e) {
e.printStackTrace();
}
// 校验
List<SceneTask> validSceneTasks = validSceneTask(sceneList, sceneTasksInXML);
LogUtils.d(TAG, "validSceneTask.size " + validSceneTasks.size());
// 保存到XML文件
save(validSceneTasks);
}
}
}
(2)xml文件的解析 XmlToolSceneTask
/**
* 场景定时XML文件
*/
public class XmlToolSceneTask {
private static final String TAG = "XmlToolSceneTask";
private List<SceneTask> mSceneTaskList = new ArrayList<SceneTask>();
private final String ENCODE_FORMAT = "utf-8";
/**
* 载入XML文件
*
* @param is
* @throws XmlPullParserException
* @throws IOException
*/
public void load(String filepath) throws XmlPullParserException, IOException {
File file = new File(filepath);
load(file);
}
/**
* 载入XML文件
*
* @param is
* @throws XmlPullParserException
* @throws IOException
*/
public void load(File file) throws XmlPullParserException, IOException {
LogUtils.v(TAG, "load");
InputStream is = new FileInputStream(file);
XmlPullParser parser = Xml.newPullParser();
SceneTask sceneTask = null;
parser.setInput(is, ENCODE_FORMAT);
// LogUtils.v(TAG, "*** parse start ***");
int event = parser.getEventType();// 产生第一个事件
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:// 判断当前事件是否是文档开始事件
// LogUtils.v(TAG, "START_DOCUMENT");
mSceneTaskList.clear();
break;
case XmlPullParser.START_TAG:// 判断当前事件是否是标签元素开始事件
// LogUtils.v(TAG, "START_TAG " + parser.getName());
if (SmartHomeVer.SceneTaskXmlAttr.TASK.equals(parser.getName())) {
sceneTask = new SceneTask();
sceneTask.setName(parser.getAttributeValue(null, SmartHomeVer.SceneTaskXmlAttr.NAME));
sceneTask.setTriggerTime(parser.getAttributeValue(null, SmartHomeVer.SceneTaskXmlAttr.TRIGGETTIME));
sceneTask.setDay(parser.getAttributeValue(null, SmartHomeVer.SceneTaskXmlAttr.DAY));
sceneTask.setRepeats(parser.getAttributeValue(null, SmartHomeVer.SceneTaskXmlAttr.REPEATS));
sceneTask.setPower(parser.getAttributeValue(null, SmartHomeVer.SceneTaskXmlAttr.POWER));
sceneTask.setDate(parser.getAttributeValue(null, SmartHomeVer.SceneTaskXmlAttr.DATE));
}
break;
case XmlPullParser.END_TAG: // 结束元素事件
// LogUtils.v(TAG, "END_TAG " + parser.getName());
if (SmartHomeVer.SceneTaskXmlAttr.TASK.equals(parser.getName())) {
mSceneTaskList.add(sceneTask);
}
break;
}
event = parser.next();
}
is.close();
}
/**
* 修改后的数据保存成XML文件
*
* @param filepath
* @throws IllegalArgumentException
* @throws IllegalStateException
* @throws IOException
*/
public void store(String filepath) throws IllegalArgumentException, IllegalStateException, IOException {
File file = new File(filepath);
file.setWritable(true);
XmlSerializer serializer = Xml.newSerializer();
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos, ENCODE_FORMAT);
serializer.startDocument(ENCODE_FORMAT, true);
serializer.startTag(null, SmartHomeVer.SceneTaskXmlAttr.TASKS);
/*
* 将sceneTask中封装的数据写入到xml文件中
* serializer.startTag(null, SmartHomeVer.SceneTaskXmlAttr.TASK);
* serializer.attribute(null, SmartHomeVer.SceneTaskXmlAttr.NAME, name == null ? "":name);
* serializer.endTag(null, SmartHomeVer.SceneTaskXmlAttr.TASK);
*/
for (SceneTask sceneTask : mSceneTaskList) {
sceneTask.writeToXml(serializer);
}
serializer.endTag(null, SmartHomeVer.SceneTaskXmlAttr.TASKS);
serializer.endDocument();
fos.flush();
fos.close();
}
public List<SceneTask> getSceneTaskList() {
return mSceneTaskList;
}
public void setSceneTaskList(List<SceneTask> mSceneTaskList) {
this.mSceneTaskList = mSceneTaskList;
}
}
(3)拷贝文件 copyAssetFile
/**
* 复制asset文件夹下的文件
*
* @param assetFilePath
* @param outputFilePath
*/
/*
* assetFilePath 拷贝的路径
* outputFilePath 拷贝后文件存放的路径
*/
public static void copyAssetFile(String assetFilePath, String outputFilePath) {
try {
InputStream mInputStream;
OutputStream mOutputStream = new FileOutputStream(outputFilePath);
mInputStream = CloudApplication.getAppContext().getAssets().open(assetFilePath);
byte[] buffer = new byte[1024];
int length = mInputStream.read(buffer);
while (length > 0) {
mOutputStream.write(buffer, 0, length);
length = mInputStream.read(buffer);
}
mOutputStream.flush();
mInputStream.close();
mOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
(4)定时设置界面 SceneTaskListActivity