360 lines
9.2 KiB
Lua
360 lines
9.2 KiB
Lua
-- name = "My apps"
|
|
-- type = "widget"
|
|
-- version = "1.0"
|
|
-- author = "Andrey Gavrilov"
|
|
|
|
local utf8 = require "utf8"
|
|
local dialog_id = ""
|
|
local app_idx = 0
|
|
|
|
function on_resume()
|
|
update_args()
|
|
local folding = false
|
|
if settings:get_kv()["folding"] == "true" then
|
|
folding = true
|
|
end
|
|
ui:set_folding_flag(folding)
|
|
redraw()
|
|
end
|
|
|
|
function on_alarm()
|
|
local args = settings:get_kv()
|
|
if next(args) == nil then
|
|
args["no_hidden"] = true
|
|
args["columns"] = 4
|
|
args["trim"] = 10
|
|
args["folding"] = false
|
|
args["1"] = "com.android.settings"
|
|
settings:set_kv(args)
|
|
redraw()
|
|
end
|
|
end
|
|
|
|
function on_settings()
|
|
dialog_id = "settings"
|
|
local tab = {"Applications list","No hidden setting","Columns number","Trim app name","Autofolding setting","Widget title"}
|
|
ui:show_radio_dialog("Settings",tab)
|
|
end
|
|
|
|
function on_dialog_action(data)
|
|
if data == -1 then
|
|
return
|
|
end
|
|
if dialog_id == "settings" then
|
|
if data == 1 then
|
|
dialog_id = "apps"
|
|
local tab = get_all_apps("abc",settings:get_kv()["no_hidden"])
|
|
ui:show_checkbox_dialog("Select apps",tab[2],args_to_idx(tab[1]))
|
|
return
|
|
elseif data == 2 then
|
|
dialog_id = "no_hidden"
|
|
local tab = {"Not show hidden applications"}
|
|
local tt = {}
|
|
if tostring(settings:get_kv()["no_hidden"]) == "true" then
|
|
tt = {1}
|
|
end
|
|
ui:show_checkbox_dialog("No hidden settings",tab,tt)
|
|
return
|
|
elseif data == 3 then
|
|
dialog_id = "columns"
|
|
ui:show_edit_dialog("Columns number","",settings:get_kv()["columns"])
|
|
return
|
|
elseif data == 4 then
|
|
dialog_id = "trim"
|
|
ui:show_edit_dialog("Trim app name","0 - not trim",settings:get_kv()["trim"])
|
|
return
|
|
elseif data == 5 then
|
|
dialog_id = "folding"
|
|
local tab = {"Autofolding"}
|
|
local tt = {}
|
|
if tostring(settings:get_kv()["folding"]) == "true" then
|
|
tt = {1}
|
|
end
|
|
ui:show_checkbox_dialog("Autofolding settings",tab,tt)
|
|
return
|
|
elseif data == 6 then
|
|
dialog_id = "name"
|
|
ui:show_edit_dialog("Set widget title","Empty - default title",ui:get_default_title())
|
|
return
|
|
end
|
|
elseif dialog_id == "no_hidden" then
|
|
local args = settings:get_kv()
|
|
if next(data) == nil then
|
|
args["no_hidden"] = false
|
|
else
|
|
args["no_hidden"] = true
|
|
end
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
return
|
|
elseif dialog_id == "apps" then
|
|
settings:set_kv(idx_to_args(data))
|
|
redraw()
|
|
return
|
|
elseif dialog_id == "columns" then
|
|
if data == tostring(tonumber(data)) then
|
|
if tonumber(data) == 0 then
|
|
data = "1"
|
|
end
|
|
local args = settings:get_kv()
|
|
args["columns"] = math.floor(tonumber(data))
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
end
|
|
return
|
|
elseif dialog_id == "trim" then
|
|
if data == tostring(tonumber(data)) then
|
|
local args = settings:get_kv()
|
|
args["trim"] = math.floor(tonumber(data))
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
end
|
|
return
|
|
elseif dialog_id == "folding" then
|
|
local args = settings:get_kv()
|
|
if next(data) == nil then
|
|
args["folding"] = false
|
|
else
|
|
args["folding"] = true
|
|
end
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
return
|
|
elseif dialog_id == "name" then
|
|
local title = ui:get_default_title()
|
|
if data ~= "" then
|
|
title = data
|
|
end
|
|
ui:set_title(title)
|
|
return
|
|
elseif dialog_id == "move" then
|
|
if data == tostring(tonumber(data)) then
|
|
local idx = math.floor(tonumber(data))
|
|
local args = settings:get_kv()
|
|
if idx < 1 then
|
|
idx = 1
|
|
elseif idx > max_key(args) then
|
|
idx = max_key(args)
|
|
end
|
|
local from = args[tostring(app_idx)]
|
|
local to = args[tostring(idx)]
|
|
args[tostring(app_idx)] = to
|
|
args[tostring(idx)] = from
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function on_context_menu_click(idx)
|
|
if idx == 4 then
|
|
apps:show_edit_dialog(settings:get_kv()[tostring(app_idx)])
|
|
elseif idx == 1 then
|
|
local args = settings:get_kv()
|
|
if app_idx == max_key(args) then
|
|
return
|
|
end
|
|
local from = args[tostring(app_idx)]
|
|
local to = args[tostring(app_idx+1)]
|
|
args[tostring(app_idx)] = to
|
|
args[tostring(app_idx+1)] = from
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
return
|
|
elseif idx == 3 then
|
|
local args = settings:get_kv()
|
|
if app_idx == 1 then
|
|
return
|
|
end
|
|
local from = args[tostring(app_idx)]
|
|
local to = args[tostring(app_idx-1)]
|
|
args[tostring(app_idx)] = to
|
|
args[tostring(app_idx-1)] = from
|
|
settings:set_kv(args)
|
|
update_args()
|
|
redraw()
|
|
return
|
|
elseif idx == 2 then
|
|
local args = settings:get_kv()
|
|
local new_args = {}
|
|
for k,v in pairs(args) do
|
|
if k ~= tostring(app_idx) then
|
|
new_args[k] = v
|
|
end
|
|
end
|
|
settings:set_kv(new_args)
|
|
update_args()
|
|
redraw()
|
|
return
|
|
elseif idx == 5 then
|
|
dialog_id = "move"
|
|
local text = "Number from 1 to "..tostring(max_key(settings:get_kv()))
|
|
ui:show_edit_dialog("Set position",text,app_idx)
|
|
return
|
|
end
|
|
end
|
|
|
|
function redraw()
|
|
local cols = tonumber(settings:get_kv()["columns"])
|
|
if cols == 0 or cols == nil then
|
|
cols = 1
|
|
end
|
|
ui:show_table(table_to_tables(tab_from_args(), cols))
|
|
end
|
|
|
|
function on_click(idx)
|
|
apps:launch(settings:get_kv()[tostring(idx)])
|
|
end
|
|
|
|
function on_long_click(idx)
|
|
app_idx = idx
|
|
ui:show_context_menu({
|
|
{ "chevron-right", "Forward" },
|
|
{ "times", "Remove" },
|
|
{ "chevron-left", "Back" },
|
|
{ "edit", "Edit" },
|
|
{ "exchange", "Move" }
|
|
})
|
|
end
|
|
|
|
function tab_from_args()
|
|
local args = settings:get_kv()
|
|
local len = tonumber(args["trim"])
|
|
if len == nil then
|
|
len = 0
|
|
end
|
|
local tab = {}
|
|
for k,v in pairs(args) do
|
|
if k == tostring(tonumber(k)) then
|
|
tab[tonumber(k)] = get_formatted_name(v,len)
|
|
end
|
|
end
|
|
return tab
|
|
end
|
|
|
|
function get_formatted_name(pkg,len)
|
|
local str = apps:get_name(pkg)
|
|
if utf8.len(str) > len and len > 0 then
|
|
str = utf8.sub(str,1,len-1):gsub("[%. ]*$","").."."
|
|
end
|
|
return "<font color=\""..apps:get_color(pkg).."\">"..str.."</font>"
|
|
end
|
|
|
|
function table_to_tables(tab, num)
|
|
local out_tab = {}
|
|
local row = {}
|
|
|
|
for k,v in ipairs(tab) do
|
|
table.insert(row, v)
|
|
if k % num == 0 then
|
|
table.insert(out_tab, row)
|
|
row = {}
|
|
end
|
|
end
|
|
if row ~= {} then
|
|
table.insert(out_tab, row)
|
|
end
|
|
return out_tab
|
|
end
|
|
|
|
function get_all_apps(sort_by,no_hidden)
|
|
if tostring(no_hidden) == "true" then
|
|
no_hidden = true
|
|
else
|
|
no_hidden = false
|
|
end
|
|
local t = settings:get_kv()
|
|
local all_apps = apps:get_list(sort_by,no_hidden)
|
|
local apps_names = {}
|
|
for k,v in ipairs(all_apps) do
|
|
apps_names[k] = apps:get_name(v)
|
|
end
|
|
return {all_apps,apps_names}
|
|
end
|
|
|
|
function args_to_idx(tab)
|
|
local args = settings:get_kv()
|
|
local t = {}
|
|
for k,v in pairs(args) do
|
|
local idx = get_index(tab,v)
|
|
if idx > 0 then
|
|
table.insert(t,idx)
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
function idx_to_args(tab)
|
|
local args = settings:get_kv()
|
|
local all_apps = get_all_apps("abc",args["no_hidden"])[1]
|
|
local new_args = {}
|
|
for i,v in ipairs(tab) do
|
|
if get_key(args,all_apps[tonumber(v)]) == 0 then
|
|
new_args[tostring(max_key(args)+i)] = all_apps[tonumber(v)]
|
|
else
|
|
new_args[get_key(args,all_apps[tonumber(v)])] = all_apps[tonumber(v)]
|
|
end
|
|
end
|
|
new_args = sort_by_key(new_args)
|
|
new_args["no_hidden"] = args["no_hidden"]
|
|
new_args["columns"] = args["columns"]
|
|
new_args["trim"] = args["trim"]
|
|
new_args["folding"] = args["folding"]
|
|
return new_args
|
|
end
|
|
|
|
function update_args()
|
|
local args = settings:get_kv()
|
|
local all_apps = get_all_apps("abc",args["no_hidden"])[1]
|
|
local new_args = {}
|
|
for k,v in pairs(args) do
|
|
if k == tostring(tonumber(k)) then
|
|
if get_index(all_apps,v) ~= 0 then
|
|
new_args[k] = v
|
|
end
|
|
end
|
|
end
|
|
new_args = sort_by_key(new_args)
|
|
new_args["no_hidden"] = args["no_hidden"]
|
|
new_args["columns"] = args["columns"]
|
|
new_args["trim"] = args["trim"]
|
|
new_args["folding"] = args["folding"]
|
|
settings:set_kv(new_args)
|
|
end
|
|
|
|
function sort_by_key(tab)
|
|
local t = {}
|
|
local tt = {}
|
|
for k,v in pairs(tab) do
|
|
table.insert(t,tonumber(k))
|
|
end
|
|
table.sort(t)
|
|
for i,v in ipairs(t) do
|
|
for kk,vv in pairs(tab) do
|
|
if kk == tostring(v) then
|
|
tt[tostring(i)] = vv
|
|
break
|
|
end
|
|
end
|
|
end
|
|
return tt
|
|
end
|
|
|
|
function max_key(tab)
|
|
local t = {}
|
|
for k,v in pairs(tab) do
|
|
if k == tostring(tonumber(k)) then
|
|
table.insert(t,k)
|
|
end
|
|
end
|
|
table.sort(t)
|
|
return #t
|
|
end
|