Commit 9cd345a2 authored by Tanya Gupta's avatar Tanya Gupta Committed by Commit Bot

[SendTabToSelf] Created a JNI layer that listens for STTS model changes.

This JNI layer is needed for the SendTabToSelfInfobarController to
listen for model changes  and show an infobar accordingly. This required
refactoring the code that converted the native SendTabToSelfEntry to
the Java version.

Change-Id: I2b63c2bfbfa66ac70a2fd320ae7d9652b1ff996b
Bug: 949233
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1611223Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Reviewed-by: default avatarJeffrey Cohen <jeffreycohen@chromium.org>
Reviewed-by: default avatarsebsg <sebsg@chromium.org>
Commit-Queue: Tanya Gupta <tgupta@chromium.org>
Cr-Commit-Position: refs/heads/master@{#660950}
parent 732d06ba
......@@ -2609,6 +2609,7 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridge.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfEntry.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfInfoBar.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java",
"java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
"java/src/org/chromium/chrome/browser/signin/IdentityServicesProvider.java",
"java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java",
......
......@@ -1348,6 +1348,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfEntry.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfInfoBar.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfInfoBarController.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java",
"java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java",
"java/src/org/chromium/chrome/browser/services/AndroidEduAndChildAccountHelper.java",
......
// 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.
package org.chromium.chrome.browser.send_tab_to_self;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JCaller;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.profiles.Profile;
import java.util.ArrayList;
import java.util.List;
/**
* Bridge to interface with send_tab_to_self_model_observer_bridge which interacts with the
* corresponding model observer. This is used by the SendTabToSelfInfobarController to listen
* for model changes and show an infobar to the user.
*/
@JNINamespace("send_tab_to_self")
public class SendTabToSelfModelObserverBridge {
private long mNativeModelObserverBridge;
private final List<SendTabToSelfObserver> mObservers;
/**
* Java version of the observer that implementors can use to listen for model changes.
*/
public abstract class SendTabToSelfObserver {
/**
* Corresponds to the EntriesAddedRemotely function in SendTabToSelfModelObserver.
* @param entries Entries removed remotely.
*/
public abstract void entriesAddedRemotely(List<SendTabToSelfEntry> entries);
/**
* Corresponds to the EntriesRemovedRemotely function in SendTabToSelfModelObserver.
* @param guids Guids of the entries that were removed.
*/
public abstract void entriesRemovedRemotely(List<String> guids);
/**
* Corresponds to the ModelLoaded function in SendTabToSelfModelObserver.
* @return whether the model is loaded or not.
*/
public abstract boolean modelLoaded();
}
/**
* Constructs a new bridge for the profile provided.
* @param profile Profile to construct the bridge for.
*/
public SendTabToSelfModelObserverBridge(Profile profile) {
Natives jni = SendTabToSelfModelObserverBridgeJni.get();
mNativeModelObserverBridge = jni.init(this, profile);
mObservers = new ArrayList<SendTabToSelfObserver>();
}
/** Destroys this instance so no further calls can be executed. */
public void destroy() {
if (mNativeModelObserverBridge != 0) {
Natives jni = SendTabToSelfModelObserverBridgeJni.get();
jni.destroy(this, mNativeModelObserverBridge);
mNativeModelObserverBridge = 0;
}
}
/**
* Adds an observer to listen for model changes.
* @param observer Observer to listen for model changes.
*/
public void addObserver(SendTabToSelfObserver observer) {
mObservers.add(observer);
}
/**
* Removes an observer to no longer listen for model changes.
* @param observer Observer to remove.
*/
public void removeObserver(SendTabToSelfObserver observer) {
mObservers.remove(observer);
}
/**
* @return An empty array list to be populated by native code with SendTabToSelfEntries.
*/
@CalledByNative
private List<SendTabToSelfEntry> createEmptyJavaEntryList() {
return new ArrayList<SendTabToSelfEntry>();
}
/**
* Adds an entry to the list of entries. Called by native code.
* @param entries List to add to.
* @param entry Entry to add to the list.
*/
@CalledByNative
private void addToEntryList(List<SendTabToSelfEntry> entries, SendTabToSelfEntry entry) {
entries.add(entry);
}
/**
* @return An empty array list to be populated by native code with Guids (strings).
*/
@CalledByNative
private List<String> createEmptyJavaGuidList() {
return new ArrayList<String>();
}
/**
* Adds a guid to the list of Guids. Called by native code.
* @param guids List to add to.
* @param guid Guid to add to the list.
*/
@CalledByNative
private void addToGuidList(List<String> guids, String guid) {
guids.add(guid);
}
/**
* Called by native code in send_tab_to_self_model_observer when the model has a new entry.
* @param newEntries The new entries pushed by the model.
*/
@CalledByNative
private void entriesAddedRemotely(List<SendTabToSelfEntry> newEntries) {
for (SendTabToSelfObserver observer : mObservers) {
observer.entriesAddedRemotely(newEntries);
}
}
/**
* Called by the native code in send_tab_to_self_model_observer when the model has a deletion
* update.
* @param guids Guids corresponding to the entries that were removed.
*/
@CalledByNative
private void entriesRemovedRemotely(List<String> guids) {
for (SendTabToSelfObserver observer : mObservers) {
observer.entriesRemovedRemotely(guids);
}
}
/**
* Called by the native code in send_tab_to_self_model_observer when the model is loaded.
*/
@CalledByNative
private void modelLoaded() {
for (SendTabToSelfObserver observer : mObservers) {
observer.modelLoaded();
}
}
@NativeMethods
interface Natives {
long init(@JCaller SendTabToSelfModelObserverBridge bridge, Profile profile);
void destroy(@JCaller SendTabToSelfModelObserverBridge bridge,
long nativeSendTabToSelfModelObserverBridge);
}
}
......@@ -2523,8 +2523,12 @@ jumbo_split_static_library("browser") {
"android/send_tab_to_self/android_notification_handler.cc",
"android/send_tab_to_self/android_notification_handler.h",
"android/send_tab_to_self/send_tab_to_self_android_bridge.cc",
"android/send_tab_to_self/send_tab_to_self_entry_bridge.cc",
"android/send_tab_to_self/send_tab_to_self_entry_bridge.h",
"android/send_tab_to_self/send_tab_to_self_infobar.cc",
"android/send_tab_to_self/send_tab_to_self_infobar.h",
"android/send_tab_to_self/send_tab_to_self_model_observer_bridge.cc",
"android/send_tab_to_self/send_tab_to_self_model_observer_bridge.h",
"android/service_tab_launcher.cc",
"android/service_tab_launcher.h",
"android/sessions/session_tab_helper_android.cc",
......
......@@ -9,10 +9,10 @@
#include "base/android/jni_string.h"
#include "base/metrics/histogram_macros.h"
#include "base/time/time.h"
#include "chrome/browser/android/send_tab_to_self/send_tab_to_self_entry_bridge.h"
#include "chrome/browser/android/send_tab_to_self/send_tab_to_self_infobar.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/send_tab_to_self/send_tab_to_self_client_service.h"
#include "chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.h"
#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
#include "chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
......@@ -22,7 +22,6 @@
#include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
#include "content/public/browser/web_contents.h"
#include "jni/SendTabToSelfAndroidBridge_jni.h"
#include "jni/SendTabToSelfEntry_jni.h"
#include "url/gurl.h"
using base::android::AttachCurrentThread;
......@@ -39,19 +38,6 @@ namespace send_tab_to_self {
namespace {
ScopedJavaLocalRef<jobject> CreateJavaSendTabToSelfEntry(
JNIEnv* env,
const SendTabToSelfEntry* entry) {
return Java_SendTabToSelfEntry_createSendTabToSelfEntry(
env, ConvertUTF8ToJavaString(env, entry->GetGUID()),
ConvertUTF8ToJavaString(env, entry->GetURL().spec()),
ConvertUTF8ToJavaString(env, entry->GetTitle()),
entry->GetSharedTime().ToJavaTime(),
entry->GetOriginalNavigationTime().ToJavaTime(),
ConvertUTF8ToJavaString(env, entry->GetDeviceName()),
ConvertUTF8ToJavaString(env, entry->GetTargetDeviceSyncCacheGuid()));
}
void LogModelLoadedInTime(bool status) {
UMA_HISTOGRAM_BOOLEAN("SendTabToSelf.Sync.ModelLoadedInTime", status);
}
......@@ -120,7 +106,6 @@ static ScopedJavaLocalRef<jobject> JNI_SendTabToSelfAndroidBridge_AddEntry(
if (persisted_entry == nullptr) {
return nullptr;
}
return CreateJavaSendTabToSelfEntry(env, persisted_entry);
}
......
// 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_entry_bridge.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "components/send_tab_to_self/send_tab_to_self_entry.h"
#include "jni/SendTabToSelfEntry_jni.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 {
ScopedJavaLocalRef<jobject> CreateJavaSendTabToSelfEntry(
JNIEnv* env,
const SendTabToSelfEntry* entry) {
return Java_SendTabToSelfEntry_createSendTabToSelfEntry(
env, ConvertUTF8ToJavaString(env, entry->GetGUID()),
ConvertUTF8ToJavaString(env, entry->GetURL().spec()),
ConvertUTF8ToJavaString(env, entry->GetTitle()),
entry->GetSharedTime().ToJavaTime(),
entry->GetOriginalNavigationTime().ToJavaTime(),
ConvertUTF8ToJavaString(env, entry->GetDeviceName()),
ConvertUTF8ToJavaString(env, entry->GetTargetDeviceSyncCacheGuid()));
}
} // namespace send_tab_to_self
// 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.
#ifndef CHROME_BROWSER_ANDROID_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_ENTRY_BRIDGE_H_
#define CHROME_BROWSER_ANDROID_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_ENTRY_BRIDGE_H_
#include "base/android/jni_android.h"
#include "base/macros.h"
namespace send_tab_to_self {
class SendTabToSelfEntry;
// Function to convert the native version of SendTabToSelfEntry into the Java
// version.
base::android::ScopedJavaLocalRef<jobject> CreateJavaSendTabToSelfEntry(
JNIEnv* env,
const SendTabToSelfEntry* entry);
} // namespace send_tab_to_self
#endif // CHROME_BROWSER_ANDROID_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_ENTRY_BRIDGE_H_
// 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
// 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.
#ifndef CHROME_BROWSER_ANDROID_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_MODEL_OBSERVER_BRIDGE_H_
#define CHROME_BROWSER_ANDROID_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_MODEL_OBSERVER_BRIDGE_H_
#include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h"
#include "base/macros.h"
#include "components/send_tab_to_self/send_tab_to_self_model_observer.h"
namespace send_tab_to_self {
class SendTabToSelfModel;
// The delegate to observe for SendTabToSelf model changes and forward them to
// observers of this class. The class is owned by the SendTabToSelf Java
// counterpart and lives for the duration of the life of that class.
class SendTabToSelfModelObserverBridge : public SendTabToSelfModelObserver {
public:
SendTabToSelfModelObserverBridge(
JNIEnv* env,
const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jobject>& j_profile);
void Destroy(JNIEnv*, const base::android::JavaParamRef<jobject>&);
// SendTabToSelfModelObserver implementation.
void SendTabToSelfModelLoaded() override;
void EntriesAddedRemotely(
const std::vector<const SendTabToSelfEntry*>& new_entries) override;
void EntriesRemovedRemotely(const std::vector<std::string>& guids) override;
protected:
~SendTabToSelfModelObserverBridge() override;
private:
JavaObjectWeakGlobalRef weak_java_ref_;
// Set during the constructor and owned by the SendTabToSelfSyncServiceFactory
// is based off the KeyedServiceFactory which lives for the length of the
// profile. SendTabToSelf is not supported for the Incognito profile.
SendTabToSelfModel* send_tab_to_self_model_;
DISALLOW_COPY_AND_ASSIGN(SendTabToSelfModelObserverBridge);
};
} // namespace send_tab_to_self
#endif // CHROME_BROWSER_ANDROID_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_MODEL_OBSERVER_BRIDGE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment