- This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.
-
-
- More information...
-
-
-
-
Related Links
-
-
IANA - IANA-managed Reserved Domains
-
www.iana.org > domains > reserved
-
Certain domains are set aside and unavailable for registration.
-
-
-
RFC 2606 - Reserved Top Level DNS Names
-
tools.ietf.org > html > rfc2606
-
This document describes domain names reserved for documentation.
-
-
diff --git a/src/main/assets/apps/shell/shell.lua b/src/main/assets/apps/shell/shell.lua
index ead13c1..d36ceeb 100644
--- a/src/main/assets/apps/shell/shell.lua
+++ b/src/main/assets/apps/shell/shell.lua
@@ -67,6 +67,12 @@ function loadAppContent_internal(app_id, app_path)
current_app = app_id
current_app_path = app_path
print("[Shell] App loaded: " .. app_id)
+
+ -- If home was loaded, populate apps dynamically
+ if app_id == "home" then
+ populateHomeApps()
+ end
+
return true
else
print("[Shell] Failed to load app: " .. app_id)
@@ -347,11 +353,167 @@ function shellCanGoBack()
return #nav_history > 0
end
+-- ===== DYNAMIC APP DISCOVERY =====
+
+-- Default colors for apps without custom colors
+local app_colors = {
+ ["com.mosis.browser"] = "#F44336",
+ ["com.mosis.camera"] = "#9C27B0",
+ ["com.mosis.contacts"] = "#FF9800",
+ ["com.mosis.dialer"] = "#4CAF50",
+ ["com.mosis.messages"] = "#2196F3",
+ ["com.mosis.music"] = "#E91E63",
+ ["com.mosis.settings"] = "#607D8B",
+ ["com.mosis.store"] = "#3F51B5",
+}
+
+-- Default color for unknown apps
+local default_colors = {
+ "#FF5722", "#009688", "#795548", "#673AB7",
+ "#3F51B5", "#00BCD4", "#8BC34A", "#CDDC39"
+}
+local color_index = 1
+
+function getAppColor(package_id)
+ if app_colors[package_id] then
+ return app_colors[package_id]
+ end
+ -- Assign a default color
+ local color = default_colors[color_index]
+ color_index = (color_index % #default_colors) + 1
+ app_colors[package_id] = color
+ return color
+end
+
+-- Populate home screen with discovered apps
+function populateHomeApps()
+ if not mosis or not mosis.apps then
+ print("[Shell] mosis.apps not available")
+ return
+ end
+
+ local apps = mosis.apps.getInstalled()
+ if not apps or #apps == 0 then
+ print("[Shell] No apps discovered")
+ return
+ end
+
+ print("[Shell] Populating home with " .. #apps .. " apps")
+
+ local grid_container = shell_document:GetElementById("installed-apps")
+ if not grid_container then
+ print("[Shell] installed-apps container not found")
+ return
+ end
+
+ local apps_html = ""
+ local dock_apps = {}
+
+ for _, app in ipairs(apps) do
+ -- Skip home app itself
+ if app.package_id ~= "com.mosis.home" then
+ local color = getAppColor(app.package_id)
+ local icon = app.icon or "../../icons/app.tga"
+ local name = app.name or app.package_id
+
+ -- Build app icon HTML
+ local app_html = [[
+
+
+
+
+ ]] .. name .. [[
+
+ ]]
+ apps_html = apps_html .. app_html
+
+ -- Track dock apps (dialer, messages, contacts, browser)
+ if app.package_id == "com.mosis.dialer" then
+ dock_apps.dialer = {icon = icon, color = color, id = app.package_id}
+ elseif app.package_id == "com.mosis.messages" then
+ dock_apps.messages = {icon = icon, color = color, id = app.package_id}
+ elseif app.package_id == "com.mosis.contacts" then
+ dock_apps.contacts = {icon = icon, color = color, id = app.package_id}
+ elseif app.package_id == "com.mosis.browser" then
+ dock_apps.browser = {icon = icon, color = color, id = app.package_id}
+ end
+ end
+ end
+
+ -- Set grid content
+ grid_container.inner_rml = apps_html
+
+ -- Populate dock
+ local dock_container = shell_document:GetElementById("home-dock")
+ if dock_container and (dock_apps.dialer or dock_apps.messages or dock_apps.contacts or dock_apps.browser) then
+ local dock_html = ""
+ local dock_order = {"dialer", "messages", "contacts", "browser"}
+ for _, key in ipairs(dock_order) do
+ local app = dock_apps[key]
+ if app then
+ dock_html = dock_html .. [[
+
+
+
+ ]]
+ end
+ end
+ dock_container.inner_rml = dock_html
+ end
+
+ print("[Shell] Home populated with " .. #apps - 1 .. " apps")
+end
+
+-- Launch a discovered app by package_id
+function launchDiscoveredApp(package_id)
+ if not mosis or not mosis.apps then
+ print("[Shell] mosis.apps not available")
+ showToast("Cannot launch app", "error")
+ return
+ end
+
+ local apps = mosis.apps.getInstalled()
+ for _, app in ipairs(apps) do
+ if app.package_id == package_id then
+ print("[Shell] Launching discovered app: " .. package_id)
+
+ -- Push current to history
+ if current_app then
+ table.insert(nav_history, {
+ app_id = current_app,
+ app_path = current_app_path
+ })
+ print("[Shell] Pushed to history: " .. current_app .. " (depth: " .. #nav_history .. ")")
+ end
+
+ -- Build content path - convert entry.rml to entry_content.rml
+ local entry = app.entry_point or "main.rml"
+ local content_entry = entry:gsub("%.rml$", "_content.rml")
+ local content_path = "apps/" .. package_id:gsub("com.mosis.", "") .. "/" .. content_entry
+
+ -- Switch sandbox if available
+ if switchAppSandbox then
+ switchAppSandbox(package_id, app.install_path)
+ end
+
+ return loadAppContent_internal(package_id, content_path)
+ end
+ end
+
+ print("[Shell] App not found: " .. package_id)
+ showToast("App not found", "error")
+ return false
+end
+
-- Make shell functions globally available for apps
_G.showToast = showToast
_G.showDialog = showDialog
_G.addNotification = addNotification
_G.shellNavigateTo = shellNavigateTo
_G.shellLaunchApp = shellLaunchApp
+_G.launchDiscoveredApp = launchDiscoveredApp
+_G.populateHomeApps = populateHomeApps
print("[Shell] Shell script loaded")
diff --git a/src/main/assets/apps/store/store.rml b/src/main/assets/apps/store/store.rml
deleted file mode 100644
index 0a79bdd..0000000
--- a/src/main/assets/apps/store/store.rml
+++ /dev/null
@@ -1,416 +0,0 @@
-
-
-
-
-
-
-
-
-
- Store
-
-
-
-
-
- 12:30
-
-
-
-
-
-
-
-
-
-
-
-
- Mosis Store
-
-
-
-
-
-
-
-
-
-
-
-
- Search apps & games
-
-
-
-
- Featured
- Weather Pro
- Beautiful forecasts for your virtual world
-