blob: 8985b5dc3e345cf71637d7066e22da5d29caa547 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v17.leanback.media;
import android.support.v17.leanback.widget.OnActionClickedListener;
import android.support.v17.leanback.widget.PlaybackRowPresenter;
import android.support.v17.leanback.widget.PlaybackSeekUi;
import android.support.v17.leanback.widget.Row;
import android.view.View;
/**
* This class represents the UI (e.g. Fragment/Activity) hosting playback controls and
* defines the interaction between {@link PlaybackGlue} and the host.
* PlaybackGlueHost provides the following functions:
* <li>Render UI of PlaybackGlue: {@link #setPlaybackRow(Row)},
* {@link #setPlaybackRowPresenter(PlaybackRowPresenter)}.
* </li>
* <li>Client for fragment/activity onStart/onStop: {@link #setHostCallback(HostCallback)}.
* </li>
* <li>Auto fade out controls after a short period: {@link #setFadingEnabled(boolean)}.
* </li>
* <li>Key listener and ActionListener. {@link #setOnKeyInterceptListener(View.OnKeyListener)},
* {@link #setOnActionClickedListener(OnActionClickedListener)}.
* </li>
*
* Subclass of PlaybackGlueHost may implement optional interfaces:
* <li>{@link SurfaceHolderGlueHost} to provide SurfaceView for video playback.</li>
* <li>{@link PlaybackSeekUi} to provide seek UI to glue</li>
* These optional interfaces should be accessed by glue in
* {@link PlaybackGlue#onAttachedToHost(PlaybackGlueHost)}.
*/
public abstract class PlaybackGlueHost {
PlaybackGlue mGlue;
/**
* Callbacks triggered by the host(e.g. fragment) hosting the video controls/surface.
*
* @see #setHostCallback(HostCallback)
*/
public abstract static class HostCallback {
/**
* Client triggered once the host(fragment) has started.
*/
public void onHostStart() {
}
/**
* Client triggered once the host(fragment) has stopped.
*/
public void onHostStop() {
}
/**
* Client triggered once the host(fragment) has paused.
*/
public void onHostPause() {
}
/**
* Client triggered once the host(fragment) has resumed.
*/
public void onHostResume() {
}
/**
* Client triggered once the host(fragment) has been destroyed.
*/
public void onHostDestroy() {
}
}
/**
* Optional Client that implemented by PlaybackGlueHost to respond to player event.
*/
public static class PlayerCallback {
/**
* Size of the video changes, the Host should adjust SurfaceView's layout width and height.
* @param videoWidth
* @param videoHeight
*/
public void onVideoSizeChanged(int videoWidth, int videoHeight) {
}
/**
* notify media starts/stops buffering/preparing. The Host could start or stop
* progress bar.
* @param start True for buffering start, false otherwise.
*/
public void onBufferingStateChanged(boolean start) {
}
/**
* notify media has error. The Host could show error dialog.
* @param errorCode Optional error code for specific implementation.
* @param errorMessage Optional error message for specific implementation.
*/
public void onError(int errorCode, CharSequence errorMessage) {
}
}
/**
* Enables or disables view fading. If enabled, the view will be faded in when the
* fragment starts and will fade out after a time period.
* @deprecated Use {@link #setControlsOverlayAutoHideEnabled(boolean)}
*/
@Deprecated
public void setFadingEnabled(boolean enable) {
}
/**
* Enables or disables controls overlay auto hidden. If enabled, the view will be faded out
* after a time period.
* @param enabled True to enable auto hidden of controls overlay.
*
*/
public void setControlsOverlayAutoHideEnabled(boolean enabled) {
setFadingEnabled(enabled);
}
/**
* Returns true if auto hides controls overlay.
* @return True if auto hiding controls overlay.
*/
public boolean isControlsOverlayAutoHideEnabled() {
return false;
}
/**
* Fades out the playback overlay immediately.
* @deprecated Call {@link #hideControlsOverlay(boolean)}
*/
@Deprecated
public void fadeOut() {
}
/**
* Returns true if controls overlay is visible, false otherwise.
*
* @return True if controls overlay is visible, false otherwise.
* @see #showControlsOverlay(boolean)
* @see #hideControlsOverlay(boolean)
*/
public boolean isControlsOverlayVisible() {
return true;
}
/**
* Hide controls overlay.
*
* @param runAnimation True to run animation, false otherwise.
*/
public void hideControlsOverlay(boolean runAnimation) {
}
/**
* Show controls overlay.
*
* @param runAnimation True to run animation, false otherwise.
*/
public void showControlsOverlay(boolean runAnimation) {
}
/**
* Sets the {@link android.view.View.OnKeyListener} on the host. This would trigger
* the listener when a {@link android.view.KeyEvent} is unhandled by the host.
*/
public void setOnKeyInterceptListener(View.OnKeyListener onKeyListener) {
}
/**
* Sets the {@link View.OnClickListener} on this fragment.
*/
public void setOnActionClickedListener(OnActionClickedListener listener) {}
/**
* Sets the host {@link HostCallback} callback on the host. This method should only be called
* by {@link PlaybackGlue}. App should not directly call this method, app should override
* {@link PlaybackGlue#onHostStart()} etc.
*/
public void setHostCallback(HostCallback callback) {
}
/**
* Notifies host about a change so it can update the view.
*/
public void notifyPlaybackRowChanged() {}
/**
* Sets {@link PlaybackRowPresenter} for rendering the playback controls.
*/
public void setPlaybackRowPresenter(PlaybackRowPresenter presenter) {}
/**
* Sets the {@link Row} that represents the information on control items that needs
* to be rendered.
*/
public void setPlaybackRow(Row row) {}
final void attachToGlue(PlaybackGlue glue) {
if (mGlue != null) {
mGlue.onDetachedFromHost();
}
mGlue = glue;
if (mGlue != null) {
mGlue.onAttachedToHost(this);
}
}
/**
* Implemented by PlaybackGlueHost for responding to player events. Such as showing a spinning
* wheel progress bar when {@link PlayerCallback#onBufferingStateChanged(boolean)}.
* @return PlayerEventCallback that Host supports, null if not supported.
*/
public PlayerCallback getPlayerCallback() {
return null;
}
}