// 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.ntp;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import java.util.ArrayList;
import java.util.List;
/**
* This class allows Java code to get and clear the list of recently closed tabs.
*/
public class RecentlyClosedBridge {
private long mNativeRecentlyClosedTabsBridge;
/**
* Callback interface for getting notified when the list of recently closed tabs is updated.
*/
interface RecentlyClosedCallback {
/**
* This method will be called every time the list of recently closed tabs is updated.
*
* It's a good place to call {@link RecentlyClosedBridge#getRecentlyClosedTabs} to get the
* updated list of tabs.
*/
@CalledByNative("RecentlyClosedCallback")
void onUpdated();
}
/**
* Represents a recently closed tab.
*/
static class RecentlyClosedTab {
public final int id;
public final String title;
public final String url;
private RecentlyClosedTab(int id, String title, String url) {
this.id = id;
this.title = title;
this.url = url;
}
}
@CalledByNative
private static void pushTab(
List<RecentlyClosedTab> tabs, int id, String title, String url) {
RecentlyClosedTab tab = new RecentlyClosedTab(id, title, url);
tabs.add(tab);
}
/**
* Initializes this class with the given profile.
* @param profile The Profile whose recently closed tabs will be queried.
*/
public RecentlyClosedBridge(Profile profile) {
mNativeRecentlyClosedTabsBridge = nativeInit(profile);
}
/**
* Cleans up the C++ side of this class. This instance must not be used after calling destroy().
*/
public void destroy() {
assert mNativeRecentlyClosedTabsBridge != 0;
nativeDestroy(mNativeRecentlyClosedTabsBridge);
mNativeRecentlyClosedTabsBridge = 0;
}
/**
* Sets the callback to be called whenever the list of recently closed tabs changes.
* @param callback The RecentlyClosedCallback to be notified, or null.
*/
void setRecentlyClosedCallback(RecentlyClosedCallback callback) {
nativeSetRecentlyClosedCallback(mNativeRecentlyClosedTabsBridge, callback);
}
/**
* @param maxTabCount The maximum number of recently closed tabs to return.
* @return The list of recently closed tabs, with up to maxTabCount elements.
*/
List<RecentlyClosedTab> getRecentlyClosedTabs(int maxTabCount) {
List<RecentlyClosedTab> tabs = new ArrayList<RecentlyClosedTab>();
boolean received = nativeGetRecentlyClosedTabs(mNativeRecentlyClosedTabsBridge, tabs,
maxTabCount);
return received ? tabs : null;
}
/**
* Opens a recently closed tab in the current tab or a new tab. If opened in the current tab,
* the current tab's entire history is replaced.
*
* @param tab The current Tab.
* @param recentTab The RecentlyClosedTab to open.
* @param windowOpenDisposition The WindowOpenDisposition value specifying whether to open in
* the current tab or a new tab.
* @return Whether the tab was successfully opened.
*/
boolean openRecentlyClosedTab(Tab tab, RecentlyClosedTab recentTab,
int windowOpenDisposition) {
return nativeOpenRecentlyClosedTab(mNativeRecentlyClosedTabsBridge, tab, recentTab.id,
windowOpenDisposition);
}
/**
* Opens the most recently closed tab in a new tab by reading data from the native tab restore
* service.
*/
public void openRecentlyClosedTab() {
nativeOpenMostRecentlyClosedTab(mNativeRecentlyClosedTabsBridge);
}
/**
* Clears all recently closed tabs.
*/
void clearRecentlyClosedTabs() {
nativeClearRecentlyClosedTabs(mNativeRecentlyClosedTabsBridge);
}
private native long nativeInit(Profile profile);
private native void nativeDestroy(long nativeRecentlyClosedTabsBridge);
private native void nativeSetRecentlyClosedCallback(
long nativeRecentlyClosedTabsBridge, RecentlyClosedCallback callback);
private native boolean nativeGetRecentlyClosedTabs(
long nativeRecentlyClosedTabsBridge, List<RecentlyClosedTab> tabs, int maxTabCount);
private native boolean nativeOpenRecentlyClosedTab(long nativeRecentlyClosedTabsBridge,
Tab tab, int recentTabId, int windowOpenDisposition);
private native boolean nativeOpenMostRecentlyClosedTab(long nativeRecentlyClosedTabsBridge);
private native void nativeClearRecentlyClosedTabs(long nativeRecentlyClosedTabsBridge);
}