SubtitleController.java revision 87399fc21b642688a690be5869f14a7ba020afdb
103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar/*
203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Copyright (C) 2013 The Android Open Source Project
303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar *
403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * you may not use this file except in compliance with the License.
603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * You may obtain a copy of the License at
703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar *
803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar *
1003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Unless required by applicable law or agreed to in writing, software
1103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
1203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * See the License for the specific language governing permissions and
1403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * limitations under the License.
1503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */
1603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
1703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarpackage android.media;
1803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
1903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport java.util.Locale;
2003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport java.util.Vector;
2103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
2203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.content.Context;
2303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.media.MediaPlayer.OnSubtitleDataListener;
2403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.view.View;
2503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.view.accessibility.CaptioningManager;
2603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
2703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar/**
2803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * The subtitle controller provides the architecture to display subtitles for a
2903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * media source.  It allows specifying which tracks to display, on which anchor
3003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * to display them, and also allows adding external, out-of-band subtitle tracks.
3103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar *
3203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @hide
3303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */
3403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarpublic class SubtitleController {
3503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private Context mContext;
3603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private MediaTimeProvider mTimeProvider;
3703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private Vector<Renderer> mRenderers;
3803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private Vector<SubtitleTrack> mTracks;
3903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private SubtitleTrack mSelectedTrack;
4003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private boolean mShowing;
4187399fc21b642688a690be5869f14a7ba020afdbLajos Molnar    private CaptioningManager mCaptioningManager;
4203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
4303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
4403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Creates a subtitle controller for a media playback object that implements
4503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * the MediaTimeProvider interface.
4603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *
4703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @param timeProvider
4803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
4903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public SubtitleController(
5003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            Context context,
5103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            MediaTimeProvider timeProvider,
5203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            Listener listener) {
5303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mContext = context;
5403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mTimeProvider = timeProvider;
5503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mListener = listener;
5603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
5703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mRenderers = new Vector<Renderer>();
5803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mShowing = false;
5903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mTracks = new Vector<SubtitleTrack>();
6087399fc21b642688a690be5869f14a7ba020afdbLajos Molnar        mCaptioningManager =
6187399fc21b642688a690be5869f14a7ba020afdbLajos Molnar            (CaptioningManager)context.getSystemService(Context.CAPTIONING_SERVICE);
6203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
6303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
6403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
6503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @return the available subtitle tracks for this media. These include
6603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * the tracks found by {@link MediaPlayer} as well as any tracks added
6703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * manually via {@link #addTrack}.
6803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
6903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public SubtitleTrack[] getTracks() {
7003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        SubtitleTrack[] tracks = new SubtitleTrack[mTracks.size()];
7103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mTracks.toArray(tracks);
7203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        return tracks;
7303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
7403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
7503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
7603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @return the currently selected subtitle track
7703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
7803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public SubtitleTrack getSelectedTrack() {
7903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        return mSelectedTrack;
8003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
8103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
8203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private View getSubtitleView() {
8303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mSelectedTrack == null) {
8403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            return null;
8503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
8603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        return mSelectedTrack.getView();
8703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
8803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
8903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
9003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Selects a subtitle track.  As a result, this track will receive
9103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * in-band data from the {@link MediaPlayer}.  However, this does
9203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * not change the subtitle visibility.
9303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *
9403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @param track The subtitle track to select.  This must be one of the
9503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *              tracks in {@link #getTracks}.
9603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @return true if the track was successfully selected.
9703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
9803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public boolean selectTrack(SubtitleTrack track) {
9903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (track != null && !mTracks.contains(track)) {
10003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            return false;
10103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
10203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mTrackIsExplicit = true;
10303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mSelectedTrack == track) {
10403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            return true;
10503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
10603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
10703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mSelectedTrack != null) {
10803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mSelectedTrack.hide();
10903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mSelectedTrack.setTimeProvider(null);
11003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
11103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
11203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mSelectedTrack = track;
11303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mAnchor.setSubtitleView(getSubtitleView());
11403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
11503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mSelectedTrack != null) {
11603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mSelectedTrack.setTimeProvider(mTimeProvider);
11703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mSelectedTrack.show();
11803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
11903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
12003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mListener != null) {
12103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mListener.onSubtitleTrackSelected(track);
12203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
12303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        return true;
12403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
12503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
12603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
12703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @return the default subtitle track based on system preferences, or null,
12803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * if no such track exists in this manager.
12903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
13003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public SubtitleTrack getDefaultTrack() {
13187399fc21b642688a690be5869f14a7ba020afdbLajos Molnar        Locale locale = mCaptioningManager.getLocale();
13203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
13303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        for (SubtitleTrack track: mTracks) {
13403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            MediaFormat format = track.getFormat();
13503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            String language = format.getString(MediaFormat.KEY_LANGUAGE);
13603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            // TODO: select track with best renderer.  For now, we select first
13703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            // track with local's language or first track if locale has none
13803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            if (locale == null ||
13903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                locale.getLanguage().equals("") ||
14003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                locale.getISO3Language().equals(language) ||
14103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                locale.getLanguage().equals(language)) {
14203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                return track;
14303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            }
14403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
14503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        return null;
14603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
14703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
14803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private boolean mTrackIsExplicit = false;
14903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private boolean mVisibilityIsExplicit = false;
15003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
15103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /** @hide */
15203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public void selectDefaultTrack() {
15303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mTrackIsExplicit) {
15403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            return;
15503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
15603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
15703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        SubtitleTrack track = getDefaultTrack();
15803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (track != null) {
15903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            selectTrack(track);
16003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mTrackIsExplicit = false;
16103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            if (!mVisibilityIsExplicit) {
16287399fc21b642688a690be5869f14a7ba020afdbLajos Molnar                if (mCaptioningManager.isEnabled()) {
16303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                    show();
16403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                } else {
16503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                    hide();
16603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                }
16703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                mVisibilityIsExplicit = false;
16803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            }
16903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
17003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
17103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
17203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /** @hide */
17303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public void reset() {
17403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        hide();
17503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        selectTrack(null);
17603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mTracks.clear();
17703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mTrackIsExplicit = false;
17803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mVisibilityIsExplicit = false;
17903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
18003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
18103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
18203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Adds a new, external subtitle track to the manager.
18303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *
18403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @param format the format of the track that will include at least
18503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *               the MIME type {@link MediaFormat@KEY_MIME}.
18603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @return the created {@link SubtitleTrack} object
18703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
18803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public SubtitleTrack addTrack(MediaFormat format) {
18903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        for (Renderer renderer: mRenderers) {
19003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            if (renderer.supports(format)) {
19103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                SubtitleTrack track = renderer.createTrack(format);
19203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                if (track != null) {
19303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                    mTracks.add(track);
19403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                    return track;
19503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar                }
19603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            }
19703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
19803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        return null;
19903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
20003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
20103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
20203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Show the selected (or default) subtitle track.
20303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
20403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public void show() {
20503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mShowing = true;
20603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mVisibilityIsExplicit = true;
20703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mSelectedTrack != null) {
20803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mSelectedTrack.show();
20903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
21003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
21103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
21203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
21303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Hide the selected (or default) subtitle track.
21403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
21503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public void hide() {
21603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mVisibilityIsExplicit = true;
21703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mSelectedTrack != null) {
21803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mSelectedTrack.hide();
21903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
22003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mShowing = false;
22103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
22203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
22303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
22403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Interface for supporting a single or multiple subtitle types in {@link
22503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * MediaPlayer}.
22603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
22703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public abstract static class Renderer {
22803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        /**
22903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * Called by {@link MediaPlayer}'s {@link SubtitleController} when a new
23003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * subtitle track is detected, to see if it should use this object to
23103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * parse and display this subtitle track.
23203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *
23303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @param format the format of the track that will include at least
23403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *               the MIME type {@link MediaFormat@KEY_MIME}.
23503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *
23603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @return true if and only if the track format is supported by this
23703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * renderer
23803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         */
23903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        public abstract boolean supports(MediaFormat format);
24003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
24103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        /**
24203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * Called by {@link MediaPlayer}'s {@link SubtitleController} for each
24303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * subtitle track that was detected and is supported by this object to
24403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * create a {@link SubtitleTrack} object.  This object will be created
24503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * for each track that was found.  If the track is selected for display,
24603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * this object will be used to parse and display the track data.
24703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *
24803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @param format the format of the track that will include at least
24903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *               the MIME type {@link MediaFormat@KEY_MIME}.
25003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @return a {@link SubtitleTrack} object that will be used to parse
25103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * and render the subtitle track.
25203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         */
25303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        public abstract SubtitleTrack createTrack(MediaFormat format);
25403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
25503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
25603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
25703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Add support for a subtitle format in {@link MediaPlayer}.
25803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *
25903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * @param renderer a {@link SubtitleController.Renderer} object that adds
26003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     *                 support for a subtitle format.
26103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
26203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public void registerRenderer(Renderer renderer) {
26303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        // TODO how to get available renderers in the system
26403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (!mRenderers.contains(renderer)) {
26503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            // TODO should added renderers override existing ones (to allow replacing?)
26603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mRenderers.add(renderer);
26703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
26803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
26903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
27003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /**
27103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * Subtitle anchor, an object that is able to display a subtitle view,
27203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     * e.g. a VideoView.
27303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar     */
27403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public interface Anchor {
27503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        /**
27603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * Anchor should set the subtitle view to the supplied view,
27703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * or none, if the supplied view is null.
27803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *
27903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @param view subtitle view, or null
28003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         */
28103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        public void setSubtitleView(View view);
28203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
28303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
28403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private Anchor mAnchor;
28503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
28603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    /** @hide */
28703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public void setAnchor(Anchor anchor) {
28803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mAnchor == anchor) {
28903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            return;
29003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
29103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
29203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mAnchor != null) {
29303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mAnchor.setSubtitleView(null);
29403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
29503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        mAnchor = anchor;
29603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        if (mAnchor != null) {
29703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar            mAnchor.setSubtitleView(getSubtitleView());
29803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        }
29903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
30003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
30103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    public interface Listener {
30203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        /**
30303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * Called when a subtitle track has been selected.
30403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         *
30503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @param track selected subtitle track or null
30603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         * @hide
30703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar         */
30803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar        public void onSubtitleTrackSelected(SubtitleTrack track);
30903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    }
31003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar
31103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar    private Listener mListener;
31203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar}
313