diff --git a/frontend/device/kindle/device.lua b/frontend/device/kindle/device.lua index 40f1093c1..bf9ba5bb3 100644 --- a/frontend/device/kindle/device.lua +++ b/frontend/device/kindle/device.lua @@ -17,27 +17,26 @@ local function kindleEnableWifi(toggle) end local function isWifiUp() - -- NOTE: Pilfered from Cervantes, c.f., #4380 - -- Possibly simpler and more compatible than the lipc approach ;). - local file = io.open("/sys/class/net/wlan0/carrier", "rb") - if not file then return 0 end - local status = tonumber(file:read("*all")) or 0 - file:close() - return status - - --[[ - local status = 0 + local status local haslipc, lipc = pcall(require, "liblipclua") local lipc_handle = nil if haslipc and lipc then lipc_handle = lipc.init("com.github.koreader.networkmgr") end if lipc_handle then - status = lipc_handle:get_int_property("com.lab126.wifid", "enable") + status = lipc_handle:get_int_property("com.lab126.wifid", "enable") or 0 lipc_handle:close() + else + -- NOTE: Pilfered from Cervantes, c.f., #4380 + -- Possibly race-y, if we're extremely unlucky and lipc drops WiFi between our open and our read... + -- But then, if we're here, it's because we failed to acquire an lipc handle, + -- so it's likely we've failed to do that earlier when trying to toggle WiFi, too... + local file = io.open("/sys/class/net/wlan0/carrier", "rb") + if not file then return 0 end + status = tonumber(file:read("*all")) or 0 + file:close() end return status - --]] end --[[ @@ -79,12 +78,24 @@ local Kindle = Generic:new{ } function Kindle:initNetworkManager(NetworkMgr) - NetworkMgr.turnOnWifi = function() + function NetworkMgr:turnOnWifi(complete_callback) kindleEnableWifi(1) + -- NOTE: As we defer the actual work to lipc, + -- we have no guarantee the WiFi state will have changed by the time kindleEnableWifi returns, + -- so, delay the callback a bit... + if complete_callback then + local UIManager = require("ui/uimanager") + UIManager:scheduleIn(1, complete_callback) + end end - NetworkMgr.turnOffWifi = function() + function NetworkMgr:turnOffWifi(complete_callback) kindleEnableWifi(0) + -- NOTE: Same here... + if complete_callback then + local UIManager = require("ui/uimanager") + UIManager:scheduleIn(1, complete_callback) + end end NetworkMgr.isWifiOn = function()