Classes for work with sync devices

This commit is contained in:
AlexeyBarabash
2020-06-29 17:12:57 +03:00
parent a10b5eebcb
commit ef4e4a8c4a
6 changed files with 304 additions and 0 deletions
+1
View File
@@ -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);
}
+10
View File
@@ -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",
+105
View File
@@ -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
+49
View File
@@ -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_
+1
View File
@@ -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",
]
}