1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/thumbnail/generator/android/thumbnail_media_parser_bridge.h"
6 #include "base/android/callback_android.h"
7 #include "base/android/jni_string.h"
8 #include "base/bind.h"
9 #include "base/files/file_path.h"
10 #include "base/task/post_task.h"
11 #include "chrome/browser/thumbnail/generator/test_support_jni_headers/ThumbnailMediaData_jni.h"
12 #include "chrome/browser/thumbnail/generator/test_support_jni_headers/ThumbnailMediaParserBridge_jni.h"
13 #include "third_party/skia/include/core/SkBitmap.h"
14 #include "ui/gfx/android/java_bitmap.h"
15
16 using base::android::ConvertUTF8ToJavaString;
17
18 namespace {
19
OnMediaParsed(const base::android::ScopedJavaGlobalRef<jobject> jcallback,bool success,chrome::mojom::MediaMetadataPtr metadata,SkBitmap thumbnail_bitmap)20 void OnMediaParsed(const base::android::ScopedJavaGlobalRef<jobject> jcallback,
21 bool success,
22 chrome::mojom::MediaMetadataPtr metadata,
23 SkBitmap thumbnail_bitmap) {
24 JNIEnv* env = base::android::AttachCurrentThread();
25 DCHECK(metadata);
26
27 // Copy the thumbnail bitmap to a Java Bitmap object.
28 base::android::ScopedJavaLocalRef<jobject> java_bitmap;
29 if (!thumbnail_bitmap.isNull())
30 java_bitmap = gfx::ConvertToJavaBitmap(thumbnail_bitmap);
31
32 base::android::ScopedJavaLocalRef<jobject> media_data;
33 if (success) {
34 media_data = Java_ThumbnailMediaData_Constructor(
35 env, metadata->duration, ConvertUTF8ToJavaString(env, metadata->title),
36 ConvertUTF8ToJavaString(env, metadata->artist), std::move(java_bitmap));
37 }
38
39 base::android::RunObjectCallbackAndroid(jcallback, std::move(media_data));
40 }
41
42 } // namespace
43
44 // static
JNI_ThumbnailMediaParserBridge_Init(JNIEnv * env,const base::android::JavaParamRef<jobject> & jcaller,const base::android::JavaParamRef<jstring> & jmime_type,const base::android::JavaParamRef<jstring> & jfile_path,const base::android::JavaParamRef<jobject> & jcallback)45 jlong JNI_ThumbnailMediaParserBridge_Init(
46 JNIEnv* env,
47 const base::android::JavaParamRef<jobject>& jcaller,
48 const base::android::JavaParamRef<jstring>& jmime_type,
49 const base::android::JavaParamRef<jstring>& jfile_path,
50 const base::android::JavaParamRef<jobject>& jcallback) {
51 base::FilePath file_path(
52 base::android::ConvertJavaStringToUTF8(env, jfile_path));
53 std::string mime_type =
54 base::android::ConvertJavaStringToUTF8(env, jmime_type);
55
56 auto* bridge = new ThumbnailMediaParserBridge(
57 mime_type, file_path,
58 base::BindOnce(&OnMediaParsed,
59 base::android::ScopedJavaGlobalRef<jobject>(jcallback)));
60 return reinterpret_cast<intptr_t>(bridge);
61 }
62
ThumbnailMediaParserBridge(const std::string & mime_type,const base::FilePath & file_path,ThumbnailMediaParser::ParseCompleteCB parse_complete_cb)63 ThumbnailMediaParserBridge::ThumbnailMediaParserBridge(
64 const std::string& mime_type,
65 const base::FilePath& file_path,
66 ThumbnailMediaParser::ParseCompleteCB parse_complete_cb)
67 : parser_(ThumbnailMediaParser::Create(mime_type, file_path)),
68 parse_complete_cb_(std::move(parse_complete_cb)) {}
69
70 ThumbnailMediaParserBridge::~ThumbnailMediaParserBridge() = default;
71
Destroy(JNIEnv * env,jobject obj)72 void ThumbnailMediaParserBridge::Destroy(JNIEnv* env, jobject obj) {
73 delete this;
74 }
75
Start(JNIEnv * env,jobject obj)76 void ThumbnailMediaParserBridge::Start(JNIEnv* env, jobject obj) {
77 parser_->Start(std::move(parse_complete_cb_));
78 }
79