Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qandroidplatformfileiconengine.cpp
Go to the documentation of this file.
1
// Copyright (C) 2025 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
include
"qandroidplatformfileiconengine.h"
6
7
#
ifndef
QT_NO_ICON
8
9
#
include
"androidjnimain.h"
10
11
#
include
<
QtCore
/
qdebug
.
h
>
12
#
include
<
QtCore
/
qjniobject
.
h
>
13
#
include
<
QtCore
/
qloggingcategory
.
h
>
14
#
include
<
QtCore
/
qscopeguard
.
h
>
15
16
#
include
<
android
/
bitmap
.
h
>
17
18
QT_BEGIN_NAMESPACE
19
20
Q_STATIC_LOGGING_CATEGORY(lcAndroidFileIconEngine,
"qt.qpa.theme.fileiconengine"
)
21
22
using
namespace
Qt::StringLiterals;
23
using
namespace
QtJniTypes;
24
25
Q_DECLARE_JNI_CLASS
(CharSequence,
"java/lang/CharSequence"
)
26
Q_DECLARE_JNI_CLASS(Icon,
"android/graphics/drawable/Icon"
)
27
Q_DECLARE_JNI_CLASS(Bitmap,
"android/graphics/Bitmap"
)
28
Q_DECLARE_JNI_CLASS(Canvas,
"android/graphics/Canvas"
)
29
Q_DECLARE_JNI_CLASS(MimeTypeMap,
"android/webkit/MimeTypeMap"
)
30
Q_DECLARE_JNI_CLASS(MimeTypeInfo,
"android/content/ContentResolver$MimeTypeInfo"
)
31
32
QAndroidPlatformFileIconEngine::QAndroidPlatformFileIconEngine(
const
QFileInfo &fileInfo,
33
QPlatformTheme::IconOptions opts)
34
: QAbstractFileIconEngine(fileInfo, opts)
35
{
36
// MimeTypeInfo requires API level 29
37
static
bool
hasMimeTypeInfo = []{
38
if
(!MimeTypeInfo::isClassAvailable()) {
39
qCWarning(lcAndroidFileIconEngine) <<
"MimeTypeInfo not available, requires API level 29"
;
40
return
false
;
41
}
42
return
true
;
43
}();
44
if
(!hasMimeTypeInfo)
45
return
;
46
47
const
auto
context = QtAndroidPrivate::context();
48
if
(!context.isValid()) {
49
qCWarning(lcAndroidFileIconEngine) <<
"Couldn't get context"
;
50
return
;
51
}
52
const
auto
contentResolver = context.callMethod<ContentResolver>(
"getContentResolver"
);
53
if
(!contentResolver.isValid()) {
54
qCWarning(lcAndroidFileIconEngine) <<
"Couldn't get content resolver"
;
55
return
;
56
}
57
58
const
auto
mimeTypeMap = MimeTypeMap::callStaticMethod<MimeTypeMap>(
"getSingleton"
);
59
const
QString mimeType = mimeTypeMap.callMethod<QString>(
"getMimeTypeFromExtension"
,
60
fileInfo.suffix());
61
62
const
auto
mimeTypeInfo = contentResolver.callMethod<MimeTypeInfo>(
"getTypeInfo"
, mimeType);
63
qCDebug(lcAndroidFileIconEngine) <<
"MimeTypeInfo"
<< mimeType
64
<< mimeTypeInfo.callMethod<CharSequence>(
"getLabel"
).toString()
65
<< mimeTypeInfo.callMethod<CharSequence>(
"getContentDescription"
).toString();
66
const
auto
icon = mimeTypeInfo.callMethod<Icon>(
"getIcon"
);
67
if
(!icon.isValid()) {
68
qCDebug(lcAndroidFileIconEngine) <<
"No valid icon in type info"
;
69
return
;
70
}
71
m_drawable = icon.callMethod<Drawable>(
"loadDrawable"
, context);
72
if
(!m_drawable || !m_drawable->isValid())
73
qCWarning(lcAndroidFileIconEngine) <<
"Failed to load drawable for icon"
;
74
}
75
76
QAndroidPlatformFileIconEngine::~QAndroidPlatformFileIconEngine() =
default
;
77
78
bool
QAndroidPlatformFileIconEngine::isNull()
79
{
80
return
!m_drawable || !m_drawable->isValid();
81
}
82
83
QPixmap QAndroidPlatformFileIconEngine::filePixmap(
const
QSize &size, QIcon::Mode, QIcon::State)
84
{
85
if
(m_pixmap.size() == size)
86
return
m_pixmap;
87
if
(isNull())
88
return
QPixmap();
89
90
JNIEnv *jniEnv = QJniEnvironment::getJniEnv();
91
// createBitmap doesn't support ARGB32, but it doesn't matter here
92
Bitmap bitmap = QtAndroid::createBitmap(size.width(), size.height(),
93
QImage::Format_RGBA8888, jniEnv);
94
if
(!bitmap.isValid()) {
95
qCWarning(lcAndroidFileIconEngine) <<
"Failed to create bitmap"
;
96
return
QPixmap();
97
}
98
Canvas canvas(bitmap);
99
m_drawable->callMethod(
"setBounds"
, 0, 0, size.width(), size.height());
100
m_drawable->callMethod(
"draw"
, canvas);
101
102
void
*pixels =
nullptr
;
103
if
(ANDROID_BITMAP_RESULT_SUCCESS != AndroidBitmap_lockPixels(jniEnv, bitmap.object(), &pixels)) {
104
qCWarning(lcAndroidFileIconEngine) <<
"Failed to lock bitmap pixels"
;
105
return
QPixmap();
106
}
107
108
// this makes a deep copy of the pixel data
109
m_pixmap = QPixmap::fromImage(QImage(
reinterpret_cast
<
const
uchar *>(pixels),
110
size.width(), size.height(), QImage::Format_RGBA8888));
111
if
(ANDROID_BITMAP_RESULT_SUCCESS != AndroidBitmap_unlockPixels(jniEnv, bitmap.object()))
112
qCWarning(lcAndroidFileIconEngine) <<
"Failed to unlock bitmap pixels"
;
113
return
m_pixmap;
114
}
115
116
QT_END_NAMESPACE
117
118
#
endif
// QT_NO_ICON
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
Q_DECLARE_JNI_CLASS
Q_DECLARE_JNI_CLASS(MotionEvent, "android/view/MotionEvent")
qtbase
src
plugins
platforms
android
qandroidplatformfileiconengine.cpp
Generated on
for Qt by
1.18.0