// Copyright 2014 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.fullscreen;
import android.view.View;
import android.view.Window;
import org.chromium.chrome.browser.fullscreen.FullscreenHtmlApiHandler.FullscreenHtmlApiDelegate;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
/**
* Manages the basic fullscreen functionality required by a Tab.
*/
// TODO(tedchoc): Remove Tab's requirement on the fullscreen tokens to slim down the API of this
// class.
public abstract class FullscreenManager {
public static final int INVALID_TOKEN = -1;
private final TabModelSelector mModelSelector;
private final FullscreenHtmlApiHandler mHtmlApiHandler;
private boolean mOverlayVideoMode;
/**
* Constructs the basic ChromeTab oriented FullscreenManager.
*
* @param window Top-level window to turn to fullscreen.
* @param modelSelector The model selector providing access to the current tab.
*/
public FullscreenManager(Window window, TabModelSelector modelSelector) {
mModelSelector = modelSelector;
mHtmlApiHandler = new FullscreenHtmlApiHandler(window, createApiDelegate());
mOverlayVideoMode = false;
}
/**
* @return The delegate that will handle the embedder specific requirements of the
* fullscreen API handler.
*/
protected abstract FullscreenHtmlApiDelegate createApiDelegate();
/**
* @return The handler for managing interactions with the HTML fullscreen API.
*/
protected FullscreenHtmlApiHandler getHtmlApiHandler() {
return mHtmlApiHandler;
}
/**
* @return The selector for accessing the current Tab.
*/
protected TabModelSelector getTabModelSelector() {
return mModelSelector;
}
/**
* Trigger a temporary showing of the top controls.
*/
public abstract void showControlsTransient();
/**
* Trigger a permanent showing of the top controls until requested otherwise.
*
* @return The token that determines whether the requester still needs persistent controls to
* be present on the screen.
* @see #hideControlsPersistent(int)
*/
public abstract int showControlsPersistent();
/**
* Same behavior as {@link #showControlsPersistent()} but also handles removing a previously
* requested token if necessary.
*
* @param oldToken The old fullscreen token to be cleared.
* @return The fullscreen token as defined in {@link #showControlsPersistent()}.
*/
public abstract int showControlsPersistentAndClearOldToken(int oldToken);
/**
* Notify the manager that the top controls are no longer required for the given token.
*
* @param token The fullscreen token returned from {@link #showControlsPersistent()}.
*/
public abstract void hideControlsPersistent(int token);
/**
* @return The height of the top controls in pixels.
*/
public abstract int getTopControlsHeight();
/**
* @return The offset of the content from the top of the screen.
*/
public abstract float getContentOffset();
/**
* Tells the fullscreen manager a ContentVideoView is created below the contents.
* @param enabled Whether to enter or leave overlay video mode.
*/
public void setOverlayVideoMode(boolean enabled) {
mOverlayVideoMode = enabled;
}
/**
* @return Check whether ContentVideoView is shown.
*/
public boolean isOverlayVideoMode() {
return mOverlayVideoMode;
}
/**
* Updates the positions of the top controls and content to the default non fullscreen
* values.
*/
public abstract void setPositionsForTabToNonFullscreen();
/**
* Updates the positions of the top controls and content based on the desired position of
* the current tab.
*
* @param controlsOffset The Y offset of the top controls.
* @param contentOffset The Y offset for the content.
*/
public abstract void setPositionsForTab(float controlsOffset, float contentOffset);
/**
* Updates the current ContentView's children and any popups with the correct offsets based on
* the current fullscreen state.
*/
public abstract void updateContentViewChildrenState();
/**
* Enters or exits persistent fullscreen mode. In this mode, the top controls will be
* permanently hidden until this mode is exited.
*
* @param enabled Whether to enable persistent fullscreen mode.
*/
public void setPersistentFullscreenMode(boolean enabled) {
mHtmlApiHandler.setPersistentFullscreenMode(enabled);
Tab tab = mModelSelector.getCurrentTab();
if (tab != null) {
tab.updateFullscreenEnabledState();
}
}
/**
* @return Whether the application is in persistent fullscreen mode.
* @see #setPersistentFullscreenMode(boolean)
*/
public boolean getPersistentFullscreenMode() {
return mHtmlApiHandler.getPersistentFullscreenMode();
}
/**
* Notified when the system UI visibility for the current ContentView has changed.
* @param visibility The updated UI visibility.
* @see View#getSystemUiVisibility()
*/
public void onContentViewSystemUiVisibilityChange(int visibility) {
mHtmlApiHandler.onContentViewSystemUiVisibilityChange(visibility);
}
/**
* Ensure the proper system UI flags are set after the window regains focus.
* @see android.app.Activity#onWindowFocusChanged(boolean)
*/
public void onWindowFocusChanged(boolean hasWindowFocus) {
mHtmlApiHandler.onWindowFocusChanged(hasWindowFocus);
}
/**
* Called when scrolling state of the ContentView changed.
*/
public void onContentViewScrollingStateChanged(boolean scrolling) {}
}