Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3589)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ForeignSessionHelper.java

Issue 19874002: [Android] Expose foreign session sync related funtionalities through JNI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: findbug fix (dead code removal) Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/android/chrome_jni_registrar.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/ForeignSessionHelper.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ForeignSessionHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ForeignSessionHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..4faf66b2eb9bdce6335506cdba843c01e8069a4c
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ForeignSessionHelper.java
@@ -0,0 +1,212 @@
+// Copyright 2013 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;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.chrome.browser.profiles.Profile;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * This class exposes to Java information about sessions, windows, and tabs on the user's synced
+ * devices.
+ */
+public class ForeignSessionHelper {
+ private int mNativeForeignSessionHelper;
+
+ /**
+ * Callback interface for getting notified when foreign session sync is updated.
+ */
+ public interface ForeignSessionCallback {
+ /**
+ * This method will be called every time foreign session sync is updated.
+ *
+ * It's a good place to call {@link ForeignSessionHelper#getForeignSessions()} to get the
+ * updated information.
+ */
+ @CalledByNative("ForeignSessionCallback")
+ public void onUpdated();
+ }
+
+ /**
+ * Represents synced foreign session.
+ */
+ public static class ForeignSession {
+ public final String tag;
+ public final String name;
+ public final String deviceType;
+ public final long modifiedTime;
+ public final List<ForeignSessionWindow> windows = new ArrayList<ForeignSessionWindow>();
+
+ private ForeignSession(String tag, String name, String deviceType, long modifiedTime) {
+ this.tag = tag;
+ this.name = name;
+ this.deviceType = deviceType;
+ this.modifiedTime = modifiedTime;
+ }
+ }
+
+ /**
+ * Represents synced foreign window. Note that desktop Chrome can have multiple windows in a
+ * session.
+ */
+ public static class ForeignSessionWindow {
+ public final long timestamp;
+ public final int sessionId;
+ public final List<ForeignSessionTab> tabs = new ArrayList<ForeignSessionTab>();
+
+ private ForeignSessionWindow(long timestamp, int sessionId) {
+ this.timestamp = timestamp;
+ this.sessionId = sessionId;
+ }
+ }
+
+ /**
+ * Represents synced foreign tab.
+ */
+ public static class ForeignSessionTab {
+ public final String url;
+ public final String title;
+ public final long timestamp;
+ public final int id;
+
+ private ForeignSessionTab(String url, String title, long timestamp, int id) {
+ this.url = url;
+ this.title = title;
+ this.timestamp = timestamp;
+ this.id = id;
+ }
+ }
+
+ @CalledByNative
+ private static ForeignSession pushSession(
+ List<ForeignSession> sessions, String tag, String name, String deviceType,
+ long modifiedTime) {
+ ForeignSession session = new ForeignSession(tag, name, deviceType, modifiedTime);
+ sessions.add(session);
+ return session;
+ }
+
+ @CalledByNative
+ private static ForeignSessionWindow pushWindow(
+ ForeignSession session, long timestamp, int sessionId) {
+ ForeignSessionWindow window = new ForeignSessionWindow(timestamp, sessionId);
+ session.windows.add(window);
+ return window;
+ }
+
+ @CalledByNative
+ private static void pushTab(
+ ForeignSessionWindow window, String url, String title, long timestamp, int sessionId) {
+ ForeignSessionTab tab = new ForeignSessionTab(url, title, timestamp, sessionId);
+ window.tabs.add(tab);
+ }
+
+ /**
+ * Initialize this class with the given profile.
+ * @param profile Profile that will be used for syncing.
+ */
+ public ForeignSessionHelper(Profile profile) {
+ mNativeForeignSessionHelper = nativeInit(profile);
+ }
+
+ /**
+ * Clean up the C++ side of this class. After the call, this class instance shouldn't be used.
+ */
+ public void destroy() {
+ assert mNativeForeignSessionHelper != 0;
+ nativeDestroy(mNativeForeignSessionHelper);
+ }
+
+ @Override
+ protected void finalize() {
+ // Just to make sure that we called destroy() before the java garbage collection picks up.
+ assert mNativeForeignSessionHelper == 0;
+ }
+
+ /**
+ * @return {@code True} iff Tab sync is enabled.
+ */
+ public boolean isTabSyncEnabled() {
+ return nativeIsTabSyncEnabled(mNativeForeignSessionHelper);
+ }
+
+ /**
+ * Sets callback instance that will be called on every foreign session sync update.
+ */
+ public void setOnForeignSessionCallback(ForeignSessionCallback callback) {
+ nativeSetOnForeignSessionCallback(mNativeForeignSessionHelper, callback);
+ }
+
+ /**
+ * @return The list of synced foreign sessions. {@code null} iff it fails to get them for some
+ * reason.
+ */
+ public List<ForeignSession> getForeignSessions() {
+ List<ForeignSession> result = new ArrayList<ForeignSession>();
+ boolean received = nativeGetForeignSessions(mNativeForeignSessionHelper, result);
+ if (received) {
+ // Sort sessions from most recent to least recent.
+ Collections.sort(result, new Comparator<ForeignSession>() {
+ @Override
+ public int compare(ForeignSession lhs, ForeignSession rhs) {
+ return lhs.modifiedTime < rhs.modifiedTime ? 1 :
+ (lhs.modifiedTime == rhs.modifiedTime ? 0: -1);
+ }
+ });
+ } else {
+ result = null;
+ }
+
+ return result;
+ }
+
+ /**
+ * Opens the given foreign tab in a new tab.
+ * @param session Session that the target tab belongs to.
+ * @param tab Target tab to open.
+ * @return {@code True} iff the tab is successfully opened.
+ */
+ public boolean openForeignSessionTab(ForeignSession session, ForeignSessionTab tab) {
+ return nativeOpenForeignSessionTab(mNativeForeignSessionHelper, session.tag, tab.id);
+ }
+
+ /**
+ * Set the given session collapsed or uncollapsed in preferences.
+ * @param session Session to set collapsed or uncollapsed.
+ * @param isCollapsed {@code True} iff we want the session to be collapsed.
+ */
+ public void setForeignSessionCollapsed(ForeignSession session, boolean isCollapsed) {
+ nativeSetForeignSessionCollapsed(mNativeForeignSessionHelper, session.tag, isCollapsed);
+ }
+
+ /**
+ * Remove Foreign session to display. Note that it will be reappear on the next sync.
+ *
+ * This is mainly for when user wants to delete very old session that won't be used or syned in
+ * the future.
+ * @param session Session to be deleted.
+ */
+ public void deleteForeignSession(ForeignSession session) {
+ nativeDeleteForeignSession(mNativeForeignSessionHelper, session.tag);
+ }
+
+ private static native int nativeInit(Profile profile);
+ private static native void nativeDestroy(int nativeForeignSessionHelper);
+ private static native boolean nativeIsTabSyncEnabled(int nativeForeignSessionHelper);
+ private static native void nativeSetOnForeignSessionCallback(
+ int nativeForeignSessionHelper, ForeignSessionCallback callback);
+ private static native boolean nativeGetForeignSessions(int nativeForeignSessionHelper,
+ List<ForeignSession> resultSessions);
+ private static native boolean nativeOpenForeignSessionTab(
+ int nativeForeignSessionHelper, String sessionTag, int tabId);
+ private static native void nativeSetForeignSessionCollapsed(
+ int nativeForeignSessionHelper, String sessionTag, boolean isCollapsed);
+ private static native void nativeDeleteForeignSession(
+ int nativeForeignSessionHelper, String sessionTag);
+}
« no previous file with comments | « no previous file | chrome/browser/android/chrome_jni_registrar.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698