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

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

一、目标

实现更多笔记元素框架,为将来添加更多的笔记元素做准备。
在这里插入图片描述

二、功能需求

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

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

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

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

扩展消息分为2个部分

  1. 个人收藏——照片,视频
  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

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

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

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

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

发布了171 篇原创文章 · 获赞 15 · 访问量 5万+
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览