2017-01-01 18:29:29 +00:00
|
|
|
local Device = require("device")
|
2023-09-23 22:50:32 +00:00
|
|
|
local lfs = require("libs/libkoreader-lfs")
|
2017-01-01 18:29:29 +00:00
|
|
|
|
2023-09-23 22:50:32 +00:00
|
|
|
local ffi = require("ffi")
|
|
|
|
local C = ffi.C
|
|
|
|
require("ffi/posix_h")
|
|
|
|
-- We need to be root to be able to set the time (CAP_SYS_TIME)
|
|
|
|
if C.getuid() ~= 0 then
|
|
|
|
return { disabled = true, }
|
|
|
|
end
|
|
|
|
|
|
|
|
local ntp_cmd
|
|
|
|
-- Check if we have access to ntpd or ntpdate
|
|
|
|
if os.execute("command -v ntpd >/dev/null") == 0 then
|
2023-10-11 18:17:15 +00:00
|
|
|
-- Make sure it's actually busybox's implementation, as the syntax may otherwise differ...
|
|
|
|
-- (Of particular note, Kobo ships busybox ntpd, but not ntpdate; and Kindle ships ntpdate and !busybox ntpd).
|
|
|
|
local path = os.getenv("PATH") or ""
|
|
|
|
for p in path:gmatch("([^:]+)") do
|
|
|
|
local sym = lfs.symlinkattributes(p .. "/ntpd")
|
|
|
|
if sym and sym.mode == "link" and string.sub(sym.target, -7) == "busybox" then
|
|
|
|
ntp_cmd = "ntpd -q -n -p pool.ntp.org"
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if not ntp_cmd and os.execute("command -v ntpdate >/dev/null") == 0 then
|
2023-09-23 22:50:32 +00:00
|
|
|
ntp_cmd = "ntpdate pool.ntp.org"
|
|
|
|
end
|
|
|
|
if not ntp_cmd then
|
2017-01-01 18:29:29 +00:00
|
|
|
return { disabled = true, }
|
|
|
|
end
|
|
|
|
|
|
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
|
|
local UIManager = require("ui/uimanager")
|
|
|
|
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
|
|
|
local T = require("ffi/util").template
|
|
|
|
local _ = require("gettext")
|
2017-02-25 16:00:37 +00:00
|
|
|
local NetworkMgr = require("ui/network/manager")
|
2017-01-01 18:29:29 +00:00
|
|
|
|
Clarify our OOP semantics across the codebase (#9586)
Basically:
* Use `extend` for class definitions
* Use `new` for object instantiations
That includes some minor code cleanups along the way:
* Updated `Widget`'s docs to make the semantics clearer.
* Removed `should_restrict_JIT` (it's been dead code since https://github.com/koreader/android-luajit-launcher/pull/283)
* Minor refactoring of LuaSettings/LuaData/LuaDefaults/DocSettings to behave (mostly, they are instantiated via `open` instead of `new`) like everything else and handle inheritance properly (i.e., DocSettings is now a proper LuaSettings subclass).
* Default to `WidgetContainer` instead of `InputContainer` for stuff that doesn't actually setup key/gesture events.
* Ditto for explicit `*Listener` only classes, make sure they're based on `EventListener` instead of something uselessly fancier.
* Unless absolutely necessary, do not store references in class objects, ever; only values. Instead, always store references in instances, to avoid both sneaky inheritance issues, and sneaky GC pinning of stale references.
* ReaderUI: Fix one such issue with its `active_widgets` array, with critical implications, as it essentially pinned *all* of ReaderUI's modules, including their reference to the `Document` instance (i.e., that was a big-ass leak).
* Terminal: Make sure the shell is killed on plugin teardown.
* InputText: Fix Home/End/Del physical keys to behave sensibly.
* InputContainer/WidgetContainer: If necessary, compute self.dimen at paintTo time (previously, only InputContainers did, which might have had something to do with random widgets unconcerned about input using it as a baseclass instead of WidgetContainer...).
* OverlapGroup: Compute self.dimen at *init* time, because for some reason it needs to do that, but do it directly in OverlapGroup instead of going through a weird WidgetContainer method that it was the sole user of.
* ReaderCropping: Under no circumstances should a Document instance member (here, self.bbox) risk being `nil`ed!
* Kobo: Minor code cleanups.
2022-10-06 00:14:48 +00:00
|
|
|
local TimeSync = WidgetContainer:extend{
|
2017-01-01 18:29:29 +00:00
|
|
|
name = "timesync",
|
|
|
|
}
|
|
|
|
|
|
|
|
local function currentTime()
|
|
|
|
local std_out = io.popen("date")
|
|
|
|
if std_out then
|
2021-01-16 03:41:46 +00:00
|
|
|
local result = std_out:read("*line")
|
2017-01-01 18:29:29 +00:00
|
|
|
std_out:close()
|
2017-02-18 02:38:49 +00:00
|
|
|
if result ~= nil then
|
|
|
|
return T(_("New time is %1."), result)
|
|
|
|
end
|
2017-01-01 18:29:29 +00:00
|
|
|
end
|
2017-02-18 02:38:49 +00:00
|
|
|
return _("Time synchronized.")
|
2017-01-01 18:29:29 +00:00
|
|
|
end
|
|
|
|
|
Various Wi-Fi QoL improvements (#6424)
* Revamped most actions that require an internet connection to a new/fixed backend that allows forwarding the initial action and running it automatically once connected. (i.e., it'll allow you to set "Action when Wi-Fi is off" to "turn_on", and whatch stuff connect and do what you wanted automatically without having to re-click anywhere instead of showing you a Wi-Fi prompt and then not doing anything without any other feedback).
* Speaking of, fixed the "turn_on" beforeWifi action to, well, actually work. It's no longer marked as experimental.
* Consistently use "Wi-Fi" everywhere.
* On Kobo/Cervantes/Sony, implemented a "Kill Wi-Fi connection when inactive" system that will automatically disconnect from Wi-Fi after sustained *network* inactivity (i.e., you can keep reading, it'll eventually turn off on its own). This should be smart and flexible enough not to murder Wi-Fi while you need it, while still not keeping it uselessly on and murdering your battery.
(i.e., enable that + turn Wi-Fi on when off and enjoy never having to bother about Wi-Fi ever again).
* Made sending `NetworkConnected` / `NetworkDisconnected` events consistent (they were only being sent... sometimes, which made relying on 'em somewhat problematic).
* restoreWifiAsync is now only run when really needed (i.e., we no longer stomp on an existing working connection just for the hell of it).
* We no longer attempt to kill a bogus non-existent Wi-Fi connection when going to suspend, we only do it when it's actually needed.
* Every method of enabling Wi-Fi will now properly tear down Wi-Fi on failure, instead of leaving it in an undefined state.
* Fixed an issue in the fancy crash screen on Kobo/reMarkable that could sometime lead to the log excerpt being missing.
* Worked-around a number of sneaky issues related to low-level Wi-Fi/DHCP/DNS handling on Kobo (see the lengthy comments [below](https://github.com/koreader/koreader/pull/6424#issuecomment-663881059) for details). Fix #6421
Incidentally, this should also fix the inconsistencies experienced re: Wi-Fi behavior in Nickel when toggling between KOReader and Nickel (use NM/KFMon, and run a current FW for best results).
* For developers, this involves various cleanups around NetworkMgr and NetworkListener. Documentation is in-line, above the concerned functions.
2020-07-27 01:39:06 +00:00
|
|
|
local function syncNTP()
|
2017-02-18 02:38:49 +00:00
|
|
|
local info = InfoMessage:new{
|
|
|
|
text = _("Synchronizing time. This may take several seconds.")
|
|
|
|
}
|
|
|
|
UIManager:show(info)
|
|
|
|
UIManager:forceRePaint()
|
2017-01-01 18:29:29 +00:00
|
|
|
local txt
|
2023-09-23 22:50:32 +00:00
|
|
|
if os.execute(ntp_cmd) ~= 0 then
|
2017-02-19 11:33:42 +00:00
|
|
|
txt = _("Failed to retrieve time from server. Please check your network configuration.")
|
2017-01-01 18:29:29 +00:00
|
|
|
else
|
|
|
|
txt = currentTime()
|
2023-09-23 22:50:32 +00:00
|
|
|
os.execute("hwclock -u -w")
|
|
|
|
|
|
|
|
-- On Kindle, do it the native way, too, to make sure the native UI gets the memo...
|
|
|
|
if Device:isKindle() and lfs.attributes("/usr/sbin/setdate", "mode") == "file" then
|
|
|
|
os.execute(string.format("/usr/sbin/setdate '%d'", os.time()))
|
|
|
|
end
|
2017-01-01 18:29:29 +00:00
|
|
|
end
|
2017-02-18 02:38:49 +00:00
|
|
|
UIManager:close(info)
|
2017-01-01 18:29:29 +00:00
|
|
|
UIManager:show(InfoMessage:new{
|
|
|
|
text = txt,
|
|
|
|
timeout = 3,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
local menuItem = {
|
|
|
|
text = _("Synchronize time"),
|
2018-09-04 21:55:58 +00:00
|
|
|
keep_menu_open = true,
|
2017-02-25 16:00:37 +00:00
|
|
|
callback = function()
|
Various Wi-Fi QoL improvements (#6424)
* Revamped most actions that require an internet connection to a new/fixed backend that allows forwarding the initial action and running it automatically once connected. (i.e., it'll allow you to set "Action when Wi-Fi is off" to "turn_on", and whatch stuff connect and do what you wanted automatically without having to re-click anywhere instead of showing you a Wi-Fi prompt and then not doing anything without any other feedback).
* Speaking of, fixed the "turn_on" beforeWifi action to, well, actually work. It's no longer marked as experimental.
* Consistently use "Wi-Fi" everywhere.
* On Kobo/Cervantes/Sony, implemented a "Kill Wi-Fi connection when inactive" system that will automatically disconnect from Wi-Fi after sustained *network* inactivity (i.e., you can keep reading, it'll eventually turn off on its own). This should be smart and flexible enough not to murder Wi-Fi while you need it, while still not keeping it uselessly on and murdering your battery.
(i.e., enable that + turn Wi-Fi on when off and enjoy never having to bother about Wi-Fi ever again).
* Made sending `NetworkConnected` / `NetworkDisconnected` events consistent (they were only being sent... sometimes, which made relying on 'em somewhat problematic).
* restoreWifiAsync is now only run when really needed (i.e., we no longer stomp on an existing working connection just for the hell of it).
* We no longer attempt to kill a bogus non-existent Wi-Fi connection when going to suspend, we only do it when it's actually needed.
* Every method of enabling Wi-Fi will now properly tear down Wi-Fi on failure, instead of leaving it in an undefined state.
* Fixed an issue in the fancy crash screen on Kobo/reMarkable that could sometime lead to the log excerpt being missing.
* Worked-around a number of sneaky issues related to low-level Wi-Fi/DHCP/DNS handling on Kobo (see the lengthy comments [below](https://github.com/koreader/koreader/pull/6424#issuecomment-663881059) for details). Fix #6421
Incidentally, this should also fix the inconsistencies experienced re: Wi-Fi behavior in Nickel when toggling between KOReader and Nickel (use NM/KFMon, and run a current FW for best results).
* For developers, this involves various cleanups around NetworkMgr and NetworkListener. Documentation is in-line, above the concerned functions.
2020-07-27 01:39:06 +00:00
|
|
|
NetworkMgr:runWhenOnline(function() syncNTP() end)
|
2017-02-25 16:00:37 +00:00
|
|
|
end
|
2017-01-01 18:29:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function TimeSync:init()
|
|
|
|
self.ui.menu:registerToMainMenu(self)
|
|
|
|
end
|
|
|
|
|
2017-03-04 13:46:38 +00:00
|
|
|
function TimeSync:addToMainMenu(menu_items)
|
|
|
|
menu_items.synchronize_time = menuItem
|
2017-01-01 18:29:29 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
return TimeSync
|