diff --git a/base b/base index 0f7eceea3..df6a71680 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 0f7eceea34b5c64a7ac968eb0ce208740930891c +Subproject commit df6a7168074685fd216a9b07d785adcc50a0132d diff --git a/frontend/ui/widget/listview.lua b/frontend/ui/widget/listview.lua index 760ffc5ab..71b494857 100644 --- a/frontend/ui/widget/listview.lua +++ b/frontend/ui/widget/listview.lua @@ -54,6 +54,8 @@ local ListView = InputContainer:new{ } function ListView:init() + if #self.items <= 0 then return end + self.show_page = 1 self.dimen = Geom:new{w = self.width, h = self.height} diff --git a/frontend/ui/widget/networksetting.lua b/frontend/ui/widget/networksetting.lua index bb776483b..b8a804373 100644 --- a/frontend/ui/widget/networksetting.lua +++ b/frontend/ui/widget/networksetting.lua @@ -53,9 +53,21 @@ local Geom = require("ui/geometry") local Device = require("device") local Screen = Device.screen local Font = require("ui/font") +local T = require("ffi/util").template local _ = require("gettext") + +local function obtainIP() + -- TODO: check for DHCP result + local info = InfoMessage:new{text = _("Obtaining IP address…")} + UIManager:show(info) + UIManager:forceRePaint() + NetworkMgr:obtainIP() + UIManager:close(info) +end + + local MinimalPaginator = Widget:new{ width = nil, height = nil, @@ -147,6 +159,7 @@ function NetworkItem:init() horizontal_space, } }) + self.setting_ui:setConnectedItem(self) elseif self.info.password then self.btn_edit_nw = FrameContainer:new{ bordersize = 0, @@ -193,18 +206,14 @@ function NetworkItem:refresh() end function NetworkItem:connect() - local connected_item = self.setting_ui:getConnectedItem(self) + local connected_item = self.setting_ui:getConnectedItem() if connected_item then connected_item:disconnect() end local success, err_msg = NetworkMgr:authenticateNetwork(self.info) local text if success then - local info = InfoMessage:new{text = _("Obtaining IP address…")} - UIManager:show(info) - UIManager:forceRePaint() - NetworkMgr:obtainIP() - UIManager:close(info) + obtainIP() self.info.connected = true self.setting_ui:setConnectedItem(self) text = _("Connected.") @@ -215,6 +224,8 @@ function NetworkItem:connect() if self.setting_ui.connect_callback then self.setting_ui.connect_callback() end + + self:refresh() UIManager:show(InfoMessage:new{text = text}) end @@ -229,6 +240,7 @@ function NetworkItem:disconnect() UIManager:close(info) self.info.connected = nil self:refresh() + self.setting_ui:setConnectedItem(nil) if self.setting_ui.connect_callback then self.setting_ui.connect_callback() end @@ -246,7 +258,6 @@ function NetworkItem:saveAndConnectToNetwork(password_input) NetworkMgr:saveNetwork(self.info) end self:connect() - self:refresh() end UIManager:close(password_input) @@ -342,7 +353,6 @@ function NetworkItem:onTapSelect(arg, ges_ev) self:onEditNetwork() else self:connect() - self:refresh() end else self:onAddNetwork() @@ -446,6 +456,19 @@ function NetworkSetting:init() } } end + + UIManager:nextTick(function() + local connected_item = self:getConnectedItem() + if connected_item ~= nil then + obtainIP() + UIManager:show(InfoMessage:new{ + text = T(_("Connected to network %1"), connected_item.info.ssid) + }) + if self.connect_callback then + self.connect_callback() + end + end + end) end function NetworkSetting:setConnectedItem(item) diff --git a/platform/kobo/release-ip.sh b/platform/kobo/release-ip.sh index d995fe91d..3149415d5 100644 --- a/platform/kobo/release-ip.sh +++ b/platform/kobo/release-ip.sh @@ -1,5 +1,7 @@ #!/bin/sh +export PATH=$PATH:/sbin + # Release IP and shutdown udhcpc. pkill -9 -f '/bin/sh /etc/udhcpc.d/default.script' diff --git a/spec/unit/networksetting_spec.lua b/spec/unit/networksetting_spec.lua new file mode 100644 index 000000000..f9ac127cc --- /dev/null +++ b/spec/unit/networksetting_spec.lua @@ -0,0 +1,68 @@ +describe("NetworkSetting module", function() + local NetworkSetting, NetworkMgr + setup(function() + require("commonrequire") + NetworkSetting = require("ui/widget/networksetting") + NetworkMgr = require("ui/network/manager") + end) + + it("should initilize properly with empty network list", function() + local ns = NetworkSetting:new{network_list = {}} + assert.is.falsy(ns.connected_item) + end) + + it("should call connect_callback after disconnect", function() + stub(NetworkMgr, "disconnectNetwork") + stub(NetworkMgr, "releaseIP") + + local called = false + local network_list = { + { + ssid = "foo", + signal_level = -58, + flags = "[WPA2-PSK-CCMP][ESS]", + signal_quality = 84, + password = "123abc", + connected = true, + }, + } + local ns = NetworkSetting:new{ + network_list = network_list, + connect_callback = function() called = true end + } + ns.connected_item:disconnect() + assert.truthy(called) + + NetworkMgr.disconnectNetwork:revert() + NetworkMgr.releaseIP:revert() + end) + + it("should set connected_item to nil after disconnect", function() + stub(NetworkMgr, "disconnectNetwork") + stub(NetworkMgr, "releaseIP") + + local network_list = { + { + ssid = "foo", + signal_level = -58, + flags = "[WPA2-PSK-CCMP][ESS]", + signal_quality = 84, + password = "123abc", + connected = true, + }, + { + ssid = "bar", + signal_level = -258, + signal_quality = 44, + flags = "[WEP][ESS]", + }, + } + local ns = NetworkSetting:new{network_list = network_list} + assert.is.same("foo", ns.connected_item.info.ssid) + ns.connected_item:disconnect() + assert.is.falsy(ns.connected_item) + + NetworkMgr.disconnectNetwork:revert() + NetworkMgr.releaseIP:revert() + end) +end)