main
LiRen-qiu 7 months ago
parent 1c1e4feae9
commit 87ef898843

@ -38,90 +38,105 @@
\@writefile{toc}{\contentsline {section}{\numberline {3}小米便签的代码维护}{19}{section.3}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3}小米便签的代码维护}{19}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}维护的内容}{19}{subsection.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.1}维护的内容}{19}{subsection.3.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces 维护内容列表}}{19}{table.3}\protected@file@percent } \@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces 维护内容列表}}{19}{table.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}开源软件维护后所产生的设计}{20}{subsection.3.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2}开源软件维护后所产生的设计}{21}{subsection.3.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces 维护后的小米便签的包图}}{21}{figure.caption.11}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces 维护后的小米便签的类图}}{21}{figure.caption.11}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}类解释}{22}{subsubsection.3.2.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}类解释}{21}{subsubsection.3.2.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces 维护后的小米便签的架构图}}{23}{figure.caption.12}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{1. Activity 类的继承层次结构}{21}{section*.12}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}架构解释}{24}{subsubsection.3.2.2}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{2. 笔记列表相关类}{22}{section*.13}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}维护代码数量以及质量情况}{25}{subsection.3.3}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{3. 密码管理功能类}{22}{section*.14}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.1}维护代码数量}{25}{subsubsection.3.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{4. 第三方服务和工具类}{23}{section*.15}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces 维护之前xml文件数量}}{25}{figure.caption.13}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{5. 语音识别和语音合成相关类}{23}{section*.16}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces 维护之前java文件数量}}{25}{figure.caption.14}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{6. 通用对话框类}{23}{section*.17}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces 维护之后xml文件数量}}{25}{figure.caption.15}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{7. 类之间的关系}{23}{section*.18}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces 维护之后java文件数量}}{26}{figure.caption.16}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{总结}{24}{section*.19}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces 维护前后java文件数量对比——柱状图}}{26}{figure.caption.17}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces 维护后的小米便签的架构图}}{25}{figure.caption.20}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces 维护前后xml文件数量对比——柱状图}}{26}{figure.caption.18}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}架构解释}{26}{subsubsection.3.2.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces 维护前后java文件数量对比——饼状图}}{27}{figure.caption.19}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{1. 界面层UI Layer}{26}{section*.21}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {19}{\ignorespaces 维护前后xml文件数量对比——饼状图}}{27}{figure.caption.20}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{2. 第三方 API 层Third-party API Layer}{26}{section*.22}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {20}{\ignorespaces 维护前后代码数量对比——柱状图}}{28}{figure.caption.21}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{3. 业务层Business Layer}{26}{section*.23}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {21}{\ignorespaces 维护前后代码数量对比——饼状图}}{28}{figure.caption.22}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{4. 模型层Model Layer}{27}{section*.24}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.2}维护后的质量分析}{29}{subsubsection.3.3.2}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{5. 数据层Data Layer}{27}{section*.25}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {22}{\ignorespaces 代码审查结果}}{29}{figure.caption.23}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{总体架构特性总结}{27}{section*.26}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {23}{\ignorespaces 代码审查结果}}{30}{figure.caption.24}\protected@file@percent } \@writefile{toc}{\contentsline {paragraph}{适用场景和优势}{27}{section*.27}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}维护代码数量以及质量情况}{28}{subsection.3.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.1}维护代码数量}{28}{subsubsection.3.3.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces 维护之前xml文件数量}}{28}{figure.caption.28}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces 维护之前java文件数量}}{28}{figure.caption.29}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces 维护之后xml文件数量}}{28}{figure.caption.30}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces 维护之后java文件数量}}{29}{figure.caption.31}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces 维护前后java文件数量对比——柱状图}}{29}{figure.caption.32}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces 维护前后xml文件数量对比——柱状图}}{29}{figure.caption.33}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces 维护前后java文件数量对比——饼状图}}{30}{figure.caption.34}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {19}{\ignorespaces 维护前后xml文件数量对比——饼状图}}{30}{figure.caption.35}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {20}{\ignorespaces 维护前后代码数量对比——柱状图}}{31}{figure.caption.36}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {21}{\ignorespaces 维护前后代码数量对比——饼状图}}{31}{figure.caption.37}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.2}维护后的质量分析}{32}{subsubsection.3.3.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {22}{\ignorespaces 代码审查结果}}{32}{figure.caption.38}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {23}{\ignorespaces 代码审查结果}}{33}{figure.caption.39}\protected@file@percent }
\gdef \LT@iv {\LT@entry \gdef \LT@iv {\LT@entry
{1}{85.35156pt}\LT@entry {1}{85.35156pt}\LT@entry
{1}{60.77263pt}\LT@entry {1}{60.77263pt}\LT@entry
{1}{326.8pt}} {1}{326.8pt}}
\@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces 代码质量分析详细结果}}{31}{table.4}\protected@file@percent } \@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces 代码质量分析详细结果}}{34}{table.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}维护后的软件原型以及功能展示}{33}{subsection.3.4}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.4}维护后的软件原型以及功能展示}{36}{subsection.3.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.1}设置界面背景}{33}{subsubsection.3.4.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.1}设置界面背景}{36}{subsubsection.3.4.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {24}{\ignorespaces 设置背景1}}{33}{figure.caption.25}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {24}{\ignorespaces 设置背景1}}{36}{figure.caption.40}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {25}{\ignorespaces 设置背景按钮}}{33}{figure.caption.25}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {25}{\ignorespaces 设置背景按钮}}{36}{figure.caption.40}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {26}{\ignorespaces 设置背景2}}{33}{figure.caption.25}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {26}{\ignorespaces 设置背景2}}{36}{figure.caption.40}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.2}欢迎界面}{34}{subsubsection.3.4.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.2}欢迎界面}{37}{subsubsection.3.4.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {27}{\ignorespaces 欢迎界面}}{34}{figure.caption.26}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {27}{\ignorespaces 欢迎界面}}{37}{figure.caption.41}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.3}登录密码}{35}{subsubsection.3.4.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.3}登录密码}{38}{subsubsection.3.4.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {28}{\ignorespaces 新增设置密码的操作}}{35}{figure.caption.27}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {28}{\ignorespaces 新增设置密码的操作}}{38}{figure.caption.42}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {29}{\ignorespaces 新增密码后的登录界面,要求输入密码}}{36}{figure.caption.28}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {29}{\ignorespaces 新增密码后的登录界面,要求输入密码}}{39}{figure.caption.43}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {30}{\ignorespaces 重新设置密码}}{37}{figure.caption.29}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {30}{\ignorespaces 重新设置密码}}{40}{figure.caption.44}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {31}{\ignorespaces 使用原有的密码登录失败}}{38}{figure.caption.30}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {31}{\ignorespaces 使用原有的密码登录失败}}{41}{figure.caption.45}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces 删除设置的密码}}{39}{figure.caption.31}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {32}{\ignorespaces 删除设置的密码}}{42}{figure.caption.46}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {33}{\ignorespaces 登录密码的时序图}}{40}{figure.caption.32}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {33}{\ignorespaces 登录密码的时序图}}{43}{figure.caption.47}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.4}翻译功能}{41}{subsubsection.3.4.4}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.4}翻译功能}{44}{subsubsection.3.4.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {34}{\ignorespaces 翻译功能中的将英文翻译为中文}}{41}{figure.caption.33}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {34}{\ignorespaces 翻译功能中的将英文翻译为中文}}{44}{figure.caption.48}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {35}{\ignorespaces 翻译功能中将中文转化为英文}}{42}{figure.caption.34}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {35}{\ignorespaces 翻译功能中将中文转化为英文}}{45}{figure.caption.49}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {36}{\ignorespaces 翻译功能中的还原操作}}{43}{figure.caption.35}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {36}{\ignorespaces 翻译功能中的还原操作}}{46}{figure.caption.50}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {37}{\ignorespaces 翻译功能的时序图}}{44}{figure.caption.36}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {37}{\ignorespaces 翻译功能的时序图}}{47}{figure.caption.51}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.5}插入图片}{45}{subsubsection.3.4.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.5}插入图片}{48}{subsubsection.3.4.5}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {38}{\ignorespaces 将本地相册中的图片导入便签编辑界面中}}{45}{figure.caption.37}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {38}{\ignorespaces 将本地相册中的图片导入便签编辑界面中}}{48}{figure.caption.52}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.6}统计字符个数}{46}{subsubsection.3.4.6}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.6}统计字符个数}{49}{subsubsection.3.4.6}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {39}{\ignorespaces 统计字符个数}}{46}{figure.caption.38}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {39}{\ignorespaces 统计字符个数}}{49}{figure.caption.53}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.7}富文本功能}{47}{subsubsection.3.4.7}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.7}富文本功能}{50}{subsubsection.3.4.7}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {40}{\ignorespaces 富文本功能}}{47}{figure.caption.39}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {40}{\ignorespaces 富文本功能}}{50}{figure.caption.54}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {41}{\ignorespaces 加粗功能}}{47}{figure.caption.40}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {41}{\ignorespaces 加粗功能}}{50}{figure.caption.55}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {42}{\ignorespaces 斜体功能}}{47}{figure.caption.41}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {42}{\ignorespaces 斜体功能}}{50}{figure.caption.56}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {43}{\ignorespaces 删除线功能}}{48}{figure.caption.42}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {43}{\ignorespaces 删除线功能}}{51}{figure.caption.57}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {44}{\ignorespaces 高亮功能}}{48}{figure.caption.43}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {44}{\ignorespaces 高亮功能}}{51}{figure.caption.58}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.8}朗读功能}{49}{subsubsection.3.4.8}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.8}朗读功能}{52}{subsubsection.3.4.8}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {45}{\ignorespaces 朗读功能}}{49}{figure.caption.44}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {45}{\ignorespaces 朗读功能}}{52}{figure.caption.59}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.9}私密模式}{50}{subsubsection.3.4.9}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.9}私密模式}{53}{subsubsection.3.4.9}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {46}{\ignorespaces 私密模式}}{50}{figure.caption.45}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {46}{\ignorespaces 私密模式}}{53}{figure.caption.60}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {47}{\ignorespaces 退出私密模式}}{51}{figure.caption.46}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {47}{\ignorespaces 退出私密模式}}{54}{figure.caption.61}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.10}笔记编辑内搜索}{52}{subsubsection.3.4.10}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.10}笔记编辑内搜索}{55}{subsubsection.3.4.10}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {48}{\ignorespaces 笔记内搜索}}{52}{figure.caption.47}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {48}{\ignorespaces 笔记内搜索}}{55}{figure.caption.62}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {49}{\ignorespaces 笔记内搜索}}{53}{figure.caption.48}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {49}{\ignorespaces 笔记内搜索}}{56}{figure.caption.63}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.11}模板便签}{54}{subsubsection.3.4.11}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.11}模板便签}{57}{subsubsection.3.4.11}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {50}{\ignorespaces 模板便签(a)}}{54}{figure.caption.49}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {50}{\ignorespaces 模板便签(a)}}{57}{figure.caption.64}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {51}{\ignorespaces 模板便签(b)}}{54}{figure.caption.49}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {51}{\ignorespaces 模板便签(b)}}{57}{figure.caption.64}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.12}语音听写}{55}{subsubsection.3.4.12}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.12}语音听写}{58}{subsubsection.3.4.12}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {52}{\ignorespaces 语音听写(a)}}{55}{figure.caption.50}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {52}{\ignorespaces 语音听写(a)}}{58}{figure.caption.65}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {53}{\ignorespaces 语音听写(b)}}{55}{figure.caption.50}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {53}{\ignorespaces 语音听写(b)}}{58}{figure.caption.65}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {54}{\ignorespaces 语音听写的时序图}}{56}{figure.caption.51}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {54}{\ignorespaces 语音听写的时序图}}{59}{figure.caption.66}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.13}语音合成}{57}{subsubsection.3.4.13}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.13}语音合成}{60}{subsubsection.3.4.13}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {55}{\ignorespaces 语音合成}}{57}{figure.caption.52}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {55}{\ignorespaces 语音合成}}{60}{figure.caption.67}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {56}{\ignorespaces 语音类型}}{58}{figure.caption.53}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {56}{\ignorespaces 语音类型}}{61}{figure.caption.68}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {57}{\ignorespaces 音频类型}}{58}{figure.caption.53}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {57}{\ignorespaces 音频类型}}{61}{figure.caption.68}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {58}{\ignorespaces 语音合成的时序图}}{59}{figure.caption.54}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {58}{\ignorespaces 语音合成的时序图}}{62}{figure.caption.69}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.14}对话式大模型}{60}{subsubsection.3.4.14}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.14}对话式大模型}{63}{subsubsection.3.4.14}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {59}{\ignorespaces 对话式大模型}}{60}{figure.caption.55}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {59}{\ignorespaces 对话式大模型}}{63}{figure.caption.70}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {60}{\ignorespaces 对话式大模型的流程图}}{61}{figure.caption.56}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {60}{\ignorespaces 对话式大模型的流程图}}{64}{figure.caption.71}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {61}{\ignorespaces 对话式大模型的时序图}}{62}{figure.caption.57}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {61}{\ignorespaces 对话式大模型的时序图}}{65}{figure.caption.72}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.15}撤回功能}{63}{subsubsection.3.4.15}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.15}撤回功能}{66}{subsubsection.3.4.15}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {62}{\ignorespaces 撤回功能}}{63}{figure.caption.58}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {62}{\ignorespaces 撤回功能}}{66}{figure.caption.73}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.16}获取地理位置}{64}{subsubsection.3.4.16}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.16}获取地理位置}{67}{subsubsection.3.4.16}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {63}{\ignorespaces 获取地理位置}}{64}{figure.caption.59}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {63}{\ignorespaces 获取地理位置}}{67}{figure.caption.74}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {64}{\ignorespaces 清除地理位置}}{64}{figure.caption.59}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {64}{\ignorespaces 清除地理位置}}{67}{figure.caption.74}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}实践收获和体会}{64}{section.4}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}实践收获和体会}{67}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}收获}{64}{subsection.4.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.1}收获}{67}{subsection.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}体会}{65}{subsection.4.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.2}体会}{68}{subsection.4.2}\protected@file@percent }
\gdef \@abspage@last{65} \gdef \@abspage@last{68}

@ -534,19 +534,85 @@ Gtask包用于存放与数据更新同步检测异常相关的类和方法
\footnotesize 16 &新增功能 & \footnotesize 获取地理位置 & \footnotesize 一些软件需要获取地理位置权限才可以正常运行,为小米便签植入获取地理位置的功能,可以帮助用户及时定位自己的位置。 \\ \footnotesize 16 &新增功能 & \footnotesize 获取地理位置 & \footnotesize 一些软件需要获取地理位置权限才可以正常运行,为小米便签植入获取地理位置的功能,可以帮助用户及时定位自己的位置。 \\
\end{longtable} \end{longtable}
\newpage
\subsection{开源软件维护后所产生的设计} \subsection{开源软件维护后所产生的设计}
\noindent维护后的小米便签主要增加和更改类的类图见图10,维护后产生的体系架构图见图11。 \noindent维护后的小米便签主要增加和更改类的类图见图10,维护后产生的体系架构图见图11。
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.1\textwidth]{picture/packet.png} \includegraphics[width=1.0\textwidth]{picture/packet.png}
\caption{维护后的小米便签的} \caption{维护后的小米便签的}
\end{figure} \end{figure}
\newpage
\subsubsection{类解释} \subsubsection{类解释}
此类图展示了项目中的主要类及其相互关系。项目采用了模块化设计,每个类负责特定的功能,同时通过接口和继承实现代码的复用和扩展性。以下是对主要类的详细解释:
\paragraph{1. Activity 类的继承层次结构}
\begin{itemize}
\item \textbf{Activity}: 这是Android框架的核心组件多个自定义Activity类继承自 \texttt{Activity}
\item \textbf{SplashActivity}: 实现了应用启动界面,持有一个 \texttt{Handler} 对象,用于处理异步任务和延时操作。
\item \textbf{NotesListActivity}: 显示笔记列表的主界面,核心字段包括:
\begin{itemize}
\item \texttt{background}: 用于管理背景显示。
\item \texttt{secret\_mode}: 一个整数,用于标识是否处于加密模式。
\item \texttt{mState}\texttt{mNotesListAdapter}: 分别用于记录当前界面的状态和管理笔记列表的适配器。
\end{itemize}
它通过方法 \texttt{initResources()} 初始化资源,并处理按钮点击事件 (\texttt{onClick(View)} 方法)。
\item \textbf{NotesPreferenceActivity}: 用于管理应用的设置选项,持有 \texttt{SharedPreferences} 对象以存储用户设置。
\item \textbf{NoteEditActivity}: 提供对笔记内容的编辑功能,字段包括:
\begin{itemize}
\item \texttt{mHeadViewPanel}\texttt{mNoteBgColorSelector}: 分别用于界面头部视图和背景颜色选择器。
\item \texttt{mNoteEditor}\texttt{mWorkingNote}: 分别表示编辑框和当前正在编辑的笔记。
\end{itemize}
它还支持语音合成功能(通过字段 \texttt{mTTS: TextToSpeech} 实现),并重写 \texttt{onCreate(Bundle)}\texttt{onClick(View)} 方法处理界面初始化和点击事件。
\end{itemize}
\paragraph{2. 笔记列表相关类}
\begin{itemize}
\item \textbf{NotesListItem}\textbf{NoteItemData}: 这两个类分别用于表示笔记列表中的单个条目及其具体数据。通过对象之间的组合关系,\texttt{NotesListItem} 可以获取并管理 \texttt{NoteItemData}
\item \textbf{NotesListAdapter}: 用于适配笔记列表到用户界面。其主要字段包括 \texttt{mContext}(上下文对象)和 \texttt{mNoteDataList}(笔记列表数据数组)。它通过 \texttt{getView()} 方法为每个笔记条目生成对应的视图。
\end{itemize}
\paragraph{3. 密码管理功能类}
\begin{itemize}
\item \textbf{SetPassword}: 负责设置密码,其字段包括 \texttt{mPassword},并提供 \texttt{setPassword(String)} 方法设置新密码。
\item \textbf{ChangePassword}: 允许用户更改密码,核心字段包括 \texttt{mOldPassword}\texttt{mNewPassword},方法 \texttt{changePassword(String, String)} 用于实现密码的更新。
\item \textbf{DeletePassword}: 提供删除密码的功能,通过方法 \texttt{deletePassword()} 实现。
\end{itemize}
\paragraph{4. 第三方服务和工具类}
\begin{itemize}
\item \textbf{BaiduTranslateService}: 封装百度翻译API的调用提供方法 \texttt{translate()}\texttt{getTranslateResult()} 实现翻译功能。
\item \textbf{MD5Utils}: 提供生成MD5哈希值的工具方法 \texttt{getMD5Code()},可能用于对密码或文件进行加密校验。
\item \textbf{XmlParser}: 处理 XML 数据解析的工具类,方法 \texttt{parseXmlResult()} 用于解析返回的字符串数据。
\item \textbf{FucUtil}: 提供通用文件管理功能,包括 \texttt{copyFile()} 方法。
\end{itemize}
\paragraph{5. 语音识别和语音合成相关类}
\begin{itemize}
\item \textbf{IATActivity}\textbf{IflytekActivity}: 处理语音输入功能,通过字段 \texttt{mIat: SpeechRecognizer} 初始化语音识别功能 (\texttt{initSpeech()} 方法)。
\item \textbf{TtsDemo}\textbf{TtsSettings}: 提供语音合成功能,其核心方法 \texttt{initSpeechSynthesizer()} 用于初始化语音合成引擎。
\item \textbf{SpeechApp}: 用作全局应用类,管理与语音相关的初始化参数,如 \texttt{PRIVACY\_KEY}\texttt{msInitialize}
\end{itemize}
\paragraph{6. 通用对话框类}
\begin{itemize}
\item \textbf{DateTimePickerDialog}: 提供日期和时间选择功能,通常用于笔记的创建或修改时间管理。
\end{itemize}
\paragraph{7. 类之间的关系}
\begin{itemize}
\item \textbf{继承关系}: 多个Activity类继承自Android框架的 \texttt{Activity} 类(如 \texttt{NotesListActivity}\texttt{NoteEditActivity})。
\item \textbf{组合关系}: 类之间通过组合关系实现模块化,例如 \texttt{NotesListAdapter} 组合了 \texttt{NoteItemData} 以生成笔记列表视图。
\item \textbf{关联关系}: \texttt{NoteEditActivity} 通过字段和方法调用与 \texttt{BaiduTranslateService}\texttt{MD5Utils} 等类进行功能交互。
\item \textbf{接口实现}: 部分类(如 \texttt{NotesListActivity}\texttt{NoteEditActivity})通过实现接口(如 \texttt{OnClickListener})来处理用户交互事件。
\end{itemize}
\paragraph{总结}
类图中的模块设计体现了单一职责原则SRP通过继承和组合的方式实现了代码复用与模块化。各个类的功能划分清晰既包括核心的笔记管理功能\texttt{NotesListActivity}\texttt{NoteEditActivity}又包含工具类和第三方API集成模块\texttt{BaiduTranslateService}\texttt{XmlParser})。整体架构设计合理,具有良好的可扩展性和可维护性。
\newpage \newpage
\begin{figure}[H] \begin{figure}[H]
@ -557,7 +623,71 @@ Gtask包用于存放与数据更新同步检测异常相关的类和方法
\newpage \newpage
\subsubsection{架构解释} \subsubsection{架构解释}
如图11所示本项目架构合理针对代码量较小、与原有类耦合性较强的功能代码如某些控件撤回、插入图片等等功能的响应函数直接在原有类的基础上进行修改针对与原有类耦合性较低的模块如引用第三方API的功能模块则考虑单独构建一个包以及某些类如SparkChain、SpeechApp中的IatSettings、IflytekActivity等
该项目采用分层架构设计,各层职责明确,模块化程度高。这种架构提高了代码的可读性、可维护性和可扩展性。以下是各层的详细解释:
\paragraph{1. 界面层UI Layer}
界面层负责用户界面的显示和交互,主要包含以下模块:
\begin{itemize}
\item \textbf{ui}: 实现具体的界面功能,如 \texttt{Activity}\texttt{Fragment},用于响应用户操作。
\item \textbf{res}: 包含资源文件(如布局文件、图片、字符串资源等),通过 \texttt{R} 类引用。
\item \textbf{widget}: 提供自定义控件或组件,用于增强 UI 的可复用性或满足特定的 UI 需求。
\end{itemize}
\textbf{连接}:界面层通过调用业务层获取数据并渲染到 UI 中,\texttt{widget} 模块可能直接与业务层交互以更新自定义组件的行为。
\paragraph{2. 第三方 API 层Third-party API Layer}
该层主要负责与外部第三方服务或库的交互,包含以下模块:
\begin{itemize}
\item \textbf{speech}: 封装与语音识别或语音合成相关的第三方 API。
\item \textbf{translate\_demo}: 调用第三方翻译服务(如 Google Translate 或其他翻译 API
\item \textbf{SparkChain}: 处理区块链相关操作的模块,可能用于数据记录、身份验证或交易管理。
\end{itemize}
\textbf{连接}:第三方 API 层通过封装对外部 API 的调用,为业务层提供统一接口,避免业务逻辑直接依赖第三方库。
\paragraph{3. 业务层Business Layer}
业务层负责实现核心的应用逻辑和功能,主要包含以下模块:
\begin{itemize}
\item \textbf{tool}: 提供通用工具类和辅助功能,例如数据格式转换、日志工具等。
\item \textbf{gtask.remote}: 处理远程通信,例如通过网络请求与后端服务器交互(可能使用 \texttt{Retrofit}\texttt{OkHttp})。
\item \textbf{gtask.exception}: 用于定义和处理全局异常,确保应用中错误管理的一致性。
\end{itemize}
\textbf{连接}:业务层从第三方 API 层获取数据,处理后传递给界面层或模型层。同时,\texttt{exception} 模块与 \texttt{remote} 模块紧密结合,统一处理网络或业务逻辑中的异常。
\paragraph{4. 模型层Model Layer}
模型层定义和操作核心数据结构,主要包含以下模块:
\begin{itemize}
\item \textbf{model}: 定义应用中的核心数据模型,例如用于表示用户、商品或订单的 Java 或 Kotlin 类。
\item \textbf{gtask.data}: 管理本地数据或缓存,例如 \texttt{SQLite} 数据库、\texttt{SharedPreferences}\texttt{Room} 框架。
\end{itemize}
\textbf{连接}:模型层为业务层和界面层提供统一接口,通过封装数据操作实现与其他层的解耦。
\paragraph{5. 数据层Data Layer}
数据层负责存储和管理应用程序的数据,包含以下模块:
\begin{itemize}
\item \textbf{data}: 封装了数据的持久化操作,例如数据库管理(如 SQL、\texttt{Room ORM})或文件系统管理。
\end{itemize}
\textbf{连接}:数据层通过模型层提供数据接口,将数据存储到本地或从本地读取,并向业务层提供支持。
\paragraph{总体架构特性总结}
\begin{itemize}
\item \textbf{分层解耦}:每一层职责明确,界面层专注于用户交互,业务层专注于逻辑处理,数据层专注于数据管理。
\item \textbf{模块化设计}:各层进一步划分为多个模块(如 \texttt{tool}\texttt{gtask.remote}),增强了代码的复用性和维护性。
\item \textbf{良好的扩展性}:通过第三方 API 层封装,便于未来替换或增加新的第三方服务(如增加新的翻译 API
\item \textbf{异常管理}:在业务层中通过 \texttt{gtask.exception} 模块统一处理异常,提升了应用的稳定性。
\item \textbf{清晰的数据流向}:从数据层到界面层,数据流向清晰明确,各层通过特定接口交互,避免直接依赖。
\end{itemize}
\paragraph{适用场景和优势}
\begin{itemize}
\item 适用于中大型 Android 项目,尤其是需要与多个第三方服务交互的场景(如语音识别、多语言翻译等)。
\item 便于团队协作:不同开发者可以分别专注于某一层的开发,减少冲突和耦合。
\item 易于测试:每一层都可以独立进行单元测试,例如测试业务逻辑或第三方 API 的封装。
\end{itemize}
\newpage \newpage

@ -7,29 +7,44 @@
\contentsline {section}{\numberline {2}小米便签的代码标注}{15}{section.2}% \contentsline {section}{\numberline {2}小米便签的代码标注}{15}{section.2}%
\contentsline {section}{\numberline {3}小米便签的代码维护}{19}{section.3}% \contentsline {section}{\numberline {3}小米便签的代码维护}{19}{section.3}%
\contentsline {subsection}{\numberline {3.1}维护的内容}{19}{subsection.3.1}% \contentsline {subsection}{\numberline {3.1}维护的内容}{19}{subsection.3.1}%
\contentsline {subsection}{\numberline {3.2}开源软件维护后所产生的设计}{20}{subsection.3.2}% \contentsline {subsection}{\numberline {3.2}开源软件维护后所产生的设计}{21}{subsection.3.2}%
\contentsline {subsubsection}{\numberline {3.2.1}类解释}{22}{subsubsection.3.2.1}% \contentsline {subsubsection}{\numberline {3.2.1}类解释}{21}{subsubsection.3.2.1}%
\contentsline {subsubsection}{\numberline {3.2.2}架构解释}{24}{subsubsection.3.2.2}% \contentsline {paragraph}{1. Activity 类的继承层次结构}{21}{section*.12}%
\contentsline {subsection}{\numberline {3.3}维护代码数量以及质量情况}{25}{subsection.3.3}% \contentsline {paragraph}{2. 笔记列表相关类}{22}{section*.13}%
\contentsline {subsubsection}{\numberline {3.3.1}维护代码数量}{25}{subsubsection.3.3.1}% \contentsline {paragraph}{3. 密码管理功能类}{22}{section*.14}%
\contentsline {subsubsection}{\numberline {3.3.2}维护后的质量分析}{29}{subsubsection.3.3.2}% \contentsline {paragraph}{4. 第三方服务和工具类}{23}{section*.15}%
\contentsline {subsection}{\numberline {3.4}维护后的软件原型以及功能展示}{33}{subsection.3.4}% \contentsline {paragraph}{5. 语音识别和语音合成相关类}{23}{section*.16}%
\contentsline {subsubsection}{\numberline {3.4.1}设置界面背景}{33}{subsubsection.3.4.1}% \contentsline {paragraph}{6. 通用对话框类}{23}{section*.17}%
\contentsline {subsubsection}{\numberline {3.4.2}欢迎界面}{34}{subsubsection.3.4.2}% \contentsline {paragraph}{7. 类之间的关系}{23}{section*.18}%
\contentsline {subsubsection}{\numberline {3.4.3}登录密码}{35}{subsubsection.3.4.3}% \contentsline {paragraph}{总结}{24}{section*.19}%
\contentsline {subsubsection}{\numberline {3.4.4}翻译功能}{41}{subsubsection.3.4.4}% \contentsline {subsubsection}{\numberline {3.2.2}架构解释}{26}{subsubsection.3.2.2}%
\contentsline {subsubsection}{\numberline {3.4.5}插入图片}{45}{subsubsection.3.4.5}% \contentsline {paragraph}{1. 界面层UI Layer}{26}{section*.21}%
\contentsline {subsubsection}{\numberline {3.4.6}统计字符个数}{46}{subsubsection.3.4.6}% \contentsline {paragraph}{2. 第三方 API 层Third-party API Layer}{26}{section*.22}%
\contentsline {subsubsection}{\numberline {3.4.7}富文本功能}{47}{subsubsection.3.4.7}% \contentsline {paragraph}{3. 业务层Business Layer}{26}{section*.23}%
\contentsline {subsubsection}{\numberline {3.4.8}朗读功能}{49}{subsubsection.3.4.8}% \contentsline {paragraph}{4. 模型层Model Layer}{27}{section*.24}%
\contentsline {subsubsection}{\numberline {3.4.9}私密模式}{50}{subsubsection.3.4.9}% \contentsline {paragraph}{5. 数据层Data Layer}{27}{section*.25}%
\contentsline {subsubsection}{\numberline {3.4.10}笔记编辑内搜索}{52}{subsubsection.3.4.10}% \contentsline {paragraph}{总体架构特性总结}{27}{section*.26}%
\contentsline {subsubsection}{\numberline {3.4.11}模板便签}{54}{subsubsection.3.4.11}% \contentsline {paragraph}{适用场景和优势}{27}{section*.27}%
\contentsline {subsubsection}{\numberline {3.4.12}语音听写}{55}{subsubsection.3.4.12}% \contentsline {subsection}{\numberline {3.3}维护代码数量以及质量情况}{28}{subsection.3.3}%
\contentsline {subsubsection}{\numberline {3.4.13}语音合成}{57}{subsubsection.3.4.13}% \contentsline {subsubsection}{\numberline {3.3.1}维护代码数量}{28}{subsubsection.3.3.1}%
\contentsline {subsubsection}{\numberline {3.4.14}对话式大模型}{60}{subsubsection.3.4.14}% \contentsline {subsubsection}{\numberline {3.3.2}维护后的质量分析}{32}{subsubsection.3.3.2}%
\contentsline {subsubsection}{\numberline {3.4.15}撤回功能}{63}{subsubsection.3.4.15}% \contentsline {subsection}{\numberline {3.4}维护后的软件原型以及功能展示}{36}{subsection.3.4}%
\contentsline {subsubsection}{\numberline {3.4.16}获取地理位置}{64}{subsubsection.3.4.16}% \contentsline {subsubsection}{\numberline {3.4.1}设置界面背景}{36}{subsubsection.3.4.1}%
\contentsline {section}{\numberline {4}实践收获和体会}{64}{section.4}% \contentsline {subsubsection}{\numberline {3.4.2}欢迎界面}{37}{subsubsection.3.4.2}%
\contentsline {subsection}{\numberline {4.1}收获}{64}{subsection.4.1}% \contentsline {subsubsection}{\numberline {3.4.3}登录密码}{38}{subsubsection.3.4.3}%
\contentsline {subsection}{\numberline {4.2}体会}{65}{subsection.4.2}% \contentsline {subsubsection}{\numberline {3.4.4}翻译功能}{44}{subsubsection.3.4.4}%
\contentsline {subsubsection}{\numberline {3.4.5}插入图片}{48}{subsubsection.3.4.5}%
\contentsline {subsubsection}{\numberline {3.4.6}统计字符个数}{49}{subsubsection.3.4.6}%
\contentsline {subsubsection}{\numberline {3.4.7}富文本功能}{50}{subsubsection.3.4.7}%
\contentsline {subsubsection}{\numberline {3.4.8}朗读功能}{52}{subsubsection.3.4.8}%
\contentsline {subsubsection}{\numberline {3.4.9}私密模式}{53}{subsubsection.3.4.9}%
\contentsline {subsubsection}{\numberline {3.4.10}笔记编辑内搜索}{55}{subsubsection.3.4.10}%
\contentsline {subsubsection}{\numberline {3.4.11}模板便签}{57}{subsubsection.3.4.11}%
\contentsline {subsubsection}{\numberline {3.4.12}语音听写}{58}{subsubsection.3.4.12}%
\contentsline {subsubsection}{\numberline {3.4.13}语音合成}{60}{subsubsection.3.4.13}%
\contentsline {subsubsection}{\numberline {3.4.14}对话式大模型}{63}{subsubsection.3.4.14}%
\contentsline {subsubsection}{\numberline {3.4.15}撤回功能}{66}{subsubsection.3.4.15}%
\contentsline {subsubsection}{\numberline {3.4.16}获取地理位置}{67}{subsubsection.3.4.16}%
\contentsline {section}{\numberline {4}实践收获和体会}{67}{section.4}%
\contentsline {subsection}{\numberline {4.1}收获}{67}{subsection.4.1}%
\contentsline {subsection}{\numberline {4.2}体会}{68}{subsection.4.2}%

Loading…
Cancel
Save