神马笔记实现更多的笔记元素

神马笔记实现更多的笔记元素

iOS Messages第三方应用扩展功能分析》分析了iOS Messages如何通过第三方应用扩展来发送更多类型的消息。虽然神马笔记无法实现第三方应用扩展,但可以添加更多的笔记元素来丰富笔记内容。

一、目标

实现更多笔记元素框架,为将来添加更多的笔记元素做准备。

二、功能需求

对话笔记的元素,分为以下几类

  1. 自动消息——由笔记自动添加,比如日期
  2. 基础消息——必不可少,最常用的信息,比如文字、语音、拍照
  3. 扩展消息——类型越多越好,笔记才能更加丰富

其中,扩展消息又分成2个部分,个人收藏以及更多类型。

  • 自动消息
类型 描述
日期 在对话中根据具体的消息自动添加的时间戳。
  • 基础消息
类型 描述
文字 纯文本文字信息
语音 通过手机的麦克风进行录音
拍照 拍照新的图片。
因为Android限制,无法选择拍照为视频,因此将录像归类到扩展信息。
  • 扩展消息

扩展消息分为2个部分

  1. 个人收藏——照片,视频
  2. 更多类型——音乐,网页,公式,天气,字幕,地理位置,……
序号 类型 描述
1 照片 选择手机上的照片和视频。目前已经实现照片功能,视频功能将在未来加入。
2 视频 通过摄像头进行录像。
3 音乐 选择手机上的音乐,以及其他音频。
4 地理位置 用来记录一些重要的地点。
5 网页 各种网页链接,并缓存到手机上,以方便收集各种资料。
6 公式 数学方程公式,及其他LaTeX支持的公式。
7 天气 天气信息,写日记的时候可能会用上。
8 字幕 看电影,追美剧,必不可少。
…… ……

三、实现过程

自动消息和基础消息为固定的消息类型,将来不会在进行扩展。

关键在与实现未来将不断增加的扩展消息。

1. ExtEntry

定义扩展消息的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ExtEntry extends BaseEntry {

@SerializedName("name")
String name;

@SerializedName("icon")
String icon;

@SerializedName("enable")
boolean enable;

public ExtEntry(String id) {
super(id);
}

public String getName() {
return name;
}

public String getIcon() {
return icon;
}

public boolean isEnable() {
return enable;
}
}

2. ExtTable

扩展消息包括所有的消息以及个人收藏的消息。

个人收藏为所有消息的子集。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ExtTable extends BaseTable<ExtEntry> {

@SerializedName("favorite")
List<String> favorite;

public ExtTable() {

}

public List<String> getFavorite() {
if (favorite == null) {
favorite = new ArrayList<>();
}

return Collections.unmodifiableList(favorite);
}
}

3. ExtEntity

ExtEntry的逻辑数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ExtEntity extends BaseEntity<ExtEntry> {

public ExtEntity(@NonNull Context context, @Nullable ExtEntry entry) {
super(context, entry);
}

public String getName() {
return entry.getName();
}

public String getIcon() {
return entry.getIcon();
}

public boolean isEnable() {
return entry.isEnable();
}
}

4. ExtManager

用来管理扩展消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class ExtManager {

ArrayList<ExtEntity> favorite;
ArrayList<ExtEntity> more;

ExtTable table;

Context context;

private static ExtManager instance;


public static ExtManager getInstance() {
if (instance == null) {
instance = new ExtManager(WhatsApp.getInstance());
}

return instance;
}

private ExtManager(Context context) {
this.context = context;

this.table = getTable();

List<String> filter = table.getFavorite();

this.favorite = new ArrayList<>(table.size() + 1);
this.more = new ArrayList<>(table.size() + 1);

table.getList().stream()
.map(e -> new ExtEntity(context, e))
.forEach(e -> {
if (filter.indexOf(e.getId()) >= 0) {
favorite.add(e);
} else {
more.add(e);
}
});
}

public List<ExtEntity> getFavorite() {
return Collections.unmodifiableList(favorite);
}

public List<ExtEntity> getMore() {
return Collections.unmodifiableList(more);
}

ExtTable getTable() {
String path = "chat/extension_ds.json";
ExtTable table = GsonUtils.fromJson(context, path, ExtTable.class);
if (table == null) {
table = new ExtTable();
}

return table;
}

}

5. ……

四、开发过程回顾

首先,分析扩展消息的功能,抽象出相关数据,编写对应的JSON数据文件。

其次,按照存储数据、逻辑数据、交互数据三层结构编写相对应的代码。

最后,整合到ComposeChatFragment中,完成整个扩展功能。

五、接下来

实现第一个扩展元素——方程公式。

六、Finally

于前福德。百分不及一。百千万亿分。乃至算数譬喻。所不能及。