blob: 0c60bbd5ea627fec28be3816dc58b407b259306e [file] [log] [blame]
// Copyright 2016 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.tabmodel;
import org.chromium.chrome.browser.tab.Tab;
import java.util.List;
/**
* Observer for all {@link TabModel}s owned by a {@link TabModelSelector}.
*
* <p>
* This can safely be constructed before native libraries have been initialized as this will
* register to observe the underlying TabModels as they are created lazily.
*/
public class TabModelSelectorTabModelObserver extends EmptyTabModelObserver {
private final TabModelSelector mTabModelSelector;
private TabModelSelectorObserver mSelectorObserver;
/**
* Constructs an observer that should be notified of changes for all tab models owned
* by a specified {@link TabModelSelector}.
*
* <p>
* {@link #destroy()} must be called to unregister this observer.
*
* @param selector The selector that owns the Tab Models that should notify this observer.
*/
public TabModelSelectorTabModelObserver(TabModelSelector selector) {
mTabModelSelector = selector;
List<TabModel> tabModels = selector.getModels();
if (tabModels.isEmpty()) {
mSelectorObserver = new EmptyTabModelSelectorObserver() {
@Override
public void onNewTabCreated(Tab tab) {
assert false : "onChange should have happened and unregistered this listener.";
}
@Override
public void onChange() {
mTabModelSelector.removeObserver(this);
mSelectorObserver = null;
registerModelObservers();
}
};
mTabModelSelector.addObserver(mSelectorObserver);
} else {
registerModelObservers();
}
}
private void registerModelObservers() {
List<TabModel> tabModels = mTabModelSelector.getModels();
for (int i = 0; i < tabModels.size(); i++) {
TabModel tabModel = tabModels.get(i);
tabModel.addObserver(this);
}
onRegistrationComplete();
}
/**
* Notifies that the registration of the observers has been completed.
*/
protected void onRegistrationComplete() {
}
/**
* Destroys the observer and removes itself as a listener for Tab updates.
*/
public void destroy() {
if (mSelectorObserver != null) {
mTabModelSelector.removeObserver(mSelectorObserver);
mSelectorObserver = null;
}
List<TabModel> tabModels = mTabModelSelector.getModels();
for (int i = 0; i < tabModels.size(); i++) {
TabModel tabModel = tabModels.get(i);
tabModel.removeObserver(this);
}
}
}