1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)package org.chromium.chrome.browser.tabmodel;
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import org.chromium.chrome.browser.Tab;
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import org.chromium.chrome.browser.profiles.Profile;
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * TabModel organizes all the open tabs and allows you to create new ones. There are two TabModels
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * in the app at this time: normal and incognito. More could be added to allow for windows or
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * something.
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public interface TabModel extends TabList {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * A list of the various ways tabs can be launched.
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public enum TabLaunchType {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_LINK,             // Opened from a link.
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_EXTERNAL_APP,     // Opened by and external app.
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_MENU_OR_OVERVIEW, // Opened from the options menu or the tab stack overview.
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_RESTORE,          // Opened after restoring state from storage.
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        // Opened from the long press menu. Like FROM_MENU but also sets up a parent/child
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        // relationship like FROM_LINK. FOREGROUND and BACKGROUND indicates whether the current tab
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        // should be automatically switched to the new tab or not.
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_LONGPRESS_FOREGROUND,
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_LONGPRESS_BACKGROUND,
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_INSTANT,          // Tab was created by instant.
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_KEYBOARD          // Opened from a physical keyboard via shortcut.
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * A list of the various ways tabs can eb selected.
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public enum TabSelectionType {
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_CLOSE, // Selection of adjacent tab when the active tab is closed in foreground.
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_EXIT,  // Selection of adjacent tab when the active tab is closed upon app exit.
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_NEW,   // Selection of newly created tab (e.g. for a url intent or NTP).
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_USER   // User-originated switch to existing tab or selection of main tab on app
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    // startup.
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @return The profile associated with the current model.
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public Profile getProfile();
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Unregisters and destroys the specified tab, and then switches to the previous tab.
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param tab The non-null tab to close
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @return true if the tab was found
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public boolean closeTab(Tab tab);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Unregisters and destroys the specified tab, and then switches to the previous tab.
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param tab The non-null tab to close
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param animate true iff the closing animation should be displayed
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param uponExit true iff the tab is being closed upon application exit (after user presses
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                 the system back button)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param canUndo Whether or not this action can be undone. If this is {@code true} and
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                {@link #supportsPendingClosures()} is {@code true}, this {@link Tab}
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                will not actually be closed until {@link #commitTabClosure(int)} or
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                {@link #commitAllTabClosures()} is called, but it will be effectively removed
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                from this list. To get a comprehensive list of all tabs, including ones that
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                have been partially closed, use the {@link TabList} from
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *                {@link #getComprehensiveModel()}.
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @return true if the tab was found
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public boolean closeTab(Tab tab, boolean animate, boolean uponExit, boolean canUndo);
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Returns which tab would be selected if the specified tab {@code id} were closed.
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param id The ID of tab which would be closed.
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @return The id of the next tab that would be visible.
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public Tab getNextTabIfClosed(int id);
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Close all the tabs on this model.
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void closeAllTabs();
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @return Whether or not this model supports pending closures.
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public boolean supportsPendingClosures();
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Commits all pending closures, closing all tabs that had a chance to be undone.
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void commitAllTabClosures();
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Commits a pending closure specified by {@code tabId}.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param tabId The id of the {@link Tab} to commit the pending closure.
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void commitTabClosure(int tabId);
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Cancels a pending {@link Tab} closure, bringing the tab back into this model.  Note that this
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * will select the rewound {@link Tab}.
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param tabId The id of the {@link Tab} to undo.
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void cancelTabClosure(int tabId);
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @return The complete {@link TabList} this {@link TabModel} represents.  Note that this may
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *         be different than this actual {@link TabModel} if it supports pending closures
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *         {@link #supportsPendingClosures()}, as this will include all pending closure tabs.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public TabList getComprehensiveModel();
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Selects a tab by its index.
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param i    The index of the tab to select.
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param type The type of selection.
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void setIndex(int i, final TabSelectionType type);
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Moves a tab to a new index.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param id       The id of the tab to move.
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param newIndex The new place to put the tab.
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void moveTab(int id, int newIndex);
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * To be called when this model should be destroyed.  The model should no longer be used after
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * this.
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void destroy();
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Adds a newly created tab to this model.
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param tab   The tab to be added.
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param index The index where the tab should be inserted. The model may override the index.
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param type  How the tab was opened.
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    void addTab(Tab tab, int index, TabLaunchType type);
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Subscribes a {@link TabModelObserver} to be notified about changes to this model.
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param observer The observer to be subscribed.
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    void addObserver(TabModelObserver observer);
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /**
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * Unsubscribes a previously subscribed {@link TabModelObserver}.
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     * @param observer The observer to be unsubscribed.
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    void removeObserver(TabModelObserver observer);
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
156