From da2c57f93a8fc2f61c222d012122a32be5f5f24b Mon Sep 17 00:00:00 2001 From: Hzj_jie Date: Thu, 1 Sep 2016 00:05:40 -0700 Subject: [PATCH] Automatically connect WIFI after Kobo has been resumed (#2215) * Add bash scripts to control WIFI / IP, so we can share them with frontend/device/kobo/device.lua. * add test cases --- Makefile | 4 +- frontend/device/generic/device.lua | 8 ++++ frontend/device/kobo/device.lua | 23 ++++------ frontend/luasettings.lua | 32 ++++++++++++++ .../elements/common_settings_menu_table.lua | 6 +-- frontend/ui/network/manager.lua | 25 +++++++++++ platform/kobo/disable-wifi.sh | 11 +++++ platform/kobo/enable-wifi.sh | 12 ++++++ platform/kobo/nickel.sh | 0 platform/kobo/obtain-ip.sh | 4 ++ platform/kobo/release-ip.sh | 6 +++ platform/kobo/restore-wifi-async.sh | 9 ++++ platform/kobo/suspend.sh | 9 ---- spec/unit/luasettings_spec.lua | 42 +++++++++++++++++++ 14 files changed, 159 insertions(+), 32 deletions(-) create mode 100644 platform/kobo/disable-wifi.sh create mode 100644 platform/kobo/enable-wifi.sh mode change 100644 => 100755 platform/kobo/nickel.sh create mode 100644 platform/kobo/obtain-ip.sh create mode 100644 platform/kobo/release-ip.sh create mode 100644 platform/kobo/restore-wifi-async.sh create mode 100644 spec/unit/luasettings_spec.lua diff --git a/Makefile b/Makefile index 8279fa893..524e5579c 100644 --- a/Makefile +++ b/Makefile @@ -186,9 +186,7 @@ koboupdate: all cd $(INSTALL_DIR)/kobo && tar -czhf ../KoboRoot.tgz mnt cp resources/koreader.png $(INSTALL_DIR)/koreader.png cp $(KOBO_DIR)/fmon/README.txt $(INSTALL_DIR)/README_kobo.txt - cp $(KOBO_DIR)/koreader.sh $(INSTALL_DIR)/koreader - cp $(KOBO_DIR)/suspend.sh $(INSTALL_DIR)/koreader - cp $(KOBO_DIR)/nickel.sh $(INSTALL_DIR)/koreader + cp $(KOBO_DIR)/*.sh $(INSTALL_DIR)/koreader # create new package cd $(INSTALL_DIR) && \ zip -9 -r \ diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 31da49049..da92b002a 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -116,8 +116,13 @@ end -- ONLY used for Kobo and PocketBook devices function Device:onPowerEvent(ev) local Screensaver = require("ui/screensaver") + local network_manager = require("ui/network/manager") if (ev == "Power" or ev == "Suspend") and not self.screen_saver_mode then self.powerd:beforeSuspend() + if network_manager.wifi_was_on then + network_manager:releaseIP() + network_manager:turnOffWifi() + end local UIManager = require("ui/uimanager") -- flushing settings first in case the screensaver takes too long time -- that flushing has no chance to run @@ -134,6 +139,9 @@ function Device:onPowerEvent(ev) DEBUG("Resuming...") local UIManager = require("ui/uimanager") UIManager:unschedule(self.suspend) + if network_manager.wifi_was_on and G_reader_settings:nilOrTrue("auto_restore_wifi") then + network_manager.restoreWifiAsync() + end self:resume() Screensaver:close() -- restore to previous rotation mode diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 707c1e2c7..87722d97a 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -2,25 +2,15 @@ local Generic = require("device/generic/device") local TimeVal = require("ui/timeval") local Geom = require("ui/geometry") local dbg = require("dbg") -local sleep = require("ffi/util").sleep local _ = require("gettext") local function yes() return true end local function koboEnableWifi(toggle) if toggle == 1 then - os.execute("/sbin/lsmod | grep -q sdio_wifi_pwr || /sbin/insmod /drivers/$PLATFORM/wifi/sdio_wifi_pwr.ko") - os.execute("/sbin/lsmod | grep -q dhd || /sbin/insmod /drivers/$PLATFORM/wifi/dhd.ko") - sleep(1) - os.execute("/sbin/ifconfig eth0 up") - os.execute("wlarm_le -i eth0 up") - os.execute("pidof wpa_supplicant >/dev/null || env -u LD_LIBRARY_PATH wpa_supplicant -s -ieth0 -O /var/run/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -B") + os.execute("./enable-wifi.sh") else - os.execute("killall udhcpc default.script wpa_supplicant 2>/dev/null") - os.execute("wlarm_le -i eth0 down") - os.execute("ifconfig eth0 down") - os.execute("rmmod -r dhd") - os.execute("rmmod -r sdio_wifi_pwr") + os.execute("./disable-wifi.sh") end end @@ -175,12 +165,15 @@ function Kobo:initNetworkManager(NetworkMgr) "wpa_supplicant", {ctrl_interface = "/var/run/wpa_supplicant/eth0"}) function NetworkMgr:obtainIP() - os.execute("env -u LD_LIBRARY_PATH /sbin/udhcpc -S -i eth0 -s /etc/udhcpc.d/default.script -t15 -T10 -A3 -b -q") + os.execute("./obtain-ip.sh") end function NetworkMgr:releaseIP() - os.execute("pkill -9 -f '/bin/sh /etc/udhcpc.d/default.script';") - os.execute("/sbin/ifconfig eth0 0.0.0.0") + os.execute("./release-ip.sh") + end + + function NetworkMgr:restoreWifiAsync() + os.execute("./restore-wifi-async.sh") end end diff --git a/frontend/luasettings.lua b/frontend/luasettings.lua index 7ec90e5d1..bd8629b7c 100644 --- a/frontend/luasettings.lua +++ b/frontend/luasettings.lua @@ -28,6 +28,38 @@ function LuaSettings:delSetting(key) self.data[key] = nil end +function LuaSettings:has(key) + return self:readSetting(key) ~= nil +end + +function LuaSettings:hasNot(key) + return self:readSetting(key) == nil +end + +function LuaSettings:isTrue(key) + return string.lower(tostring(self:readSetting(key))) == "true" +end + +function LuaSettings:nilOrTrue(key) + return self:hasNot(key) or self:isTrue(key) +end + +function LuaSettings:flipNilOrTrue(key) + if self:nilOrTrue(key) then + self:saveSetting(key, false) + else + self:delSetting(key) + end +end + +function LuaSettings:flipTrue(key) + if self:isTrue(key) then + self:delSetting(key) + else + self:saveSetting(key, true) + end +end + function LuaSettings:flush() local f_out = io.open(self.file, "w") if f_out ~= nil then diff --git a/frontend/ui/elements/common_settings_menu_table.lua b/frontend/ui/elements/common_settings_menu_table.lua index 585fd47c0..bae257e62 100644 --- a/frontend/ui/elements/common_settings_menu_table.lua +++ b/frontend/ui/elements/common_settings_menu_table.lua @@ -29,11 +29,7 @@ table.insert(common_settings, { }) table.insert(common_settings, { text = _("Network"), - sub_item_table = { - NetworkMgr:getWifiMenuTable(), - NetworkMgr:getProxyMenuTable(), - NetworkMgr:getInfoMenuTable(), - } + sub_item_table = NetworkMgr:getMenuTable() }) table.insert(common_settings, { text = _("Screen"), diff --git a/frontend/ui/network/manager.lua b/frontend/ui/network/manager.lua index bc1ed343f..ed7104f33 100644 --- a/frontend/ui/network/manager.lua +++ b/frontend/ui/network/manager.lua @@ -12,6 +12,7 @@ local NetworkMgr = {} function NetworkMgr:init() self.nw_settings = LuaSettings:open(DataStorage:getSettingsDir().."/network.lua") + self.wifi_was_on = G_reader_settings:isTrue("wifi_was_on") end -- Following methods are Device specific which need to be initialized in @@ -25,12 +26,16 @@ function NetworkMgr:authenticateNetwork() end function NetworkMgr:disconnectNetwork() end function NetworkMgr:obtainIP() end function NetworkMgr:releaseIP() end +-- This function should unblockly call both turnOnWifi() and obtainIP(). +function NetworkMgr:restoreWifiAsync() end -- End of device specific methods function NetworkMgr:promptWifiOn(complete_callback) UIManager:show(ConfirmBox:new{ text = _("Do you want to turn on Wi-Fi?"), ok_callback = function() + self.wifi_was_on = true + G_reader_settings:saveSetting("wifi_was_on", true) self:turnOnWifi(complete_callback) end, }) @@ -40,6 +45,8 @@ function NetworkMgr:promptWifiOff(complete_callback) UIManager:show(ConfirmBox:new{ text = _("Do you want to turn off Wi-Fi?"), ok_callback = function() + self.wifi_was_on = false + G_reader_settings:saveSetting("wifi_was_on", false) self:turnOffWifi(complete_callback) end, }) @@ -117,6 +124,15 @@ function NetworkMgr:getProxyMenuTable() } end +function NetworkMgr:getRestoreMenuTable() + return { + text = _("Automatically restore Wi-Fi connection after resume"), + checked_func = function() return G_reader_settings:nilOrTrue("auto_restore_wifi") end, + enabled_func = function() return Device:isKobo() end, + callback = function(menu) G_reader_settings:flipNilOrTrue("auto_restore_wifi") end, + } +end + function NetworkMgr:getInfoMenuTable() return { text = _("Network info"), @@ -135,6 +151,15 @@ function NetworkMgr:getInfoMenuTable() } end +function NetworkMgr:getMenuTable() + return { + self:getWifiMenuTable(), + self:getProxyMenuTable(), + self:getRestoreMenuTable(), + self:getInfoMenuTable(), + } +end + function NetworkMgr:showNetworkMenu(complete_callback) local info = InfoMessage:new{text = _("Scanning…")} UIManager:show(info) diff --git a/platform/kobo/disable-wifi.sh b/platform/kobo/disable-wifi.sh new file mode 100644 index 000000000..adbe773ee --- /dev/null +++ b/platform/kobo/disable-wifi.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Disable wifi, and remove all modules. + +killall udhcpc default.script wpa_supplicant 2>/dev/null + +wlarm_le -i eth0 down +ifconfig eth0 down + +rmmod -r dhd +rmmod -r sdio_wifi_pwr diff --git a/platform/kobo/enable-wifi.sh b/platform/kobo/enable-wifi.sh new file mode 100644 index 000000000..7bf524682 --- /dev/null +++ b/platform/kobo/enable-wifi.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# Load wifi modules and enable wifi. + +lsmod | grep -q sdio_wifi_pwr || insmod /drivers/$PLATFORM/wifi/sdio_wifi_pwr.ko +lsmod | grep -q dhd || insmod /drivers/$PLATFORM/wifi/dhd.ko +sleep 1 + +ifconfig eth0 up +wlarm_le -i eth0 up + +pidof wpa_supplicant >/dev/null || env -u LD_LIBRARY_PATH wpa_supplicant -s -ieth0 -O /var/run/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -B diff --git a/platform/kobo/nickel.sh b/platform/kobo/nickel.sh old mode 100644 new mode 100755 diff --git a/platform/kobo/obtain-ip.sh b/platform/kobo/obtain-ip.sh new file mode 100644 index 000000000..37f8e3a41 --- /dev/null +++ b/platform/kobo/obtain-ip.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +# Use udhcpc to obtain IP. +env -u LD_LIBRARY_PATH udhcpc -S -i eth0 -s /etc/udhcpc.d/default.script -t15 -T10 -A3 -b -q diff --git a/platform/kobo/release-ip.sh b/platform/kobo/release-ip.sh new file mode 100644 index 000000000..d995fe91d --- /dev/null +++ b/platform/kobo/release-ip.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# Release IP and shutdown udhcpc. + +pkill -9 -f '/bin/sh /etc/udhcpc.d/default.script' +ifconfig eth0 0.0.0.0 diff --git a/platform/kobo/restore-wifi-async.sh b/platform/kobo/restore-wifi-async.sh new file mode 100644 index 000000000..0c3f7301c --- /dev/null +++ b/platform/kobo/restore-wifi-async.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +RestoreWifi() { + ./enable-wifi.sh + ./obtain-ip.sh + echo "[$(date)] Kobo Suspend: Restarted WiFi" +} + +RestoreWifi & diff --git a/platform/kobo/suspend.sh b/platform/kobo/suspend.sh index e6b4da9be..067d81759 100755 --- a/platform/kobo/suspend.sh +++ b/platform/kobo/suspend.sh @@ -4,15 +4,6 @@ export PATH="${PATH}:/sbin:/usr/sbin" echo "[$(date +'%x @ %X')] Kobo Suspend: Going to sleep . . ." # NOTE: Sleep as little as possible here, sleeping has a tendency to make everything mysteriously hang... -# Disable wifi -if lsmod | grep -q sdio_wifi_pwr ; then - wlarm_le -i eth0 down - ifconfig eth0 down - rmmod -r dhd - rmmod -r sdio_wifi_pwr - echo "[$(date +'%x @ %X')] Kobo Suspend: Killed WiFi" -fi - # Depending on device/FW version, some kernels do not support wakeup_count, account for that if [ -e "/sys/power/wakeup_count" ] ; then #HAS_WAKEUP_COUNT="true" diff --git a/spec/unit/luasettings_spec.lua b/spec/unit/luasettings_spec.lua new file mode 100644 index 000000000..b020dcb40 --- /dev/null +++ b/spec/unit/luasettings_spec.lua @@ -0,0 +1,42 @@ +describe("luasettings module", function() + local Settings + setup(function() + require("commonrequire") + Settings = require("frontend/luasettings"):open("this-is-not-a-valid-file") + end) + + it("should handle undefined keys", function() + Settings:delSetting("abc") + + assert.True(Settings:hasNot("abc")) + assert.True(Settings:nilOrTrue("abc")) + assert.False(Settings:isTrue("abc")) + Settings:saveSetting("abc", true) + assert.True(Settings:has("abc")) + assert.True(Settings:nilOrTrue("abc")) + assert.True(Settings:isTrue("abc")) + end) + + it("should flip bool values", function() + Settings:delSetting("abc") + + assert.True(Settings:hasNot("abc")) + Settings:flipNilOrTrue("abc") + assert.False(Settings:nilOrTrue("abc")) + assert.True(Settings:has("abc")) + assert.False(Settings:isTrue("abc")) + Settings:flipNilOrTrue("abc") + assert.True(Settings:nilOrTrue("abc")) + assert.True(Settings:hasNot("abc")) + assert.False(Settings:isTrue("abc")) + + Settings:flipTrue("abc") + assert.True(Settings:has("abc")) + assert.True(Settings:isTrue("abc")) + assert.True(Settings:nilOrTrue("abc")) + Settings:flipTrue("abc") + assert.False(Settings:has("abc")) + assert.False(Settings:isTrue("abc")) + assert.True(Settings:nilOrTrue("abc")) + end) +end)