Fullscreen refactor (#9237)

Commonize fullscreen code across different devices.

Add fullscreen toggle on SDL desktop targets. 
Expose the toggle to the dispatcher and map it to F11.

Hide touchmenu when resizing.
reviewable/pr9255/r1
Martín Fernández 2 years ago committed by GitHub
parent 6fdb83017b
commit b7a27a3db3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1 +1 @@
Subproject commit 8a8722a491ed7897bb8eaa0c2e9e8c05b54e1104
Subproject commit e5b008dfd2f854463b45d6ae9e6b2a8c9f902412

@ -860,6 +860,7 @@ function FileManagerMenu:onShowMenu(tab_index)
end
function FileManagerMenu:onCloseFileManagerMenu()
if not self.menu_container then return end
local last_tab_index = self.menu_container[1].last_index
G_reader_settings:saveSetting("filemanagermenu_tab_index", last_tab_index)
UIManager:close(self.menu_container)
@ -900,6 +901,7 @@ function FileManagerMenu:onSwipeShowMenu(ges)
end
function FileManagerMenu:onSetDimensions(dimen)
self:onCloseFileManagerMenu()
-- update listening according to new screen dimen
if Device:isTouchDevice() then
self:initGesListener()

@ -407,6 +407,10 @@ function ReaderMenu:onCloseReaderMenu()
return true
end
function ReaderMenu:onSetDimensions(dimen)
self:onCloseReaderMenu()
end
function ReaderMenu:onCloseDocument()
if Device:supportsScreensaver() then
-- Remove the item we added (which cleans up references to document

@ -83,6 +83,7 @@ local Device = Generic:new{
home_dir = android.getExternalStoragePath(),
display_dpi = android.lib.AConfiguration_getDensity(android.app.config),
isHapticFeedbackEnabled = yes,
isDefaultFullscreen = function() return android.app.activity.sdkVersion >= 19 end,
hasClipboard = yes,
hasOTAUpdates = android.ota.isEnabled,
hasOTARunning = function() return android.ota.isRunning end,
@ -341,27 +342,85 @@ function Device:setViewport(x,y,w,h)
self.screen:setViewport(viewport)
end
function Device:toggleFullscreen()
-- fullscreen
-- to-do: implement fullscreen toggle in API19+
local function canToggleFullscreen()
local api = android.app.activity.sdkVersion
return api < 19, api
end
-- toggle fullscreen API 19+
function Device:_toggleFullscreenImmersive()
logger.dbg("ignoring fullscreen toggle, reason: always in immersive mode")
end
-- toggle fullscreen API 17-18
function Device:_toggleFullscreenLegacy()
local width = android.getScreenWidth()
local height = android.getScreenHeight()
-- NOTE: Since we don't do HW rotation here, this should always match width
local available_width = android.getScreenAvailableWidth()
local available_height = android.getScreenAvailableHeight()
local is_fullscreen = android.isFullscreen()
android.setFullscreen(not is_fullscreen)
G_reader_settings:saveSetting("disable_android_fullscreen", is_fullscreen)
self.fullscreen = android.isFullscreen()
if self.fullscreen then
self:setViewport(0, 0, width, height)
else
self:setViewport(0, 0, available_width, available_height)
end
end
-- toggle fullscreen API 14-16
function Device:_toggleStatusBarVisibility()
local is_fullscreen = android.isFullscreen()
android.setFullscreen(not is_fullscreen)
logger.dbg(string.format("requesting fullscreen: %s", not is_fullscreen))
local width = android.getScreenWidth()
local height = android.getScreenHeight()
local statusbar_height = android.getStatusBarHeight()
local new_height = height - statusbar_height
if not is_fullscreen and self.viewport then
statusbar_height = 0
-- reset touchTranslate to normal
self.input:registerEventAdjustHook(
self.input.adjustTouchTranslate,
{x = 0 + self.viewport.x, y = 0 + self.viewport.y})
end
local viewport = Geom:new{x=0, y=statusbar_height, w=width, h=new_height}
logger.info(string.format("Switching viewport to new geometry [x=%d,y=%d,w=%d,h=%d]",
0, statusbar_height, width, new_height))
self.screen:setViewport(viewport)
if is_fullscreen and self.viewport then
self.input:registerEventAdjustHook(
self.input.adjustTouchTranslate,
{x = 0 - self.viewport.x, y = 0 - self.viewport.y})
end
self.fullscreen = is_fullscreen
end
function Device:isAlwaysFullscreen()
return not canToggleFullscreen()
end
function Device:toggleFullscreen()
local is_fullscreen = android.isFullscreen()
logger.dbg(string.format("requesting fullscreen: %s", not is_fullscreen))
local dummy, api = canToggleFullscreen()
if api >= 19 then
logger.dbg("ignoring fullscreen toggle, reason: always in immersive mode")
elseif api < 19 and api >= 17 then
local width = android.getScreenWidth()
local height = android.getScreenHeight()
-- NOTE: Since we don't do HW rotation here, this should always match width
local available_width = android.getScreenAvailableWidth()
local available_height = android.getScreenAvailableHeight()
local is_fullscreen = android.isFullscreen()
android.setFullscreen(not is_fullscreen)
G_reader_settings:saveSetting("disable_android_fullscreen", is_fullscreen)
is_fullscreen = android.isFullscreen()
if is_fullscreen then
self:setViewport(0, 0, width, height)
else
self:setViewport(0, 0, available_width, available_height)
end
self:_toggleFullscreenImmersive()
elseif api >= 16 then
self:_toggleFullscreenLegacy()
else
logger.dbg("ignoring fullscreen toggle, reason: legacy api " .. api)
self:_toggleStatusBarVisibility()
end
end

@ -236,6 +236,12 @@ if Device:canToggleGSensor() then
end
end
if not Device:isAlwaysFullscreen() then
function DeviceListener:onToggleFullscreen()
Device:toggleFullscreen()
end
end
function DeviceListener:onIterateRotation()
-- Simply rotate by 90° CW
local arg = bit.band(Screen:getRotationMode() + 1, 3)

@ -41,6 +41,7 @@ local Device = {
hasFewKeys = no,
hasWifiToggle = yes,
hasWifiManager = no,
isDefaultFullscreen = yes,
isHapticFeedbackEnabled = no,
isTouchDevice = no,
hasFrontlight = no,
@ -396,6 +397,9 @@ function Device:setDateTime(year, month, day, hour, min, sec) end
-- Device specific method if any setting needs being saved
function Device:saveSettings() end
function Device:isAlwaysFullscreen() return true end
function Device:toggleFullscreen() end
-- Simulates suspend/resume
function Device:simulateSuspend() end
function Device:simulateResume() end

@ -528,6 +528,12 @@ function Input:handleKeyBoardEv(ev)
end
end
-- toggle fullscreen on F11
if self:isEvKeyPress(ev) and keycode == "F11" and not self.device:isAlwaysFullscreen() then
local UIManager = require("ui/uimanager")
UIManager:broadcastEvent(Event:new("ToggleFullscreen"))
end
-- quit on Alt + F4
-- this is also emitted by the close event in SDL
if self:isEvKeyPress(ev) and self.modifiers["Alt"] and keycode == "F4" then

@ -61,6 +61,7 @@ local Device = Generic:new{
hasDPad = yes,
hasWifiToggle = no,
isTouchDevice = yes,
isDefaultFullscreen = no,
needsScreenRefreshAfterResume = no,
hasColorScreen = yes,
hasEinkScreen = no,
@ -127,6 +128,7 @@ local Emulator = Device:new{
local UbuntuTouch = Device:new{
model = "UbuntuTouch",
hasFrontlight = yes,
isDefaultFullscreen = yes,
}
function Device:init()
@ -313,6 +315,22 @@ function Device:setDateTime(year, month, day, hour, min, sec)
end
end
function Device:isAlwaysFullscreen()
-- return true on embedded devices, which should default to fullscreen
return self:isDefaultFullscreen()
end
function Device:toggleFullscreen()
local current_mode = self.fullscreen or self:isDefaultFullscreen()
local new_mode = not current_mode
local ok, err = SDL.setWindowFullscreen(new_mode)
if not ok then
logger.warn("Unable to toggle fullscreen mode to", new_mode, "\n", err)
else
self.fullscreen = new_mode
end
end
function Emulator:supportsScreensaver() return true end
function Emulator:simulateSuspend()

@ -57,8 +57,8 @@ return {
[1073741889] = "F8", -- F[8]
[1073741890] = "F9", -- F[9]
[1073741891] = "F10", -- F[10]
[1073741892] = "VPlus", -- F[11]
[1073741893] = "VMinus", -- F[12]
[1073741892] = "F11", -- F[11]
[1073741893] = "F12", -- F[12]
[1073742049] = "Shift", -- left shift
[1073742053] = "Sym", -- right shift

@ -71,6 +71,7 @@ local settingsList = {
wifi_on = {category="none", event="InfoWifiOn", title=_("Turn on Wi-Fi"), device=true, condition=Device:hasWifiToggle()},
wifi_off = {category="none", event="InfoWifiOff", title=_("Turn off Wi-Fi"), device=true, condition=Device:hasWifiToggle()},
toggle_wifi = {category="none", event="ToggleWifi", title=_("Toggle Wi-Fi"), device=true, condition=Device:hasWifiToggle()},
toggle_fullscreen = {category="none", event="ToggleFullscreen", title=_("Toggle Fullscreen"), device=true, condition=not Device:isAlwaysFullscreen()},
show_network_info = {category="none", event="ShowNetworkInfo", title=_("Show network info"), device=true, separator=true},
suspend = {category="none", event="SuspendEvent", title=_("Suspend"), device=true},
exit = {category="none", event="Exit", title=_("Exit KOReader"), device=true},
@ -236,6 +237,7 @@ local dispatcher_menu_order = {
"wifi_on",
"wifi_off",
"toggle_wifi",
"toggle_fullscreen",
"show_network_info",
"show_frontlight_dialog",

@ -259,13 +259,36 @@ if Screen:isColorEnabled() or Screen:isColorScreen() then
common_settings.color_rendering = require("ui/elements/screen_color_menu_table")
end
-- fullscreen toggle for supported devices
if not Device:isAlwaysFullscreen() then
common_settings.fullscreen = {
text = _("Fullscreen"),
checked_func = function()
return Device.fullscreen or Device.isDefaultFullscreen()
end,
callback = function()
Device:toggleFullscreen()
-- for legacy android devices
if Device:isAndroid() then
local api = Device.firmware_rev
local needs_restart = api < 19 and api >= 16
if needs_restart then
UIManager:show(InfoMessage:new{
text = _("This will take effect on next restart.")
})
end
end
end,
}
end
if Device:isAndroid() then
-- android common settings
local isAndroid, android = pcall(require, "android")
if not isAndroid then return end
-- screen timeout options, disabled if device needs wakelocks.
common_settings.screen_timeout = require("ui/elements/screen_android"):getTimeoutMenuTable()
common_settings.screen_timeout = require("ui/elements/timeout_android"):getTimeoutMenuTable()
-- haptic feedback override
common_settings.android_haptic_feedback = {
@ -305,15 +328,6 @@ if Device:isAndroid() then
end,
}
-- fullscreen toggle on devices with compatible fullscreen methods (apis 14-18)
if Device.firmware_rev < 19 then
common_settings.fullscreen = {
text = _("Fullscreen"),
checked_func = function() return android.isFullscreen() end,
callback = function() require("ui/elements/screen_android"):toggleFullscreen() end,
}
end
-- ignore battery optimization
if Device.firmware_rev >= 23 then
common_settings.ignore_battery_optimizations = {

@ -1,12 +1,7 @@
local isAndroid, android = pcall(require, "android")
local Device = require("device")
local Geom = require("ui/geometry")
local ffi = require("ffi")
local logger = require("logger")
local _ = require("gettext")
local Input = Device.input
local N_ = _.ngettext
local Screen = Device.screen
local T = require("ffi/util").template
if not isAndroid then return end
@ -60,58 +55,10 @@ You will be prompted with a permission management screen. You'll need to give KO
android.settings.requestPermission("settings", text, _("Allow"), _("Cancel"))
end
local ScreenHelper = {}
function ScreenHelper:toggleFullscreen()
local api = Device.firmware_rev
if api < 19 and api >= 17 then
Device:toggleFullscreen()
local UIManager = require("ui/uimanager")
local InfoMessage = require("ui/widget/infomessage")
UIManager:show(InfoMessage:new{
text = _("This will take effect on next restart.")
})
elseif api < 17 then
self:toggleFullscreenLegacy()
end
end
-- toggle android status bar visibility -- Legacy function for Apis 14 - 16
function ScreenHelper:toggleFullscreenLegacy()
-- toggle android status bar visibility
local is_fullscreen = android.isFullscreen()
android.setFullscreen(not is_fullscreen)
logger.dbg(string.format("requesting fullscreen: %s", not is_fullscreen))
local screen_width = android.getScreenWidth()
local screen_height = android.getScreenHeight()
local status_bar_height = android.getStatusBarHeight()
local new_height = screen_height - status_bar_height
if not is_fullscreen and Screen.viewport then
status_bar_height = 0
-- reset touchTranslate to normal
Input:registerEventAdjustHook(
Input.adjustTouchTranslate,
{x = 0 + Screen.viewport.x, y = 0 + Screen.viewport.y})
end
local viewport = Geom:new{x=0, y=status_bar_height, w=screen_width, h=new_height}
logger.info(string.format("Switching viewport to new geometry [x=%d,y=%d,w=%d,h=%d]",
0, status_bar_height, screen_width, new_height))
Screen:setViewport(viewport)
if is_fullscreen and Screen.viewport then
Input:registerEventAdjustHook(
Input.adjustTouchTranslate,
{x = 0 - Screen.viewport.x, y = 0 - Screen.viewport.y})
end
end
local TimeoutHelper = {}
-- timeout menu table
function ScreenHelper:getTimeoutMenuTable()
function TimeoutHelper:getTimeoutMenuTable()
local t = {
{
text = _("Use system settings"),
@ -185,4 +132,4 @@ function ScreenHelper:getTimeoutMenuTable()
}
end
return ScreenHelper
return TimeoutHelper
Loading…
Cancel
Save