blob: fe2af45d7d1ec32e41ee471311d1faeaca44506e [file] [log] [blame]
// Copyright 2019 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/send_tab_to_self/send_tab_to_self_model_observer_bridge.h"
#include <string>
#include <vector>
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/time/time.h"
#include "chrome/browser/android/send_tab_to_self/send_tab_to_self_entry_bridge.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
#include "components/send_tab_to_self/send_tab_to_self_entry.h"
#include "components/send_tab_to_self/send_tab_to_self_model.h"
#include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
#include "content/public/browser/web_contents.h"
#include "jni/SendTabToSelfModelObserverBridge_jni.h"
#include "url/gurl.h"
using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::JavaRef;
using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef;
namespace send_tab_to_self {
SendTabToSelfModelObserverBridge::SendTabToSelfModelObserverBridge(
JNIEnv* env,
const JavaRef<jobject>& obj,
const JavaRef<jobject>& j_profile)
: weak_java_ref_(env, obj), send_tab_to_self_model_(nullptr) {
Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
send_tab_to_self_model_ = SendTabToSelfSyncServiceFactory::GetInstance()
->GetForProfile(profile)
->GetSendTabToSelfModel();
send_tab_to_self_model_->AddObserver(this);
}
static jlong JNI_SendTabToSelfModelObserverBridge_Init(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& j_profile) {
SendTabToSelfModelObserverBridge* bridge =
new SendTabToSelfModelObserverBridge(env, obj, j_profile);
return reinterpret_cast<intptr_t>(bridge);
}
void SendTabToSelfModelObserverBridge::Destroy(JNIEnv*,
const JavaParamRef<jobject>&) {
delete this;
}
SendTabToSelfModelObserverBridge::~SendTabToSelfModelObserverBridge() {
send_tab_to_self_model_->RemoveObserver(this);
}
void SendTabToSelfModelObserverBridge::SendTabToSelfModelLoaded() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
if (obj.is_null()) {
return;
}
Java_SendTabToSelfModelObserverBridge_modelLoaded(env, obj);
}
void SendTabToSelfModelObserverBridge::EntriesAddedRemotely(
const std::vector<const SendTabToSelfEntry*>& new_entries) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
if (obj.is_null()) {
return;
}
ScopedJavaLocalRef<jobject> j_entry_list =
Java_SendTabToSelfModelObserverBridge_createEmptyJavaEntryList(env, obj);
for (std::vector<const SendTabToSelfEntry*>::const_iterator it =
new_entries.begin();
it != new_entries.end(); ++it) {
Java_SendTabToSelfModelObserverBridge_addToEntryList(
env, obj, j_entry_list, CreateJavaSendTabToSelfEntry(env, *it));
}
Java_SendTabToSelfModelObserverBridge_entriesAddedRemotely(env, obj,
j_entry_list);
}
void SendTabToSelfModelObserverBridge::EntriesRemovedRemotely(
const std::vector<std::string>& guids) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
if (obj.is_null()) {
return;
}
ScopedJavaLocalRef<jobject> j_guid_list =
Java_SendTabToSelfModelObserverBridge_createEmptyJavaGuidList(env, obj);
for (std::vector<const std::string>::iterator it = guids.begin();
it != guids.end(); ++it) {
ScopedJavaLocalRef<jstring> j_guid = ConvertUTF8ToJavaString(env, *it);
Java_SendTabToSelfModelObserverBridge_addToGuidList(env, obj, j_guid_list,
j_guid);
}
Java_SendTabToSelfModelObserverBridge_entriesRemovedRemotely(env, obj,
j_guid_list);
}
} // namespace send_tab_to_self