Classes for work with sync devices
This commit is contained in:
@@ -111,6 +111,7 @@ brave_java_sources = [
|
||||
"../../brave/android/java/org/chromium/chrome/browser/site_settings/BraveSiteSettingsPreferencesBase.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/site_settings/DesktopModePreferences.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/site_settings/PlayYTVideoInBrowserPreferences.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/sync/BraveSyncDevices.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/toolbar/BraveHomeButton.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/toolbar/bottom/BookmarksButton.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/toolbar/bottom/BraveBottomToolbarConfiguration.java",
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
/* Copyright (c) 2020 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.chromium.chrome.browser.sync;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import org.chromium.base.Log;
|
||||
import org.chromium.base.ThreadUtils;
|
||||
import org.chromium.base.annotations.CalledByNative;
|
||||
import org.chromium.base.annotations.JNINamespace;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
@JNINamespace("chrome::android")
|
||||
public class BraveSyncDevices {
|
||||
public static final String TAG = "SYNC";
|
||||
private long mNativeBraveSyncDevicesAndroid = 0;
|
||||
|
||||
private static BraveSyncDevices sBraveSyncDevices;
|
||||
private static boolean sInitialized;
|
||||
|
||||
public static BraveSyncDevices get() {
|
||||
ThreadUtils.assertOnUiThread();
|
||||
if (!sInitialized) {
|
||||
sBraveSyncDevices = new BraveSyncDevices();
|
||||
sInitialized = true;
|
||||
}
|
||||
return sBraveSyncDevices;
|
||||
}
|
||||
|
||||
public BraveSyncDevices() {
|
||||
Init();
|
||||
}
|
||||
|
||||
@CalledByNative
|
||||
private void setNativePtr(long nativePtr) {
|
||||
assert mNativeBraveSyncDevicesAndroid == 0;
|
||||
mNativeBraveSyncDevicesAndroid = nativePtr;
|
||||
}
|
||||
|
||||
private void Init() {
|
||||
if (mNativeBraveSyncDevicesAndroid == 0) {
|
||||
nativeInit();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finalize() {
|
||||
Destroy();
|
||||
}
|
||||
|
||||
private void Destroy() {
|
||||
if (mNativeBraveSyncDevicesAndroid != 0) {
|
||||
nativeDestroy(mNativeBraveSyncDevicesAndroid);
|
||||
mNativeBraveSyncDevicesAndroid = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener for the devices syncchain changes.
|
||||
*/
|
||||
public interface DeviceInfoChangedListener {
|
||||
// Invoked when the device info has changed.
|
||||
public void deviceInfoChanged();
|
||||
}
|
||||
|
||||
// Sync state changes more often than listeners are added/removed, so using CopyOnWrite.
|
||||
private final List<DeviceInfoChangedListener> mDeviceInfoListeners =
|
||||
new CopyOnWriteArrayList<DeviceInfoChangedListener>();
|
||||
|
||||
public void addDeviceInfoChangedListener(DeviceInfoChangedListener listener) {
|
||||
ThreadUtils.assertOnUiThread();
|
||||
mDeviceInfoListeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeDeviceInfoChangedListener(DeviceInfoChangedListener listener) {
|
||||
ThreadUtils.assertOnUiThread();
|
||||
mDeviceInfoListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the state of the native sync engine has changed, so various
|
||||
* UI elements can update themselves.
|
||||
*/
|
||||
@CalledByNative
|
||||
protected void deviceInfoChanged() {
|
||||
for (DeviceInfoChangedListener listener : mDeviceInfoListeners) {
|
||||
listener.deviceInfoChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public class SyncDeviceInfo {
|
||||
public String mName;
|
||||
public boolean mIsCurrentDevice;
|
||||
public String mType;
|
||||
public Date mLastUpdatedTimestamp;
|
||||
}
|
||||
|
||||
public ArrayList<SyncDeviceInfo> GetSyncDeviceList() {
|
||||
ArrayList<SyncDeviceInfo> deviceList = new ArrayList<SyncDeviceInfo>();
|
||||
String json = nativeGetSyncDeviceListJson(mNativeBraveSyncDevicesAndroid);
|
||||
// Add root element to make it real JSON, otherwise getJSONArray cannot parse it
|
||||
json = "{\"devices\":" + json + "}";
|
||||
try {
|
||||
JSONObject result = new JSONObject(json);
|
||||
JSONArray devices = result.getJSONArray("devices");
|
||||
Log.i(TAG, "GetSyncDeviceList devices length is " + devices.length());
|
||||
for (int i = 0; i < devices.length(); i++) {
|
||||
SyncDeviceInfo deviceInfo = new SyncDeviceInfo();
|
||||
JSONObject device = devices.getJSONObject(i);
|
||||
deviceInfo.mName = device.getString("name");
|
||||
deviceInfo.mIsCurrentDevice = device.getBoolean("isCurrentDevice");
|
||||
deviceInfo.mType = device.getString("type");
|
||||
long lastUpdatedTimestamp = device.getLong("lastUpdatedTimestamp");
|
||||
deviceInfo.mLastUpdatedTimestamp = new Date(lastUpdatedTimestamp);
|
||||
deviceList.add(deviceInfo);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "GetDeviceNameByObjectId JSONException error " + e);
|
||||
} catch (IllegalStateException e) {
|
||||
Log.e(TAG, "GetDeviceNameByObjectId IllegalStateException error " + e);
|
||||
}
|
||||
return deviceList;
|
||||
}
|
||||
|
||||
private native void nativeInit();
|
||||
private native void nativeDestroy(long nativeBraveSyncDevicesAndroid);
|
||||
|
||||
private native String nativeGetSyncDeviceListJson(long nativeBraveSyncDevicesAndroid);
|
||||
}
|
||||
@@ -242,6 +242,16 @@ source_set("browser_process") {
|
||||
]
|
||||
}
|
||||
|
||||
if (enable_brave_sync) {
|
||||
sources += [
|
||||
"sync/brave_sync_devices_android.cc",
|
||||
"sync/brave_sync_devices_android.h",
|
||||
]
|
||||
deps += [
|
||||
"//components/sync_device_info",
|
||||
]
|
||||
}
|
||||
|
||||
deps += [
|
||||
"//brave/browser/android/preferences",
|
||||
"//brave/build/android:jni_headers",
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/* Copyright (c) 2020 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "brave/browser/sync/brave_sync_devices_android.h"
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "base/android/jni_android.h"
|
||||
#include "base/android/jni_string.h"
|
||||
#include "base/json/json_writer.h"
|
||||
|
||||
#include "brave/build/android/jni_headers/BraveSyncDevices_jni.h"
|
||||
|
||||
#include "chrome/browser/profiles/profile_manager.h"
|
||||
#include "chrome/browser/sync/device_info_sync_service_factory.h"
|
||||
|
||||
#include "components/sync_device_info/device_info_sync_service.h"
|
||||
#include "components/sync_device_info/device_info_tracker.h"
|
||||
#include "components/sync_device_info/local_device_info_provider.h"
|
||||
|
||||
namespace chrome {
|
||||
namespace android {
|
||||
|
||||
BraveSyncDevicesAndroid::BraveSyncDevicesAndroid(
|
||||
JNIEnv* env, const base::android::JavaRef<jobject>& obj) :
|
||||
weak_java_brave_sync_worker_(env, obj) {
|
||||
Java_BraveSyncDevices_setNativePtr(env, obj,
|
||||
reinterpret_cast<intptr_t>(this));
|
||||
|
||||
profile_ =
|
||||
ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
|
||||
DCHECK_NE(profile_, nullptr);
|
||||
|
||||
syncer::DeviceInfoTracker* tracker =
|
||||
DeviceInfoSyncServiceFactory::GetForProfile(profile_)
|
||||
->GetDeviceInfoTracker();
|
||||
DCHECK(tracker);
|
||||
if (tracker) {
|
||||
device_info_tracker_observer_.Add(tracker);
|
||||
}
|
||||
}
|
||||
|
||||
BraveSyncDevicesAndroid::~BraveSyncDevicesAndroid() {
|
||||
// Observer will be removed by ScopedObserver
|
||||
}
|
||||
|
||||
void BraveSyncDevicesAndroid::Destroy(JNIEnv* env,
|
||||
const base::android::JavaParamRef<jobject>& jcaller) {
|
||||
delete this;
|
||||
}
|
||||
|
||||
void BraveSyncDevicesAndroid::OnDeviceInfoChange() {
|
||||
// Notify Java code
|
||||
JNIEnv* env = base::android::AttachCurrentThread();
|
||||
Java_BraveSyncDevices_deviceInfoChanged(env,
|
||||
weak_java_brave_sync_worker_.get(env));
|
||||
}
|
||||
|
||||
base::Value BraveSyncDevicesAndroid::GetSyncDeviceList() {
|
||||
auto* device_info_service =
|
||||
DeviceInfoSyncServiceFactory::GetForProfile(profile_);
|
||||
syncer::DeviceInfoTracker* tracker =
|
||||
device_info_service->GetDeviceInfoTracker();
|
||||
DCHECK(tracker);
|
||||
const syncer::DeviceInfo* local_device_info = device_info_service
|
||||
->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo();
|
||||
|
||||
base::Value device_list(base::Value::Type::LIST);
|
||||
|
||||
for (const auto& device : tracker->GetAllDeviceInfo()) {
|
||||
auto device_value = base::Value::FromUniquePtrValue(device->ToValue());
|
||||
bool is_current_device = local_device_info
|
||||
? local_device_info->guid() == device->guid()
|
||||
: false;
|
||||
device_value.SetBoolKey("isCurrentDevice", is_current_device);
|
||||
device_list.Append(std::move(device_value));
|
||||
}
|
||||
|
||||
return device_list;
|
||||
}
|
||||
|
||||
base::android::ScopedJavaLocalRef<jstring>
|
||||
BraveSyncDevicesAndroid::GetSyncDeviceListJson(JNIEnv* env,
|
||||
const base::android::JavaParamRef<jobject>& jcaller) {
|
||||
base::Value device_list = GetSyncDeviceList();
|
||||
std::string json_string;
|
||||
if (!base::JSONWriter::Write(device_list, &json_string)) {
|
||||
VLOG(1) << "Writing as JSON failed. Passing empty string to Java code.";
|
||||
json_string = std::string();
|
||||
}
|
||||
|
||||
return base::android::ConvertUTF8ToJavaString(env, json_string);
|
||||
}
|
||||
|
||||
static void JNI_BraveSyncDevices_Init(
|
||||
JNIEnv* env,
|
||||
const base::android::JavaParamRef<jobject>& jcaller) {
|
||||
new BraveSyncDevicesAndroid(env, jcaller);
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
} // namespace chrome
|
||||
@@ -0,0 +1,49 @@
|
||||
/* Copyright (c) 2020 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef BRAVE_BROWSER_SYNC_BRAVE_SYNC_DEVICES_ANDROID_H_
|
||||
#define BRAVE_BROWSER_SYNC_BRAVE_SYNC_DEVICES_ANDROID_H_
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#include "base/android/jni_weak_ref.h"
|
||||
#include "base/scoped_observer.h"
|
||||
#include "base/values.h"
|
||||
#include "chrome/browser/sync/profile_sync_service_android.h"
|
||||
#include "components/sync_device_info/device_info_tracker.h"
|
||||
|
||||
namespace chrome {
|
||||
namespace android {
|
||||
|
||||
class BraveSyncDevicesAndroid : public syncer::DeviceInfoTracker::Observer {
|
||||
public:
|
||||
BraveSyncDevicesAndroid(JNIEnv* env,
|
||||
const base::android::JavaRef<jobject>& obj);
|
||||
virtual ~BraveSyncDevicesAndroid();
|
||||
|
||||
void Destroy(JNIEnv* env,
|
||||
const base::android::JavaParamRef<jobject>& jcaller);
|
||||
|
||||
base::android::ScopedJavaLocalRef<jstring> GetSyncDeviceListJson(
|
||||
JNIEnv* env,
|
||||
const base::android::JavaParamRef<jobject>& jcaller);
|
||||
|
||||
private:
|
||||
// syncer::DeviceInfoTracker::Observer
|
||||
void OnDeviceInfoChange() override;
|
||||
|
||||
base::Value GetSyncDeviceList();
|
||||
|
||||
ScopedObserver<syncer::DeviceInfoTracker, syncer::DeviceInfoTracker::Observer>
|
||||
device_info_tracker_observer_{this};
|
||||
|
||||
JavaObjectWeakGlobalRef weak_java_brave_sync_worker_;
|
||||
Profile* profile_ = nullptr;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
} // namespace chrome
|
||||
|
||||
#endif // BRAVE_BROWSER_SYNC_BRAVE_SYNC_DEVICES_ANDROID_H_
|
||||
@@ -155,5 +155,6 @@ generate_jni("jni_headers") {
|
||||
"//brave/android/java/org/chromium/chrome/browser/preferences/BravePrefServiceBridge.java",
|
||||
"//brave/android/java/org/chromium/chrome/browser/preferences/website/BraveShieldsContentSettings.java",
|
||||
"//brave/android/java/org/chromium/chrome/browser/signin/BraveSigninManager.java",
|
||||
"//brave/android/java/org/chromium/chrome/browser/sync/BraveSyncDevices.java",
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user