# 软件维护需求描述

## 1.1 开源软件维护新增功能描述

为了改善开源软件中现有功能/性能的不足，并结合实际问题，构思的开源软件新功能描述如表1-1所示。

表1-1 软件新增功能描述表

| **功能名称** | **功能描述**                                                 |
| ------------ | ------------------------------------------------------------ |
| 动态背景变换 | 便签背景可以根据时间自动变换，提供更丰富的视觉体验。支持多种变换模式：<br>1. 按时间段变换：根据早中晚自动更换背景<br>2. 自定义变换：用户可以设置特定时间点的背景变换 |

## 1.2 开源软件维护需求

### 1.2.1 用例图

```
+------------------+       +-----------------+
|                  |       |                 |
|      用户        +------>+  进入设置界面   |
|                  |       |                 |
+------------------+       +--------+--------+
                                    |
                                    v
                           +-----------------+
                           |  选择动态背景   |
                           |     设置       |
                           +--------+--------+
                                    |
                +-------------------+-------------------+
                |                                       |
                v                                       v
       +-----------------+                    +-----------------+
       |  选择按时间段   |                    |  选择自定义时间 |
       |     模式        |                    |      模式       |
       +--------+--------+                    +--------+--------+
                |                                      |
                v                                      v
       +-----------------+                    +-----------------+
       | 配置早中晚背景色|                    | 添加/编辑/删除  |
       |                 |                    |   时间点设置    |
       +-----------------+                    +-----------------+
```

### 1.2.2 用例描述

**用例：设置动态背景模式**

**用例名称:** 设置动态背景模式

**功能:** 允许用户选择并配置动态背景变换的模式，提供个性化的视觉体验

**执行者:** 用户

**触发条件:** 用户进入便签设置界面

**前置条件:**
1. 用户已登录并具有编辑权限
2. 系统已安装并正常运行
3. 设备具有足够的存储空间

**基本交互动作过程:**
1. 用户进入设置界面
2. 选择"动态背景"选项
3. 系统显示当前背景设置状态
4. 选择背景变换模式（按时间段/自定义）
5. 根据所选模式显示相应的配置选项：
   - 按时间段模式：选择早中晚时间段
   - 自定义模式：设置具体时间点和背景
6. 预览所选配置的效果
7. 确认并保存设置

**扩展交互动作过程:**
1. 用户取消设置
   - 系统提示是否保存更改
   - 用户选择不保存并返回
2. 用户选择预览效果
   - 系统显示模拟效果
   - 用户可以调整参数
3. 用户选择默认背景
   - 系统恢复默认设置
   - 清除自定义配置
4. 用户选择随机模式
   - 系统随机选择背景
   - 设置随机切换时间间隔

**后置条件:**
1. 动态背景设置已保存
2. 系统开始按照新设置运行
3. 用户收到设置成功的通知

**业务规则:**
1. 每种模式只能同时启用一种
2. 背景图片必须符合系统要求的分辨率
3. 自定义时间点不能重复

**非功能需求:**
1. 设置界面响应时间不超过1秒
2. 背景切换过程平滑无卡顿
3. 支持离线模式下的基本功能
4. 内存占用不超过50MB

# 一、软件维护需求分析

## 2.1 用例顺序图

**用例：设置动态背景模式**

```
+------+          +----------+          +---------------+          +----------------+
|      |          |          |          |               |          |                |
| 用户 |          | 设置界面 |          | 动态背景设置  |          | 背景管理器     |
|      |          |          |          |               |          |                |
+------+          +----------+          +---------------+          +----------------+
   |                   |                       |                         |
   | 进入设置          |                       |                         |
   |------------------>|                       |                         |
   |                   |                       |                         |
   |                   | 打开动态背景设置      |                         |
   |                   |---------------------->|                         |
   |                   |                       |                         |
   |                   |                       | 获取当前设置            |
   |                   |                       |------------------------>|
   |                   |                       |                         |
   |                   |                       |<------------------------|
   |                   |                       | 返回当前设置            |
   |                   |                       |                         |
   | 选择背景模式      |                       |                         |
   |------------------>|                       |                         |
   |                   |                       |                         |
   |                   | 更新模式选择          |                         |
   |                   |---------------------->|                         |
   |                   |                       |                         |
   | 配置模式参数      |                       |                         |
   |------------------>|                       |                         |
   |                   |                       |                         |
   |                   | 更新配置参数          |                         |
   |                   |---------------------->|                         |
   |                   |                       |                         |
   | 保存设置          |                       |                         |
   |------------------>|                       |                         |
   |                   |                       |                         |
   |                   | 保存配置              |                         |
   |                   |---------------------->|                         |
   |                   |                       |                         |
   |                   |                       | 更新背景设置            |
   |                   |                       |------------------------>|
   |                   |                       |                         |
   |                   |                       |<------------------------|
   |                   |                       | 确认更新成功            |
   |                   |                       |                         |
   |                   |<----------------------|                         |
   |                   | 显示成功提示          |                         |
   |                   |                       |                         |
   |<------------------|                       |                         |
   | 返回设置成功      |                       |                         |
   |                   |                       |                         |
```

## 2.2 分析类图

```
+---------------------+       +------------------------+
|  NotesPreference    |       |  DynamicBackground     |
|---------------------|       |------------------------|
| -backgroundMode     |<----->| -currentMode           |
| +getPreferences()   |       | +getModeSettings()     |
| +setPreferences()   |       | +setModeSettings()     |
+---------------------+       +------------------------+
         ^                              ^
         |                              |
         |                              |
+---------------------+       +------------------------+
| BackgroundSettings  |       | DynamicBackgroundMgr   |
|---------------------|       |------------------------|
| +showSettings()     |       | -timePoints            |
| +updateSettings()   |       | +getCurrentBackground()|
| +saveSettings()     |       | +updateBackground()    |
+---------------------+       | +addTimePoint()        |
         ^                    | +deleteTimePoint()     |
         |                    +------------------------+
         |                              ^
+---------------------+                 |
| CustomTimeSetting   |                 |
|---------------------|                 |
| -timePoints         |---------------->|
| +addTimePoint()     |
| +editTimePoint()    |
| +deleteTimePoint()  |
+---------------------+
```

# 二、维护设计和实现方案

## 3.1 开源软件体系结构的设计及调整

1. 新增 `DynamicBackgroundManager` 组件，负责时间事件监听与背景切换触发
2. 在Model层增加 `TimePoint` 实体类及相关序列化/反序列化方法
3. 在UI层新增 `CustomTimeSettingsActivity` 和 `DynamicBackgroundSettings` 界面
4. 扩展 `ResourceParser` 类，增加背景颜色资源管理功能
5. 修改 `NotesPreferenceActivity` 类，增加动态背景设置入口

## 3.2 界面设计

### 3.2.1 新增需求界面

**动态背景设置主界面**

```
+------------------------------------------+
|                                          |
|  动态背景设置                      返回  |
|------------------------------------------+
|                                          |
|  背景模式                                |
|                                          |
|  O 禁用                                  |
|                                          |
|  O 按时间段                              |
|                                          |
|  O 自定义时间点                          |
|                                          |
|------------------------------------------+
|                                          |
|  [打开时间点设置]                        |
|                                          |
+------------------------------------------+
```

**自定义时间点设置界面**

```
+------------------------------------------+
|                                          |
|  自定义时间点                      返回  |
|------------------------------------------+
|                                          |
|  [+ 添加新时间点]                        |
|                                          |
|  时间点列表：                            |
|                                          |
|  +-------------------------------+       |
|  | 06:00           [颜色预览]    |       |
|  +-------------------------------+       |
|                                          |
|  +-------------------------------+       |
|  | 12:00           [颜色预览]    |       |
|  +-------------------------------+       |
|                                          |
|  +-------------------------------+       |
|  | 18:00           [颜色预览]    |       |
|  +-------------------------------+       |
|                                          |
+------------------------------------------+
```

**添加/编辑时间点对话框**

```
+------------------------------------------+
|                                          |
|  添加时间点                              |
|------------------------------------------+
|                                          |
|  时间:                                   |
|  +-------------+  +-------------+        |
|  |    12       |  |     30      |        |
|  +-------------+  +-------------+        |
|      小时             分钟              |
|                                          |
|  背景颜色:                               |
|  +-----+ +-----+ +-----+ +-----+        |
|  |     | |     | |     | |     |        |
|  +-----+ +-----+ +-----+ +-----+        |
|  +-----+ +-----+ +-----+ +-----+        |
|  |     | |     | |     | |     |        |
|  +-----+ +-----+ +-----+ +-----+        |
|                                          |
|  [取消]                      [确定]      |
|                                          |
+------------------------------------------+
```

### 3.2.2 设计界面类

**DynamicBackgroundSettings 类**
- 背景模式单选按钮组 - `backgroundModeRadioGroup`
- 禁用模式单选按钮 - `disableRadioButton`
- 按时间段模式单选按钮 - `timePeriodRadioButton`
- 自定义时间点模式单选按钮 - `customTimeRadioButton`
- 时间点设置按钮 - `timeSettingsButton`

**CustomTimeSettingsActivity 类**
- 添加时间点按钮 - `addTimePointButton`
- 时间点列表视图 - `timePointsRecyclerView`
- 时间点适配器 - `timePointAdapter`

**添加/编辑时间点对话框**
- 小时选择器 - `hourPicker`
- 分钟选择器 - `minutePicker`
- 颜色选择网格 - `colorGridView`
- 取消按钮 - `cancelButton`
- 确定按钮 - `confirmButton`

### 3.2.3 界面间的跳转顺序图

```
+----------------+    +----------------------+    +-----------------------+
|                |    |                      |    |                       |
| 设置界面       |    | 动态背景设置界面     |    | 自定义时间点设置界面  |
|                |    |                      |    |                       |
+----------------+    +----------------------+    +-----------------------+
        |                       |                            |
        | 1. 点击"动态背景"     |                            |
        |---------------------->|                            |
        |                       |                            |
        |                       | 2. 选择"自定义时间点"模式  |
        |                       | 3. 点击"打开时间点设置"    |
        |                       |--------------------------->|
        |                       |                            |
        |                       |                            | 4. 添加/编辑时间点
        |                       |                            |----+
        |                       |                            |    |
        |                       |                            |<---+
        |                       |                            | 5. 保存设置
        |                       |<---------------------------|
        |                       | 6. 返回到背景设置界面      |
        |                       |                            |
        |<----------------------|                            |
        | 7. 返回设置界面       |                            |
        |                       |                            |
```

### 3.2.4 界面间的跳转类图

```
+---------------------+       +------------------------+       +---------------------------+
|                     |       |                        |       |                           |
| NotesPreference     +------>+ DynamicBackgroundSett +------>+ CustomTimeSettingsActivity|
| Activity            |       | ings                   |       |                           |
|                     |<------+                        |<------+                           |
+---------------------+       +------------------------+       +---------------------------+
                                                                          |
                                                                          v
                                                              +---------------------------+
                                                              |                           |
                                                              | TimePointDialogFragment   |
                                                              |                           |
                                                              +---------------------------+
```

## 3.3 详细设计

### 3.3.1 用例设计

**用例：设置动态背景模式**

**参与者**：用户

**先决条件**：
- 应用已安装并正常运行
- 用户已打开设置界面

**主要流程**：
1. 用户在设置界面选择"动态背景"选项
2. 系统显示动态背景设置界面，包含背景模式选择
3. 用户选择所需背景模式（禁用/按时间段/自定义时间点）
4. 如果选择"自定义时间点"模式，用户可以：
   - 打开时间点设置界面
   - 添加新的时间点及对应颜色
   - 编辑或删除现有时间点
5. 用户保存设置并返回
6. 系统保存配置并应用新的背景设置

**替代流程**：
1. 如果用户取消设置，所有更改不会被保存
2. 如果设置过程中出现错误，系统显示错误信息并保持原有设置
3. 如果用户没有添加任何时间点就启用自定义模式，系统使用默认背景

### 3.3.2 类设计

**DynamicBackgroundManager 类**

```java
/**
 * 动态背景管理器
 * 负责管理背景模式设置与切换，提供获取当前时间对应背景颜色的方法
 */
public class DynamicBackgroundManager {
    // 背景模式常量
    public static final int MODE_DISABLED = 0;      // 禁用模式
    public static final int MODE_TIME_PERIOD = 1;   // 按时间段模式
    public static final int MODE_CUSTOM_TIME = 2;   // 自定义时间点模式
    
    // 时间段常量
    private static final int MORNING_START_HOUR = 6;    // 早晨开始时间
    private static final int AFTERNOON_START_HOUR = 12; // 下午开始时间
    private static final int EVENING_START_HOUR = 18;   // 晚上开始时间
    
    private SharedPreferences mPreferences;
    private Context mContext;
    
    // 公共方法
    /**
     * 获取当前背景模式
     * @return 当前背景模式
     */
    public int getBackgroundMode();
    
    /**
     * 设置背景模式
     * @param mode 背景模式
     */
    public void setBackgroundMode(int mode);
    
    /**
     * 获取当前时间对应的背景颜色ID
     * @return 背景颜色资源ID
     */
    public int getCurrentBackgroundColor();
    
    /**
     * 根据时间段获取背景颜色
     * @return 背景颜色资源ID
     */
    private int getTimePeriodColorForCurrentTime();
    
    /**
     * 添加自定义时间点
     * @param timePoint 时间点对象
     */
    public void addCustomTimePoint(TimePoint timePoint);
    
    /**
     * 更新自定义时间点
     * @param timePoint 时间点对象
     */
    public void updateCustomTimePoint(TimePoint timePoint);
    
    /**
     * 删除自定义时间点
     * @param timePointId 时间点ID
     */
    public void deleteCustomTimePoint(String timePointId);
    
    /**
     * 获取所有自定义时间点
     * @return 时间点列表
     */
    public List<TimePoint> getAllCustomTimePoints();
    
    /**
     * 根据自定义时间点获取当前时间的背景颜色
     * @return 背景颜色资源ID
     */
    private int getCustomTimeColorForCurrentTime();
}
```

**TimePoint 类**

```java
/**
 * 时间点实体类
 * 表示一个自定义时间点及其对应的背景颜色
 */
public class TimePoint {
    // 属性
    private String id;      // 唯一标识符
    private int hour;       // 小时(0-23)
    private int minute;     // 分钟(0-59)
    private int colorId;    // 背景颜色ID
    
    /**
     * 构造函数
     * @param hour 小时
     * @param minute 分钟
     * @param colorId 背景颜色ID
     */
    public TimePoint(int hour, int minute, int colorId);
    
    // Getter和Setter方法
    
    /**
     * 获取格式化的时间字符串(HH:mm)
     * @return 格式化的时间字符串
     */
    public String getFormattedTime();
    
    /**
     * 将时间点转换为总分钟数(用于比较)
     * @return 总分钟数
     */
    public int getTotalMinutes();
    
    /**
     * 转换为JSON对象
     * @return JSON对象
     */
    public JSONObject toJson();
    
    /**
     * 从JSON对象创建时间点
     * @param json JSON对象
     * @return 时间点对象
     */
    public static TimePoint fromJson(JSONObject json);
}
```

**CustomTimeSettingsActivity 类**

```java
/**
 * 自定义时间点设置活动
 * 提供添加、编辑、删除时间点的界面
 */
public class CustomTimeSettingsActivity extends Activity {
    private RecyclerView mTimePointsRecyclerView;
    private TimePointAdapter mAdapter;
    private List<TimePoint> mTimePoints;
    private DynamicBackgroundManager mBackgroundManager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState);
    
    /**
     * 初始化视图
     */
    private void initViews();
    
    /**
     * 加载所有时间点
     */
    private void loadTimePoints();
    
    /**
     * 显示添加时间点对话框
     */
    private void showAddTimePointDialog();
    
    /**
     * 显示编辑时间点对话框
     * @param timePoint 要编辑的时间点
     */
    private void showEditTimePointDialog(TimePoint timePoint);
    
    /**
     * 显示删除确认对话框
     * @param timePoint 要删除的时间点
     */
    private void showDeleteConfirmDialog(TimePoint timePoint);
    
    /**
     * 时间点适配器内部类
     */
    private class TimePointAdapter extends RecyclerView.Adapter<TimePointViewHolder> {
        // 适配器实现
    }
    
    /**
     * 时间点视图持有者内部类
     */
    private class TimePointViewHolder extends RecyclerView.ViewHolder {
        // 视图持有者实现
    }
}
```

**ResourceParser 类**

```java
/**
 * 资源解析器
 * 提供背景颜色与资源ID的映射
 */
public static class ResourceParser {
    // 颜色常量
    public static final int YELLOW = 0;
    public static final int BLUE = 1;
    public static final int WHITE = 2;
    public static final int GREEN = 3;
    public static final int RED = 4;
    
    // 时间特定颜色
    public static final int MORNING_COLOR = 5;    // 早晨背景颜色
    public static final int AFTERNOON_COLOR = 6;  // 下午背景颜色
    public static final int EVENING_COLOR = 7;    // 晚上背景颜色
    
    // 默认颜色
    public static final int BG_DEFAULT_COLOR = YELLOW;
    
    /**
     * 获取背景资源ID
     * @param id 背景ID
     * @return 资源ID
     */
    public static int getBackgroundResource(int id);
    
    /**
     * 获取背景颜色资源ID
     * @param id 背景ID
     * @return 颜色资源ID
     */
    public static int getColorResourceByBgId(int id);
    
    /**
     * 获取所有可用背景颜色列表
     * @return 背景颜色列表
     */
    public static List<Integer> getAllBackgroundColors();
}
``` 