diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index cdd79f1e5..4d8049e0a 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -21,6 +21,7 @@ local InputContainer = require("ui/widget/container/inputcontainer") local InputDialog = require("ui/widget/inputdialog") local MultiConfirmBox = require("ui/widget/multiconfirmbox") local PluginLoader = require("pluginloader") +local ReaderDeviceStatus = require("apps/reader/modules/readerdevicestatus") local ReaderDictionary = require("apps/reader/modules/readerdictionary") local ReaderUI = require("apps/reader/readerui") local ReaderWikipedia = require("apps/reader/modules/readerwikipedia") @@ -337,6 +338,7 @@ function FileManager:init() }) table.insert(self, ReaderDictionary:new{ ui = self }) table.insert(self, ReaderWikipedia:new{ ui = self }) + table.insert(self, ReaderDeviceStatus:new{ ui = self }) -- koreader plugins for _,plugin_module in ipairs(PluginLoader:loadPlugins()) do diff --git a/frontend/apps/reader/modules/readerdevicestatus.lua b/frontend/apps/reader/modules/readerdevicestatus.lua new file mode 100644 index 000000000..6290b71e7 --- /dev/null +++ b/frontend/apps/reader/modules/readerdevicestatus.lua @@ -0,0 +1,123 @@ +local ButtonDialogTitle = require("ui/widget/buttondialogtitle") +local Device = require("device") +local Font = require("ui/font") +local InputContainer = require("ui/widget/container/inputcontainer") +local Screen = Device.screen +local UIManager = require("ui/uimanager") +local powerd = Device:getPowerDevice() +local _ = require("gettext") +local T = require("ffi/util").template + +local ReaderDeviceStatus = InputContainer:new{ +} + +function ReaderDeviceStatus:init() + if powerd:getCapacity() > 0 or powerd:isCharging() then + self.checkLowBattery = function() + local threshold = G_reader_settings:readSetting("low_battery_threshold") or 20 + local battery_capacity = powerd:getCapacity() + if powerd:getDissmisBatteryStatus() ~= true and battery_capacity <= threshold then + local low_battery_info + low_battery_info = ButtonDialogTitle:new { + modal = true, + title = T(_("The battery is getting low.\n%1% remaining."), battery_capacity), + title_align = "center", + title_face = Font:getFace("infofont"), + dismissable = false, + buttons = { + { + { + text = _("Dismiss"), + callback = function() + UIManager:close(low_battery_info) + powerd:setDissmisBatteryStatus(true) + UIManager:scheduleIn(300, self.checkLowBattery) + end, + }, + }, + } + } + UIManager:show(low_battery_info) + return + elseif powerd:getDissmisBatteryStatus() and battery_capacity > threshold then + powerd:setDissmisBatteryStatus(false) + end + UIManager:scheduleIn(300, self.checkLowBattery) + end + self.ui.menu:registerToMainMenu(self) + self:startBatteryChecker() + else + self.checkLowBattery = nil + end + end + +function ReaderDeviceStatus:addToMainMenu(menu_items) + menu_items.battery = { + text = _("Low battery alarm"), + sub_item_table = { + { + text = _("Enable"), + checked_func = function() + return G_reader_settings:nilOrTrue("battery_alarm") + end, + callback = function() + G_reader_settings:flipNilOrTrue("battery_alarm") + if G_reader_settings:nilOrTrue("battery_alarm") then + self:startBatteryChecker() + else + self:stopBatteryChecker() + powerd:setDissmisBatteryStatus(false) + end + end, + }, + { + text = _("Low battery threshold"), + enabled_func = function() return G_reader_settings:nilOrTrue("battery_alarm") end, + callback = function() + local SpinWidget = require("ui/widget/spinwidget") + local curr_items = G_reader_settings:readSetting("low_battery_threshold") or 20 + local battery_spin = SpinWidget:new { + width = Screen:getWidth() * 0.6, + value = curr_items, + value_min = 5, + value_max = 90, + value_hold_step = 10, + ok_text = _("Set threshold"), + title_text = _("Low battery threshold"), + callback = function(battery_spin) + G_reader_settings:saveSetting("low_battery_threshold", battery_spin.value) + powerd:setDissmisBatteryStatus(false) + end + } + UIManager:show(battery_spin) + end, + }, + }, + } +end + +function ReaderDeviceStatus:startBatteryChecker() + if G_reader_settings:nilOrTrue("battery_alarm") and self.checkLowBattery then + self.checkLowBattery() + end +end + +function ReaderDeviceStatus:stopBatteryChecker() + if self.checkLowBattery then + UIManager:unschedule(self.checkLowBattery) + end +end + +function ReaderDeviceStatus:onResume() + self:startBatteryChecker() +end + +function ReaderDeviceStatus:onSuspend() + self:stopBatteryChecker() +end + +function ReaderDeviceStatus:onCloseWidget() + self:stopBatteryChecker() +end + +return ReaderDeviceStatus diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index 1b64ae514..6caee98e2 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -22,6 +22,7 @@ local ReaderBookmark = require("apps/reader/modules/readerbookmark") local ReaderConfig = require("apps/reader/modules/readerconfig") local ReaderCoptListener = require("apps/reader/modules/readercoptlistener") local ReaderCropping = require("apps/reader/modules/readercropping") +local ReaderDeviceStatus = require("apps/reader/modules/readerdevicestatus") local ReaderDictionary = require("apps/reader/modules/readerdictionary") local ReaderFont = require("apps/reader/modules/readerfont") local ReaderFrontLight = require("apps/reader/modules/readerfrontlight") @@ -185,6 +186,10 @@ function ReaderUI:init() ui = self }) end + -- device status controller + self:registerModule("battery", ReaderDeviceStatus:new{ + ui = self, + }) -- configurable controller if self.document.info.configurable then -- config panel controller diff --git a/frontend/device/generic/powerd.lua b/frontend/device/generic/powerd.lua index e71f056df..04c0dcad7 100644 --- a/frontend/device/generic/powerd.lua +++ b/frontend/device/generic/powerd.lua @@ -1,5 +1,4 @@ local logger = require("logger") - local BasePowerD = { fl_min = 0, -- min frontlight intensity fl_max = 10, -- max frontlight intensity @@ -43,6 +42,8 @@ end function BasePowerD:init() end function BasePowerD:setIntensityHW(intensity) end function BasePowerD:getCapacityHW() return 0 end +function BasePowerD:getDissmisBatteryStatus() return self.battery_warning end +function BasePowerD:setDissmisBatteryStatus(status) self.battery_warning = status end function BasePowerD:isChargingHW() return false end function BasePowerD:frontlightIntensityHW() return 0 end function BasePowerD:isFrontlightOnHW() return self.fl_intensity > self.fl_min end diff --git a/frontend/ui/elements/common_info_menu_table.lua b/frontend/ui/elements/common_info_menu_table.lua index 299370c96..bb8a4748d 100644 --- a/frontend/ui/elements/common_info_menu_table.lua +++ b/frontend/ui/elements/common_info_menu_table.lua @@ -27,6 +27,10 @@ common_info.help = { common_info.more_plugins = { text = _("More plugins"), } + +common_info.device = { + text = _("Device"), +} common_info.quickstart_guide = { text = _("Quickstart guide"), callback = function() diff --git a/frontend/ui/elements/common_settings_menu_table.lua b/frontend/ui/elements/common_settings_menu_table.lua index 06b4208d5..f382060c8 100644 --- a/frontend/ui/elements/common_settings_menu_table.lua +++ b/frontend/ui/elements/common_settings_menu_table.lua @@ -35,7 +35,7 @@ if Device:setDateTime() then hour = curr_hour, min = curr_min, ok_text = _("Set time"), - title_text = _("Set time"), + title_text = _("Set time"), callback = function(time) if Device:setDateTime(nil, nil, nil, time.hour, time.min) then now_t = os.date("*t") @@ -65,7 +65,7 @@ if Device:setDateTime() then month = curr_month, day = curr_day, ok_text = _("Set date"), - title_text = _("Set date"), + title_text = _("Set date"), callback = function(time) now_t = os.date("*t") if Device:setDateTime(time.year, time.month, time.day, now_t.hour, now_t.min, now_t.sec) then diff --git a/frontend/ui/elements/filemanager_menu_order.lua b/frontend/ui/elements/filemanager_menu_order.lua index 7e04cdc57..4dea9269e 100644 --- a/frontend/ui/elements/filemanager_menu_order.lua +++ b/frontend/ui/elements/filemanager_menu_order.lua @@ -30,9 +30,13 @@ local order = { "navigation", "----------------------------", "language", - "time", + "device", -- end common settings }, + device = { + "time", + "battery", + }, network = { "network_wifi", "network_proxy", diff --git a/frontend/ui/elements/reader_menu_order.lua b/frontend/ui/elements/reader_menu_order.lua index eaf7452f5..5aea5f2e4 100644 --- a/frontend/ui/elements/reader_menu_order.lua +++ b/frontend/ui/elements/reader_menu_order.lua @@ -48,11 +48,15 @@ local order = { "navigation", "----------------------------", "language", - "time", + "device", "----------------------------", "djvu_render_mode", "status_bar", }, + device = { + "time", + "battery", + }, network = { "network_wifi", "network_proxy", diff --git a/frontend/ui/widget/buttondialogtitle.lua b/frontend/ui/widget/buttondialogtitle.lua index e93b1488f..75ebc5c7e 100644 --- a/frontend/ui/widget/buttondialogtitle.lua +++ b/frontend/ui/widget/buttondialogtitle.lua @@ -24,25 +24,29 @@ local ButtonDialogTitle = InputContainer:new{ title_margin = Size.margin.title, buttons = nil, tap_close_callback = nil, + dismissable = true, -- set to false if any button callback is required } function ButtonDialogTitle:init() - if Device:hasKeys() then - self.key_events = { - Close = { {"Back"}, doc = "close button dialog" } - } - end - if Device:isTouchDevice() then - self.ges_events.TapClose = { - GestureRange:new{ - ges = "tap", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth(), - h = Screen:getHeight(), + if self.dismissable then + if Device:hasKeys() then + self.key_events = { + Close = { { "Back" }, doc = "close button dialog" } + } + end + if Device:isTouchDevice() then + self.ges_events.TapClose = { + GestureRange:new { + ges = "tap", + range = Geom:new { + x = 0, + y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + } } } - } + end end self[1] = CenterContainer:new{ dimen = Screen:getSize(), diff --git a/frontend/ui/widget/spinwidget.lua b/frontend/ui/widget/spinwidget.lua index 428132c8e..42a7a9ae6 100644 --- a/frontend/ui/widget/spinwidget.lua +++ b/frontend/ui/widget/spinwidget.lua @@ -27,6 +27,8 @@ local SpinWidget = InputContainer:new{ value = 1, value_max = 20, value_min = 0, + value_step = 1, + value_hold_step = 4, ok_text = _("OK"), cancel_text = _("Cancel"), } @@ -64,8 +66,8 @@ function SpinWidget:update() value = self.value, value_min = self.value_min, value_max = self.value_max, - value_step = 1, - value_hold_step = 4, + value_step = self.value_step, + value_hold_step = self.value_hold_step, } local value_group = HorizontalGroup:new{ align = "center",