- Rename test-apps to base-apps with proper manifest.json for each app - Add is_system_app flag to app discovery and Lua API - Fix icon path resolution for /system/icons/ paths - Add layout.lua and layout.rcss for reusable UI components - Update home screen to dynamically load all apps from manifests - Update all app RML files to use layout components - Comprehensive testing framework documentation with JSON action format - Add tests/ directory structure for automated UI testing
104 lines
2.5 KiB
Lua
104 lines
2.5 KiB
Lua
-- Layout System for Virtual Smartphone
|
|
-- Provides reusable UI component helpers
|
|
-- Requires navigation.lua to be loaded first
|
|
|
|
-- Icon paths (relative to assets/)
|
|
local ICON_PATH = "../../icons/"
|
|
|
|
-- Default icons
|
|
local icons = {
|
|
back = ICON_PATH .. "back.tga",
|
|
home = ICON_PATH .. "home.tga",
|
|
menu = ICON_PATH .. "menu.tga",
|
|
search = ICON_PATH .. "search.tga",
|
|
more = ICON_PATH .. "more.tga",
|
|
close = ICON_PATH .. "close.tga",
|
|
wifi = ICON_PATH .. "wifi.tga",
|
|
signal = ICON_PATH .. "signal.tga",
|
|
battery = ICON_PATH .. "battery.tga"
|
|
}
|
|
|
|
-- Get current time formatted as HH:MM
|
|
local function getCurrentTime()
|
|
-- In sandbox, we might not have os.date, use a default
|
|
if os and os.date then
|
|
return os.date("%H:%M")
|
|
end
|
|
return "12:30"
|
|
end
|
|
|
|
-- Update status bar time
|
|
function updateStatusTime(doc)
|
|
local timeEl = doc:GetElementById("status-time")
|
|
if timeEl then
|
|
timeEl.inner_rml = getCurrentTime()
|
|
end
|
|
end
|
|
|
|
-- Initialize status bar with current time
|
|
-- Call from document onload
|
|
function initStatusBar(doc)
|
|
updateStatusTime(doc)
|
|
|
|
-- Set up timer to update time every minute if timers are available
|
|
if setTimeout then
|
|
local function updateLoop()
|
|
updateStatusTime(doc)
|
|
setTimeout(updateLoop, 60000)
|
|
end
|
|
setTimeout(updateLoop, 60000)
|
|
end
|
|
end
|
|
|
|
-- Initialize app bar back button
|
|
-- Call from document onload
|
|
function initAppBar(doc)
|
|
local backBtn = doc:GetElementById("app-bar-back")
|
|
if backBtn then
|
|
-- Back button is handled via onclick in RML
|
|
-- This is for any additional setup
|
|
end
|
|
end
|
|
|
|
-- Initialize system navigation bar
|
|
-- Call from document onload
|
|
function initSystemNav(doc)
|
|
-- Navigation buttons are handled via onclick in RML
|
|
-- This is for any additional setup
|
|
end
|
|
|
|
-- Full layout initialization
|
|
-- Call from document onload: initLayout(document)
|
|
function initLayout(doc)
|
|
initStatusBar(doc)
|
|
initAppBar(doc)
|
|
initSystemNav(doc)
|
|
print("Layout initialized")
|
|
end
|
|
|
|
-- Handle back button press (for app bar or system nav)
|
|
function onBackPressed()
|
|
if canGoBack and canGoBack() then
|
|
goBack()
|
|
else
|
|
-- If at root, go home
|
|
if goHome then
|
|
goHome()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Handle home button press
|
|
function onHomePressed()
|
|
if goHome then
|
|
goHome()
|
|
end
|
|
end
|
|
|
|
-- Handle recent apps button press (placeholder)
|
|
function onRecentPressed()
|
|
print("Recent apps pressed (not implemented)")
|
|
end
|
|
|
|
print("Layout system loaded")
|