Adds ReaderDeviceStatus: low battery alarm (#4144)

pull/4156/head
Robert 6 years ago committed by poire-z
parent 55dab14c71
commit 225b5d417d

@ -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

@ -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

@ -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

@ -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

@ -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()

@ -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

@ -30,9 +30,13 @@ local order = {
"navigation",
"----------------------------",
"language",
"time",
"device",
-- end common settings
},
device = {
"time",
"battery",
},
network = {
"network_wifi",
"network_proxy",

@ -48,11 +48,15 @@ local order = {
"navigation",
"----------------------------",
"language",
"time",
"device",
"----------------------------",
"djvu_render_mode",
"status_bar",
},
device = {
"time",
"battery",
},
network = {
"network_wifi",
"network_proxy",

@ -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(),

@ -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",

Loading…
Cancel
Save