-- name = "Conversations" -- description = "Dialogs widget anologue" -- author = "Evgeny Zobnin (zobnin@gmail.com)" -- version = "1.0" local first_launch = true local no_tab = {} local messages_tab = {} local keys_tab = {} local folded_string = "" function on_resume() -- AIO Launcher will call get_current automatically on resume if (first_launch) then first_launch = false notify:get_current() end end function on_notify_posted(n) -- Skip not clearable and non messenger notifications if (n.is_clearable == false) then return end if (table_size(n.messages) == 0) then return end notify:consumed(n.key) no_tab[n.key] = n redraw() end function on_notify_removed(n) no_tab[n.key] = nil redraw() end function on_apps_changed() redraw() end function redraw() if (table_size(no_tab) == 0) then aio:hide_widget() ui:show_text("Empty") else aio:show_widget() draw_ui() end end function draw_ui() gen_messages_tab(no_tab) gen_folded_string(no_tab) ui:show_lines(messages_tab, nil, folded_string) end function on_click(idx) notify:open(keys_tab[idx]) end function on_long_click(idx) local key = keys_tab[idx] if (key == "NO_KEY") then return end local noti = no_tab[key] for _,action in pairs(noti.actions) do if (action.have_input) then notify:do_action(key, action.id) return end end ui:show_toast("Can't reply") end function gen_messages_tab(tab) tree_tab = {} tree_keys_tab = {} -- Create tree table: -- sender -- |--> message1 (from WhatsApp) -- `--> message2 (from Telegram) -- ... for _,notify in pairs(tab) do for _,message in pairs(notify.messages) do local sender = format_sender(message.sender) local message = format_message(message, notify.package) if tree_tab[sender] == nil then tree_tab[sender] = {} tree_keys_tab[sender] = {} end table.insert(tree_tab[sender], message) table.insert(tree_keys_tab[sender], notify.key) end end messages_tab = {} keys_tab = {} -- Flatten tree table for sender,messages in pairs(tree_tab) do table.insert(messages_tab, sender) for _,message in pairs(messages) do table.insert(messages_tab, message) end end -- Create correspondig key table for _,keys in pairs(tree_keys_tab) do table.insert(keys_tab, "NO_KEY") for _,key in pairs(keys) do saved_key = key table.insert(keys_tab, key) end end end function gen_folded_string(tab) local msg_num = 0 for _,notify in pairs(tab) do msg_num = msg_num + table_size(notify.messages) end folded_string = "Messages: "..msg_num end function format_sender(sender) local final_sender = "" if (sender == "") then final_sender = "Unknown" else final_sender = sender end return ""..final_sender.." " end function format_message(message, package) local app_name = apps:get_name(package) local app_color = apps:get_color(package) local circle = "" local second_color = ui:get_colors().secondary_text local time = os.date("%H:%M", message.time) local time_str = "- "..time.."" return circle.." "..html_escape(message.text).." "..time_str end -- Utils -- function html_escape(s) return (string.gsub(s, "[}{\">/<'&]", { ["&"] = "&", ["<"] = "<", [">"] = ">", ['"'] = """, ["'"] = "'", ["/"] = "/" })) end function table_size(T) local count = 0 for _ in pairs(T) do count = count + 1 end return count end