定时设置(界面适配器list、文件数据载入,校验,场景设置manager、xml的解析)

定时设置

【需求】

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值