FileChooser: allow traversing unreadable directories

reviewable/pr6595/r1
poire-z 4 years ago committed by Martín Fernández
parent 2c1d87a956
commit 5c1ccda314

@ -47,6 +47,11 @@ local FileChooser = Menu:extend{
goto_letter = true,
}
-- Cache of content we knew of for directories that are not readable
-- (i.e. /storage/emulated/ on Android that we can meet when coming
-- from readable /storage/emulated/0/ - so we know it contains "0/")
local unreadable_dir_content = {}
function FileChooser:init()
self.width = Screen:getWidth()
-- common dir filter
@ -60,6 +65,7 @@ function FileChooser:init()
-- lfs.dir directory without permission will give error
local ok, iter, dir_obj = pcall(lfs.dir, path)
if ok then
unreadable_dir_content[path] = nil
for f in iter, dir_obj do
if count_only then
if self.dir_filter(f) and ((not self.show_hidden and not util.stringStartsWith(f, "."))
@ -101,6 +107,25 @@ function FileChooser:init()
end
end
end
else -- error, probably "permission denied"
if unreadable_dir_content[path] then
-- Add this dummy item that will be replaced with a message
-- by genItemTableFromPath()
table.insert(dirs, {
name = "./.",
fullpath = path,
attr = lfs.attributes(path);
})
-- If we knew about some content (if we had come up from them
-- to this directory), have them shown
for k, v in pairs(unreadable_dir_content[path]) do
if v.attr and v.attr.mode == "directory" then
table.insert(dirs, v)
else
table.insert(files, v)
end
end
end
end
end
@ -236,6 +261,8 @@ function FileChooser:genItemTableFromPath(path)
text = up_folder_arrow
elseif dir.name == "." then -- possible with show_current_dir_for_hold
text = _("Long-press to select current directory")
elseif dir.name == "./." then -- added as content of an unreadable directory
text = _("Current directory not readable. Some content may not be shown.")
else
text = dir.name.."/"
bidi_wrap_func = BD.directory
@ -326,6 +353,19 @@ function FileChooser:changeToPath(path, focused_path)
if focused_path then
self.focused_path = focused_path
-- We know focused_path is a child of path. In case path is
-- not a readable directory, we can have focused_path shown,
-- to allow the user to go back in it
if not unreadable_dir_content[path] then
unreadable_dir_content[path] = {}
end
if not unreadable_dir_content[path][focused_path] then
unreadable_dir_content[path][focused_path] = {
name = focused_path:sub(#path+2),
fullpath = focused_path,
attr = lfs.attributes(focused_path);
}
end
end
self:refreshPath()
@ -333,7 +373,7 @@ function FileChooser:changeToPath(path, focused_path)
end
function FileChooser:onFolderUp()
self:changeToPath(string.format("%s/..", self.path))
self:changeToPath(string.format("%s/..", self.path), self.path)
end
function FileChooser:changePageToPath(path)

Loading…
Cancel
Save