32QAndroidPlatformFileIconEngine::QAndroidPlatformFileIconEngine(
const QFileInfo &fileInfo,
33 QPlatformTheme::IconOptions opts)
34 : QAbstractFileIconEngine(fileInfo, opts)
37 static bool hasMimeTypeInfo = []{
38 if (!MimeTypeInfo::isClassAvailable()) {
39 qCWarning(lcAndroidFileIconEngine) <<
"MimeTypeInfo not available, requires API level 29";
47 const auto context = QtAndroidPrivate::context();
48 if (!context.isValid()) {
49 qCWarning(lcAndroidFileIconEngine) <<
"Couldn't get context";
52 const auto contentResolver = context.callMethod<ContentResolver>(
"getContentResolver");
53 if (!contentResolver.isValid()) {
54 qCWarning(lcAndroidFileIconEngine) <<
"Couldn't get content resolver";
58 const auto mimeTypeMap = MimeTypeMap::callStaticMethod<MimeTypeMap>(
"getSingleton");
59 const QString mimeType = mimeTypeMap.callMethod<QString>(
"getMimeTypeFromExtension",
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";
71 m_drawable = icon.callMethod<Drawable>(
"loadDrawable", context);
72 if (!m_drawable || !m_drawable->isValid())
73 qCWarning(lcAndroidFileIconEngine) <<
"Failed to load drawable for icon";
83QPixmap QAndroidPlatformFileIconEngine::filePixmap(
const QSize &size, QIcon::Mode, QIcon::State)
85 if (m_pixmap.size() == size)
90 JNIEnv *jniEnv = QJniEnvironment::getJniEnv();
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";
98 Canvas canvas(bitmap);
99 m_drawable->callMethod(
"setBounds", 0, 0, size.width(), size.height());
100 m_drawable->callMethod(
"draw", canvas);
102 void *pixels =
nullptr;
103 if (ANDROID_BITMAP_RESULT_SUCCESS != AndroidBitmap_lockPixels(jniEnv, bitmap.object(), &pixels)) {
104 qCWarning(lcAndroidFileIconEngine) <<
"Failed to lock bitmap pixels";
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";