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