1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)package org.chromium.chrome.browser; 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import org.chromium.base.CalledByNative; 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import org.chromium.chrome.browser.profiles.Profile; 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import java.util.ArrayList; 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import java.util.Collections; 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import java.util.Comparator; 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import java.util.List; 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)/** 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * This class exposes to Java information about sessions, windows, and tabs on the user's synced 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * devices. 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)public class ForeignSessionHelper { 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private long mNativeForeignSessionHelper; 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Callback interface for getting notified when foreign session sync is updated. 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public interface ForeignSessionCallback { 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * This method will be called every time foreign session sync is updated. 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * It's a good place to call {@link ForeignSessionHelper#getForeignSessions()} to get the 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * updated information. 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @CalledByNative("ForeignSessionCallback") 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public void onUpdated(); 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Represents synced foreign session. 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public static class ForeignSession { 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Please keep in sync with synced_session.h 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_UNSET = 0; 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_WIN = 1; 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_MACOSX = 2; 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_LINUX = 3; 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_CHROMEOS = 4; 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_OTHER = 5; 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_PHONE = 6; 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public static final int DEVICE_TYPE_TABLET = 7; 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final String tag; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final String name; 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public final int deviceType; 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final long modifiedTime; 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final List<ForeignSessionWindow> windows = new ArrayList<ForeignSessionWindow>(); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private ForeignSession(String tag, String name, int deviceType, long modifiedTime) { 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.tag = tag; 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.name = name; 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.deviceType = deviceType; 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.modifiedTime = modifiedTime; 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Represents synced foreign window. Note that desktop Chrome can have multiple windows in a 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * session. 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public static class ForeignSessionWindow { 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final long timestamp; 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final int sessionId; 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final List<ForeignSessionTab> tabs = new ArrayList<ForeignSessionTab>(); 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private ForeignSessionWindow(long timestamp, int sessionId) { 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.timestamp = timestamp; 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.sessionId = sessionId; 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Represents synced foreign tab. 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public static class ForeignSessionTab { 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final String url; 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final String title; 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final long timestamp; 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public final int id; 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private ForeignSessionTab(String url, String title, long timestamp, int id) { 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.url = url; 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.title = title; 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.timestamp = timestamp; 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) this.id = id; 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @CalledByNative 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private static ForeignSession pushSession( 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) List<ForeignSession> sessions, String tag, String name, int deviceType, 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) long modifiedTime) { 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ForeignSession session = new ForeignSession(tag, name, deviceType, modifiedTime); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sessions.add(session); 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return session; 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @CalledByNative 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private static ForeignSessionWindow pushWindow( 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ForeignSession session, long timestamp, int sessionId) { 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ForeignSessionWindow window = new ForeignSessionWindow(timestamp, sessionId); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) session.windows.add(window); 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return window; 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @CalledByNative 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private static void pushTab( 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ForeignSessionWindow window, String url, String title, long timestamp, int sessionId) { 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ForeignSessionTab tab = new ForeignSessionTab(url, title, timestamp, sessionId); 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window.tabs.add(tab); 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Initialize this class with the given profile. 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param profile Profile that will be used for syncing. 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public ForeignSessionHelper(Profile profile) { 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) mNativeForeignSessionHelper = nativeInit(profile); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Clean up the C++ side of this class. After the call, this class instance shouldn't be used. 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public void destroy() { 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) assert mNativeForeignSessionHelper != 0; 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) nativeDestroy(mNativeForeignSessionHelper); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mNativeForeignSessionHelper = 0; 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @Override 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected void finalize() { 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Just to make sure that we called destroy() before the java garbage collection picks up. 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) assert mNativeForeignSessionHelper == 0; 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @return {@code True} iff Tab sync is enabled. 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public boolean isTabSyncEnabled() { 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return nativeIsTabSyncEnabled(mNativeForeignSessionHelper); 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Sets callback instance that will be called on every foreign session sync update. 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param callback The callback to be invoked. 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public void setOnForeignSessionCallback(ForeignSessionCallback callback) { 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) nativeSetOnForeignSessionCallback(mNativeForeignSessionHelper, callback); 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @return The list of synced foreign sessions. {@code null} iff it fails to get them for some 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * reason. 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public List<ForeignSession> getForeignSessions() { 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) List<ForeignSession> result = new ArrayList<ForeignSession>(); 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) boolean received = nativeGetForeignSessions(mNativeForeignSessionHelper, result); 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (received) { 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sort sessions from most recent to least recent. 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Collections.sort(result, new Comparator<ForeignSession>() { 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @Override 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public int compare(ForeignSession lhs, ForeignSession rhs) { 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return lhs.modifiedTime < rhs.modifiedTime ? 1 : 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (lhs.modifiedTime == rhs.modifiedTime ? 0 : -1); 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }); 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) result = null; 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /** 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Opens the given foreign tab in a new tab. 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param tab Tab to load the session into. 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param session Session that the target tab belongs to. 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param foreignTab Target tab to open. 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param windowOpenDisposition The WindowOpenDisposition flag. 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @return {@code True} iff the tab is successfully opened. 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public boolean openForeignSessionTab(Tab tab, ForeignSession session, 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ForeignSessionTab foreignTab, int windowOpenDisposition) { 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return nativeOpenForeignSessionTab(mNativeForeignSessionHelper, tab, session.tag, 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) foreignTab.id, windowOpenDisposition); 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /** 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Remove Foreign session to display. Note that it will be reappear on the next sync. 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * This is mainly for when user wants to delete very old session that won't be used or syned in 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * the future. 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param session Session to be deleted. 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public void deleteForeignSession(ForeignSession session) { 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) nativeDeleteForeignSession(mNativeForeignSessionHelper, session.tag); 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private static native long nativeInit(Profile profile); 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private static native void nativeDestroy(long nativeForeignSessionHelper); 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private static native boolean nativeIsTabSyncEnabled(long nativeForeignSessionHelper); 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private static native void nativeSetOnForeignSessionCallback( 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeForeignSessionHelper, ForeignSessionCallback callback); 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private static native boolean nativeGetForeignSessions(long nativeForeignSessionHelper, 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) List<ForeignSession> resultSessions); 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private static native boolean nativeOpenForeignSessionTab( 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long nativeForeignSessionHelper, Tab tab, String sessionTag, int tabId, 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int disposition); 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private static native void nativeDeleteForeignSession( 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeForeignSessionHelper, String sessionTag); 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 219