Move conversations widget to the samples
This commit is contained in:
@@ -1,176 +0,0 @@
|
||||
-- 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 "<b>"..final_sender.."</b> "
|
||||
end
|
||||
|
||||
function format_message(message, package)
|
||||
local app_name = apps:get_name(package)
|
||||
local app_color = apps:get_color(package)
|
||||
local circle = "<font color=\""..app_color.."\">●</font>"
|
||||
local second_color = ui:get_colors().secondary_text
|
||||
local time = os.date("%H:%M", message.time)
|
||||
local time_str = "<font color=\""..second_color.."\">- "..time.."</font>"
|
||||
|
||||
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
|
||||
|
||||
53
community/screen-state-menu.lua
Normal file
53
community/screen-state-menu.lua
Normal file
@@ -0,0 +1,53 @@
|
||||
-- name = "Screen state"
|
||||
-- type = "drawer"
|
||||
|
||||
local prefs = require "prefs"
|
||||
|
||||
function on_drawer_open()
|
||||
if prefs.states == nil then
|
||||
prefs.states = {}
|
||||
end
|
||||
|
||||
update_screen()
|
||||
end
|
||||
|
||||
function update_screen()
|
||||
local state_names = {}
|
||||
|
||||
for k,v in pairs(prefs.states) do
|
||||
table.insert(state_names, k)
|
||||
end
|
||||
|
||||
table.insert(state_names, "Save new state")
|
||||
|
||||
drawer:show_list(state_names)
|
||||
end
|
||||
|
||||
function on_click(idx)
|
||||
if idx > #prefs.states then
|
||||
save_state("State")
|
||||
else
|
||||
restore_state(name)
|
||||
end
|
||||
end
|
||||
|
||||
function save_state(name)
|
||||
local state = aio:active_widgets()
|
||||
prefs.states[name] = state
|
||||
update_screen()
|
||||
end
|
||||
|
||||
function restore_state(name)
|
||||
remove_all_widgets()
|
||||
|
||||
for k,v in pairs(prefs.states[name]) do
|
||||
aio:add_widget(v.name, v.position)
|
||||
end
|
||||
end
|
||||
|
||||
function remove_all_widgets()
|
||||
local curr_state = aio:active_widgets()
|
||||
for k,v in pairs(curr_state) do
|
||||
aio:remove_widget(v.position)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user