147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang/*
247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * Copyright 2018 The Android Open Source Project
347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang *
447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * Licensed under the Apache License, Version 2.0 (the "License");
547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * you may not use this file except in compliance with the License.
647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * You may obtain a copy of the License at
747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang *
847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang *      http://www.apache.org/licenses/LICENSE-2.0
947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang *
1047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * Unless required by applicable law or agreed to in writing, software
1147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * distributed under the License is distributed on an "AS IS" BASIS,
1247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * See the License for the specific language governing permissions and
1447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * limitations under the License.
1547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang */
1647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
1747740510281e2d2c5a535c31d52ac970d32951c6Insun Kangpackage androidx.media.widget;
1847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
1947740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.content.Context;
2047740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.media.MediaPlayer;
2147740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.media.MediaPlayer.OnSubtitleDataListener;
2247740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.media.SubtitleData;
2347740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.net.Uri;
2447740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.os.Bundle;
2547740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.util.AttributeSet;
2647740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.util.Log;
2747740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.util.Pair;
2847740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.view.View;
2947740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport android.view.ViewGroup.LayoutParams;
3047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
3147740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport androidx.annotation.Nullable;
3247740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport androidx.annotation.RequiresApi;
3347740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport androidx.media.subtitle.ClosedCaptionRenderer;
3447740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport androidx.media.subtitle.SubtitleController;
3547740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport androidx.media.subtitle.SubtitleTrack;
3647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
3747740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport java.io.IOException;
3847740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport java.util.ArrayList;
3947740510281e2d2c5a535c31d52ac970d32951c6Insun Kangimport java.util.Map;
4047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
4147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang/**
4247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang * Base implementation of VideoView2.
4347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang */
4447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang@RequiresApi(28)
4547740510281e2d2c5a535c31d52ac970d32951c6Insun Kangclass VideoView2ImplApi28WithMp1 extends VideoView2ImplBaseWithMp1 {
4647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private static final String TAG = "VideoView2ImplApi28_1";
4747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
4847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
4947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private static final int INVALID_TRACK_INDEX = -1;
5047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
5147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private ArrayList<Pair<Integer, SubtitleTrack>> mSubtitleTrackIndices;
5247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private SubtitleController mSubtitleController;
5347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
5447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    // selected video/audio/subtitle track index as MediaPlayer returns
5547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private int mSelectedSubtitleTrackIndex;
5647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
5747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private SubtitleView mSubtitleView;
5847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private boolean mSubtitleEnabled;
5947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
6047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
6147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    public void initialize(
6247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            VideoView2 instance, Context context,
6347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            @Nullable AttributeSet attrs, int defStyleAttr) {
6447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        super.initialize(instance, context, attrs, defStyleAttr);
6547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSelectedSubtitleTrackIndex = INVALID_TRACK_INDEX;
6647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
6747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
6847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                LayoutParams.MATCH_PARENT);
6947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleView = new SubtitleView(context);
7047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleView.setLayoutParams(params);
7147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleView.setBackgroundColor(0);
7247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mInstance.addView(mSubtitleView);
7347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
7447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleEnabled = (attrs == null) || attrs.getAttributeBooleanValue(
7547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                "http://schemas.android.com/apk/res/android",
7647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                "enableSubtitle", false);
7747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
7847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
7947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    /**
8047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * Shows or hides closed caption or subtitles if there is any.
8147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * The first subtitle track will be chosen if there multiple subtitle tracks exist.
8247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * Default behavior of VideoView2 is not showing subtitle.
8347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * @param enable shows closed caption or subtitles if this value is true, or hides.
8447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     */
8547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
8647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    public void setSubtitleEnabled(boolean enable) {
8747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (enable != mSubtitleEnabled) {
8847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            selectOrDeselectSubtitle(enable);
8947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
9047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleEnabled = enable;
9147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
9247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
9347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    /**
9447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * Returns true if showing subtitle feature is enabled or returns false.
9547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * Although there is no subtitle track or closed caption, it can return true, if the feature
9647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * has been enabled by {@link #setSubtitleEnabled}.
9747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     */
9847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
9947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    public boolean isSubtitleEnabled() {
10047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        return mSubtitleEnabled;
10147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
10247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
10347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    ///////////////////////////////////////////////////
10447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    // Protected or private methods
10547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    ///////////////////////////////////////////////////
10647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
10747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    /**
10847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     * Used in openVideo(). Setup MediaPlayer and related objects before calling prepare.
10947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang     */
11047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
11147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    protected void setupMediaPlayer(Context context, Uri uri, Map<String, String> headers)
11247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            throws IOException {
11347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        super.setupMediaPlayer(context, uri, headers);
11447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
11547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleController = new SubtitleController(context);
11647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleController.registerRenderer(new ClosedCaptionRenderer(context));
11747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleController.setAnchor((SubtitleController.Anchor) mSubtitleView);
11847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
11947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mMediaPlayer.setOnSubtitleDataListener(mSubtitleListener);
12047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
12147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
12247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private void selectOrDeselectSubtitle(boolean select) {
12347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (!isInPlaybackState()) {
12447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            return;
12547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
12647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (select) {
12747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            if (mSubtitleTrackIndices.size() > 0) {
12847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mSelectedSubtitleTrackIndex = mSubtitleTrackIndices.get(0).first;
12947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mSubtitleController.selectTrack(mSubtitleTrackIndices.get(0).second);
13047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mMediaPlayer.selectTrack(mSelectedSubtitleTrackIndex);
13147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mSubtitleView.setVisibility(View.VISIBLE);
13247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            }
13347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        } else {
13447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            if (mSelectedSubtitleTrackIndex != INVALID_TRACK_INDEX) {
13547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mMediaPlayer.deselectTrack(mSelectedSubtitleTrackIndex);
13647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mSelectedSubtitleTrackIndex = INVALID_TRACK_INDEX;
13747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mSubtitleView.setVisibility(View.GONE);
13847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            }
13947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
14047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
14147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
14247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
14347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    protected void extractTracks() {
14447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        MediaPlayer.TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();
14547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mVideoTrackIndices = new ArrayList<>();
14647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mAudioTrackIndices = new ArrayList<>();
14747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleTrackIndices = new ArrayList<>();
14847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mSubtitleController.reset();
14947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        for (int i = 0; i < trackInfos.length; ++i) {
15047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            int trackType = trackInfos[i].getTrackType();
15147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            if (trackType == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_VIDEO) {
15247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mVideoTrackIndices.add(i);
15347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            } else if (trackType == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_AUDIO) {
15447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mAudioTrackIndices.add(i);
15547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            } else if (trackType == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
15647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                SubtitleTrack track = mSubtitleController.addTrack(trackInfos[i].getFormat());
15747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                if (track != null) {
15847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    mSubtitleTrackIndices.add(new Pair<>(i, track));
15947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                }
16047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            }
16147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
16247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        // Select first tracks as default
16347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (mVideoTrackIndices.size() > 0) {
16447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            mSelectedVideoTrackIndex = 0;
16547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
16647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (mAudioTrackIndices.size() > 0) {
16747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            mSelectedAudioTrackIndex = 0;
16847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
16947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
17047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        Bundle data = new Bundle();
17147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        data.putInt(MediaControlView2.KEY_VIDEO_TRACK_COUNT, mVideoTrackIndices.size());
17247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        data.putInt(MediaControlView2.KEY_AUDIO_TRACK_COUNT, mAudioTrackIndices.size());
17347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        data.putInt(MediaControlView2.KEY_SUBTITLE_TRACK_COUNT, mSubtitleTrackIndices.size());
17447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (mSubtitleTrackIndices.size() > 0) {
17547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            selectOrDeselectSubtitle(mSubtitleEnabled);
17647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
17747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mMediaSession.sendSessionEvent(MediaControlView2.EVENT_UPDATE_TRACK_STATUS, data);
17847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
17947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
18047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    private OnSubtitleDataListener mSubtitleListener =
18147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            new OnSubtitleDataListener() {
18247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                @Override
18347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                public void onSubtitleData(MediaPlayer mp, SubtitleData data) {
18447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    if (DEBUG) {
18547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                        Log.d(TAG, "onSubtitleData(): getTrackIndex: " + data.getTrackIndex()
18647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                                + ", getCurrentPosition: " + mp.getCurrentPosition()
18747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                                + ", getStartTimeUs(): " + data.getStartTimeUs()
18847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                                + ", diff: "
18947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                                + (data.getStartTimeUs() / 1000 - mp.getCurrentPosition())
19047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                                + "ms, getDurationUs(): " + data.getDurationUs());
19147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
19247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    }
19347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    final int index = data.getTrackIndex();
19447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    if (index != mSelectedSubtitleTrackIndex) {
19547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                        Log.d(TAG, "onSubtitleData(): getTrackIndex: " + data.getTrackIndex()
19647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                                + ", selected track index: " + mSelectedSubtitleTrackIndex);
19747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                        return;
19847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    }
19947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    for (Pair<Integer, SubtitleTrack> p : mSubtitleTrackIndices) {
20047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                        if (p.first == index) {
20147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                            SubtitleTrack track = p.second;
20247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                            track.onData(data);
20347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                        }
20447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                    }
20547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                }
20647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            };
20747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
20847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
20947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    protected void doShowSubtitleCommand(Bundle args) {
21047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        int subtitleIndex = args.getInt(
21147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                MediaControlView2.KEY_SELECTED_SUBTITLE_INDEX,
21247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                INVALID_TRACK_INDEX);
21347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        if (subtitleIndex != INVALID_TRACK_INDEX) {
21447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            int subtitleTrackIndex = mSubtitleTrackIndices.get(subtitleIndex).first;
21547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            if (subtitleTrackIndex != mSelectedSubtitleTrackIndex) {
21647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mSelectedSubtitleTrackIndex = subtitleTrackIndex;
21747740510281e2d2c5a535c31d52ac970d32951c6Insun Kang                mInstance.setSubtitleEnabled(true);
21847740510281e2d2c5a535c31d52ac970d32951c6Insun Kang            }
21947740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        }
22047740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
22147740510281e2d2c5a535c31d52ac970d32951c6Insun Kang
22247740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    @Override
22347740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    protected void doHideSubtitleCommand() {
22447740510281e2d2c5a535c31d52ac970d32951c6Insun Kang        mInstance.setSubtitleEnabled(false);
22547740510281e2d2c5a535c31d52ac970d32951c6Insun Kang    }
22647740510281e2d2c5a535c31d52ac970d32951c6Insun Kang}
227