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