From 89f89cedc0e62f4b66de340da57d6c56dc61baf0 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Fri, 21 Oct 2022 02:20:09 +0300 Subject: Android: fix Android assets handler not listing dirs with only sub dirs Amends edd983071e0a90ee8665d2f45916fb575fc25857. Remove redundant calls to AAssetDir_getNextFileName() in AndroidAbstractFileEngine::setFileName(). It's enough to check if AAssetManager_open() returns null and AAssetManager_openDir() is valid for the provided asset file name. As part of this fix, add some unit tests to cover/ensure assets listing/iterating works as expected. Fixes: QTBUG-107627 Pick-to: 6.4 6.2 5.15 Change-Id: I37ae9cb64fbbc60699bb748895f77fd6a34fae1f Reviewed-by: Ville Voutilainen Reviewed-by: Qt CI Bot --- .../platforms/android/qandroidassetsfileenginehandler.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/plugins/platforms/android') diff --git a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp index bd1619e6db..5bff4206e6 100644 --- a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp +++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp @@ -108,10 +108,12 @@ public: FolderIterator(const QString &path) : m_path(path) { + // Note that empty dirs in the assets dir before the build are not going to be + // included in the final apk, so no empty folders should expected to be listed. QJniObject files = QJniObject::callStaticObjectMethod(QtAndroid::applicationClass(), - "listAssetContent", - "(Landroid/content/res/AssetManager;Ljava/lang/String;)[Ljava/lang/String;", - QtAndroid::assets(), QJniObject::fromString(path).object()); + "listAssetContent", + "(Landroid/content/res/AssetManager;Ljava/lang/String;)[Ljava/lang/String;", + QtAndroid::assets(), QJniObject::fromString(path).object()); if (files.isValid()) { QJniEnvironment env; jobjectArray jFiles = files.object(); @@ -350,8 +352,7 @@ public: } else { auto *assetDir = AAssetManager_openDir(m_assetManager, m_fileName.toUtf8()); if (assetDir) { - if (AAssetDir_getNextFileName(assetDir)) - m_assetInfo->type = AssetItem::Type::Folder; + m_assetInfo->type = AssetItem::Type::Folder; AAssetDir_close(assetDir); } } -- cgit v1.2.3