版权声明:个人原创,欢迎转载。 https://blog.csdn.net/chuyangchangxi/article/details/91314980
神马笔记实现更多的笔记元素
《iOS Messages第三方应用扩展功能分析》分析了iOS Messages如何通过第三方应用扩展来发送更多类型的消息。虽然神马笔记无法实现第三方应用扩展,但可以添加更多的笔记元素来丰富笔记内容。
一、目标
实现更多笔记元素框架,为将来添加更多的笔记元素做准备。
二、功能需求
对话笔记的元素,分为以下几类
- 自动消息——由笔记自动添加,比如日期
- 基础消息——必不可少,最常用的信息,比如文字、语音、拍照
- 扩展消息——类型越多越好,笔记才能更加丰富
其中,扩展消息又分成2个部分,个人收藏以及更多类型。
- 自动消息
类型 | 描述 |
---|---|
日期 | 在对话中根据具体的消息自动添加的时间戳。 |
- 基础消息
类型 | 描述 |
---|---|
文字 | 纯文本文字信息 |
语音 | 通过手机的麦克风进行录音 |
拍照 | 拍照新的图片。 因为Android限制,无法选择拍照为视频,因此将录像归类到扩展信息。 |
- 扩展消息
扩展消息分为2个部分
- 个人收藏——照片,视频
- 更多类型——音乐,网页,公式,天气,字幕,地理位置,……
序号 | 类型 | 描述 |
---|---|---|
1 | 照片 | 选择手机上的照片和视频。目前已经实现照片功能,视频功能将在未来加入。 |
2 | 视频 | 通过摄像头进行录像。 |
3 | 音乐 | 选择手机上的音乐,以及其他音频。 |
4 | 地理位置 | 用来记录一些重要的地点。 |
5 | 网页 | 各种网页链接,并缓存到手机上,以方便收集各种资料。 |
6 | 公式 | 数学方程公式,及其他LaTeX支持的公式。 |
7 | 天气 | 天气信息,写日记的时候可能会用上。 |
8 | 字幕 | 看电影,追美剧,必不可少。 |
…… | …… |
三、实现过程
自动消息和基础消息为固定的消息类型,将来不会在进行扩展。
关键在与实现未来将不断增加的扩展消息。
1. ExtEntry
定义扩展消息的数据。
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
扩展消息包括所有的消息以及个人收藏的消息。
扫描二维码关注公众号,回复:
6518948 查看本文章
个人收藏为所有消息的子集。
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的逻辑数据。
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
用来管理扩展消息。
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
于前福德。百分不及一。百千万亿分。乃至算数譬喻。所不能及。