blob: dacc5685e7564ef5e072fc54874c4c13aef08ba0 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/physical_web/physical_web_data_source_android.h"
#include <memory>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "chrome/browser/browser_process.h"
#include "jni/UrlManager_jni.h"
using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF8;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
PhysicalWebCollection::PhysicalWebCollection()
: metadata_list_(std::make_unique<physical_web::MetadataList>()),
accessed_once_(false) {}
PhysicalWebCollection::~PhysicalWebCollection() {}
void PhysicalWebCollection::AppendMetadataItem(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& j_request_url,
jdouble distance_estimate,
jlong scan_timestamp,
const JavaParamRef<jstring>& j_site_url,
const JavaParamRef<jstring>& j_icon_url,
const JavaParamRef<jstring>& j_title,
const JavaParamRef<jstring>& j_description,
const JavaParamRef<jstring>& j_group_id) {
metadata_list_->emplace_back();
physical_web::Metadata& metadata = metadata_list_->back();
metadata.scanned_url = GURL(ConvertJavaStringToUTF8(j_request_url));
metadata.resolved_url = GURL(ConvertJavaStringToUTF8(j_site_url));
metadata.icon_url = GURL(ConvertJavaStringToUTF8(j_icon_url));
metadata.title = ConvertJavaStringToUTF8(j_title);
metadata.description = ConvertJavaStringToUTF8(j_description);
metadata.group_id = ConvertJavaStringToUTF8(j_group_id);
metadata.distance_estimate = distance_estimate;
metadata.scan_timestamp = base::Time::FromJavaTime(scan_timestamp);
}
std::unique_ptr<physical_web::MetadataList>
PhysicalWebCollection::GetMetadataList() {
DCHECK(!accessed_once_);
accessed_once_ = true;
return std::move(metadata_list_);
}
PhysicalWebDataSourceAndroid::PhysicalWebDataSourceAndroid() {
Initialize();
}
PhysicalWebDataSourceAndroid::~PhysicalWebDataSourceAndroid() {}
void PhysicalWebDataSourceAndroid::Initialize() {
JNIEnv* env = AttachCurrentThread();
// Cache a reference to the singleton instance of UrlManager.
url_manager_.Reset(Java_UrlManager_getInstance(env));
DCHECK(url_manager_.obj());
}
void PhysicalWebDataSourceAndroid::StartDiscovery(
bool network_request_enabled) {
// On Android, scanning is started and stopped through the Java layer.
NOTREACHED();
}
void PhysicalWebDataSourceAndroid::StopDiscovery() {
// On Android, scanning is started and stopped through the Java layer.
NOTREACHED();
}
std::unique_ptr<physical_web::MetadataList>
PhysicalWebDataSourceAndroid::GetMetadataList() {
JNIEnv* env = AttachCurrentThread();
auto pw_collection = std::make_unique<PhysicalWebCollection>();
Java_UrlManager_getPwCollection(env, url_manager_,
reinterpret_cast<long>(pw_collection.get()));
return pw_collection->GetMetadataList();
}
bool PhysicalWebDataSourceAndroid::HasUnresolvedDiscoveries() {
NOTIMPLEMENTED();
return false;
}
void PhysicalWebDataSourceAndroid::OnFound(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_url) {
NotifyOnFound(GURL(ConvertJavaStringToUTF8(env, j_url)));
}
void PhysicalWebDataSourceAndroid::OnLost(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_url) {
NotifyOnLost(GURL(ConvertJavaStringToUTF8(env, j_url)));
}
void PhysicalWebDataSourceAndroid::OnDistanceChanged(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_url,
jdouble distance_estimate) {
NotifyOnDistanceChanged(GURL(ConvertJavaStringToUTF8(env, j_url)),
distance_estimate);
}
static jlong JNI_UrlManager_Init(JNIEnv* env,
const JavaParamRef<jobject>& obj) {
physical_web::PhysicalWebDataSource* data_source =
g_browser_process->GetPhysicalWebDataSource();
return reinterpret_cast<intptr_t>(data_source);
}