Details
-
Bug
-
Resolution: Fixed
-
P1: Critical
-
6.4.0
-
None
-
-
89f89cedc0 (qt/qtbase/dev) 89f89cedc0 (qt/tqtc-qtbase/dev) a9b036eb84 (qt/tqtc-qtbase/6.2) 875e90d249 (qt/qtbase/6.4) 875e90d249 (qt/tqtc-qtbase/6.4), 4ceee3911 (dev), 085138bc2 (6.4), e4dddcfcd (tqtc/lts-6.2), aa7b2436b (tqtc/lts-5.15), 3144bebbb (6.5.2)
-
2022wk42FOQtforAndroid, 2022wk44FOQtforAndroid, 2022wk46FOQtforAndroid, 2022wk48FOQtforAndroid, 2022wk50FOQtforAndroid, 2022wk52FOQtforAndroid
Description
Descriptions:
It is not possible to list directories android assets files that are located subdirectory of directory with no files.
Preconditions:
Assume that your android assets dir has following layout
assets |- dir1 |--- dir2 |------ file1.qml |--- dir3 |------ file2.qml |- dir4 |--- dir5 |------ file3.qml |--- main.qml
And following piece of code:
auto flags = QDir::Dirs | QDir::NoDotAndDotDot | QDir::Files; const QDir dir1("assets:/dir1"); const QStringList dir1DirNames = dir1.entryList(flags); const QDir dir4("assets:/dir4"); const QStringList dir4DirNames = dir4.entryList(flags); qDebug() << "Dir1" << dir1DirNames << "Dir4" << dir4DirNames;
Actual Result:
Dir1 QList() Dir2 QList("dir5")
Expected Result:
Dir1 QList("dir2", "dir3") Dir2 QList("dir5")
Analysis:
The issue was introduced by this commit:
https://code.qt.io/cgit/qt/qtbase.git/commit/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp?id=edd983071e0a90ee8665d2f45916fb575fc25857
and in more detail this line is faulty:
https://code.qt.io/cgit/qt/qtbase.git/tree/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp?id=edd983071e0a90ee8665d2f45916fb575fc25857#n352
If you'll take a look on the implementation of `AAssetDir_getNextFileName` it explicitly cuts off the directories from the iteration:
https://android.googlesource.com/platform/frameworks/base.git/+/1cadc07dd1e3711fb1e57548038e3026682c5ef8/native/android/asset_manager.cpp#135
causing that in such case all directories will be treated as `AssetItem::Type::Invalid`