Add TickTick widget
This commit is contained in:
109
community/ticktick-app-widget.lua
Normal file
109
community/ticktick-app-widget.lua
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
-- name = "TickTick"
|
||||||
|
-- description = "AIO Launhcer wrapper for official TickTick app widget"
|
||||||
|
-- author = "Evgeny Zobnin (zobnin@gmail.com)"
|
||||||
|
-- uses_app = "com.ticktick.task"
|
||||||
|
|
||||||
|
local prefs = require "prefs"
|
||||||
|
local fmt = require "fmt"
|
||||||
|
|
||||||
|
local w_bridge = nil
|
||||||
|
local lines = {}
|
||||||
|
|
||||||
|
function on_resume()
|
||||||
|
if not widgets:bound(prefs.wid) then
|
||||||
|
setup_app_widget()
|
||||||
|
end
|
||||||
|
|
||||||
|
widgets:request_updates(prefs.wid)
|
||||||
|
end
|
||||||
|
|
||||||
|
function on_app_widget_updated(bridge)
|
||||||
|
lines = {}
|
||||||
|
|
||||||
|
-- We use dump_tree instead of dump_table because Lua tables
|
||||||
|
-- do not preserve the order of elements (which is important in this case).
|
||||||
|
-- Additionally, the text tree is simply easier to parse.
|
||||||
|
local tree = bridge:dump_tree()
|
||||||
|
local all_lines = extract_list_item_lines(tree)
|
||||||
|
lines = combine_lines(all_lines)
|
||||||
|
|
||||||
|
table.insert(lines, "Add task")
|
||||||
|
|
||||||
|
w_bridge = bridge
|
||||||
|
ui:show_lines(lines)
|
||||||
|
end
|
||||||
|
|
||||||
|
function on_click(idx)
|
||||||
|
if idx == #lines then
|
||||||
|
-- "Plus" button
|
||||||
|
w_bridge:click("image_3")
|
||||||
|
else
|
||||||
|
-- First task name
|
||||||
|
w_bridge:click("text_2")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function on_settings()
|
||||||
|
w_bridge:click("text_1")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Extract all elements with a nesting level of 6 (task texts and dates)
|
||||||
|
function extract_list_item_lines(str)
|
||||||
|
for line in str:gmatch("[^\n]+") do
|
||||||
|
if line:match("^%s%s%s%s%s%s%s%s%s%s%s%s") then
|
||||||
|
table.insert(lines, extract_text_after_colon(line))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return lines
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Tasks list elements in the the dump are separated by a 1x1 image,
|
||||||
|
-- so we can use it to understand where one task ends and another begins.
|
||||||
|
function combine_lines(lines)
|
||||||
|
local result = {}
|
||||||
|
local temp_lines = {}
|
||||||
|
|
||||||
|
for i, line in ipairs(lines) do
|
||||||
|
if line == "1x1" then
|
||||||
|
if #temp_lines > 0 then
|
||||||
|
table.insert(result, concat_lines(temp_lines))
|
||||||
|
temp_lines = {}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
table.insert(temp_lines, line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #temp_lines > 0 then
|
||||||
|
table.insert(result, concat_lines(temp_lines))
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
-- The text and date of a task in the dump appear consecutively,
|
||||||
|
-- and we need to combine them, keeping in mind that the date might be absent.
|
||||||
|
function concat_lines(lines)
|
||||||
|
if lines[1] then
|
||||||
|
lines[1] = fmt.primary(lines[1])
|
||||||
|
end
|
||||||
|
|
||||||
|
if lines[2] then
|
||||||
|
lines[2] = fmt.secondary(lines[2])
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(lines, fmt.secondary(" - "))
|
||||||
|
end
|
||||||
|
|
||||||
|
function extract_text_after_colon(text)
|
||||||
|
return text:match(":%s*(.*)")
|
||||||
|
end
|
||||||
|
|
||||||
|
function setup_app_widget()
|
||||||
|
local id = widgets:setup("com.ticktick.task/com.ticktick.task.activity.widget.GoogleTaskAppWidgetProviderLarge")
|
||||||
|
if (id ~= nil) then
|
||||||
|
prefs.wid = id
|
||||||
|
else
|
||||||
|
ui:show_text("Can't add widget")
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user