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