1134545d2d8429615552931ef50a15ba2994d03f8Insun Kang/* 2134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * Copyright 2018 The Android Open Source Project 3134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * 4134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * Licensed under the Apache License, Version 2.0 (the "License"); 5134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * you may not use this file except in compliance with the License. 6134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * You may obtain a copy of the License at 7134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * 8134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * http://www.apache.org/licenses/LICENSE-2.0 9134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * 10134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * Unless required by applicable law or agreed to in writing, software 11134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * distributed under the License is distributed on an "AS IS" BASIS, 12134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * See the License for the specific language governing permissions and 14134545d2d8429615552931ef50a15ba2994d03f8Insun Kang * limitations under the License. 15134545d2d8429615552931ef50a15ba2994d03f8Insun Kang */ 16134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 17134545d2d8429615552931ef50a15ba2994d03f8Insun Kangpackage androidx.media.widget; 18134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 19134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport android.content.Context; 20134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport android.graphics.Canvas; 21134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport android.os.Looper; 22134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport android.util.AttributeSet; 23134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 24134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport androidx.annotation.Nullable; 25134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport androidx.annotation.RequiresApi; 26134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport androidx.media.subtitle.SubtitleController.Anchor; 27134545d2d8429615552931ef50a15ba2994d03f8Insun Kangimport androidx.media.subtitle.SubtitleTrack.RenderingWidget; 28134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 29134545d2d8429615552931ef50a15ba2994d03f8Insun Kang@RequiresApi(21) 30134545d2d8429615552931ef50a15ba2994d03f8Insun Kangclass SubtitleView extends BaseLayout implements Anchor { 31134545d2d8429615552931ef50a15ba2994d03f8Insun Kang private static final String TAG = "SubtitleView"; 32134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 33134545d2d8429615552931ef50a15ba2994d03f8Insun Kang private RenderingWidget mSubtitleWidget; 34134545d2d8429615552931ef50a15ba2994d03f8Insun Kang private RenderingWidget.OnChangedListener mSubtitlesChangedListener; 35134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 36134545d2d8429615552931ef50a15ba2994d03f8Insun Kang SubtitleView(Context context) { 37134545d2d8429615552931ef50a15ba2994d03f8Insun Kang this(context, null); 38134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 39134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 40134545d2d8429615552931ef50a15ba2994d03f8Insun Kang SubtitleView(Context context, @Nullable AttributeSet attrs) { 41134545d2d8429615552931ef50a15ba2994d03f8Insun Kang this(context, attrs, 0); 42134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 43134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 44134545d2d8429615552931ef50a15ba2994d03f8Insun Kang SubtitleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 45134545d2d8429615552931ef50a15ba2994d03f8Insun Kang this(context, attrs, defStyleAttr, 0); 46134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 47134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 48134545d2d8429615552931ef50a15ba2994d03f8Insun Kang SubtitleView( 49134545d2d8429615552931ef50a15ba2994d03f8Insun Kang Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 50134545d2d8429615552931ef50a15ba2994d03f8Insun Kang super(context, attrs, defStyleAttr, defStyleRes); 51134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 52134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 53134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 54134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public void setSubtitleWidget(RenderingWidget subtitleWidget) { 55134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitleWidget == subtitleWidget) { 56134545d2d8429615552931ef50a15ba2994d03f8Insun Kang return; 57134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 58134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 59134545d2d8429615552931ef50a15ba2994d03f8Insun Kang final boolean attachedToWindow = isAttachedToWindow(); 60134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitleWidget != null) { 61134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (attachedToWindow) { 62134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget.onDetachedFromWindow(); 63134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 64134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 65134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget.setOnChangedListener(null); 66134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 67134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget = subtitleWidget; 68134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 69134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (subtitleWidget != null) { 70134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitlesChangedListener == null) { 71134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitlesChangedListener = new RenderingWidget.OnChangedListener() { 72134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 73134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public void onChanged(RenderingWidget renderingWidget) { 74134545d2d8429615552931ef50a15ba2994d03f8Insun Kang invalidate(); 75134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 76134545d2d8429615552931ef50a15ba2994d03f8Insun Kang }; 77134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 78134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 79134545d2d8429615552931ef50a15ba2994d03f8Insun Kang setWillNotDraw(false); 80134545d2d8429615552931ef50a15ba2994d03f8Insun Kang subtitleWidget.setOnChangedListener(mSubtitlesChangedListener); 81134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 82134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (attachedToWindow) { 83134545d2d8429615552931ef50a15ba2994d03f8Insun Kang subtitleWidget.onAttachedToWindow(); 84134545d2d8429615552931ef50a15ba2994d03f8Insun Kang requestLayout(); 85134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 86134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } else { 87134545d2d8429615552931ef50a15ba2994d03f8Insun Kang setWillNotDraw(true); 88134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 89134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 90134545d2d8429615552931ef50a15ba2994d03f8Insun Kang invalidate(); 91134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 92134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 93134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 94134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public Looper getSubtitleLooper() { 95134545d2d8429615552931ef50a15ba2994d03f8Insun Kang return Looper.getMainLooper(); 96134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 97134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 98134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 99134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public void onAttachedToWindow() { 100134545d2d8429615552931ef50a15ba2994d03f8Insun Kang super.onAttachedToWindow(); 101134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 102134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitleWidget != null) { 103134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget.onAttachedToWindow(); 104134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 105134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 106134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 107134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 108134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public void onDetachedFromWindow() { 109134545d2d8429615552931ef50a15ba2994d03f8Insun Kang super.onDetachedFromWindow(); 110134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 111134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitleWidget != null) { 112134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget.onDetachedFromWindow(); 113134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 114134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 115134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 116134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 117134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public void onLayout(boolean changed, int left, int top, int right, int bottom) { 118134545d2d8429615552931ef50a15ba2994d03f8Insun Kang super.onLayout(changed, left, top, right, bottom); 119134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 120134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitleWidget != null) { 121134545d2d8429615552931ef50a15ba2994d03f8Insun Kang final int width = getWidth() - getPaddingLeft() - getPaddingRight(); 122134545d2d8429615552931ef50a15ba2994d03f8Insun Kang final int height = getHeight() - getPaddingTop() - getPaddingBottom(); 123134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 124134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget.setSize(width, height); 125134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 126134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 127134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 128134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 129134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public void draw(Canvas canvas) { 130134545d2d8429615552931ef50a15ba2994d03f8Insun Kang super.draw(canvas); 131134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 132134545d2d8429615552931ef50a15ba2994d03f8Insun Kang if (mSubtitleWidget != null) { 133134545d2d8429615552931ef50a15ba2994d03f8Insun Kang final int saveCount = canvas.save(); 134134545d2d8429615552931ef50a15ba2994d03f8Insun Kang canvas.translate(getPaddingLeft(), getPaddingTop()); 135134545d2d8429615552931ef50a15ba2994d03f8Insun Kang mSubtitleWidget.draw(canvas); 136134545d2d8429615552931ef50a15ba2994d03f8Insun Kang canvas.restoreToCount(saveCount); 137134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 138134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 139134545d2d8429615552931ef50a15ba2994d03f8Insun Kang 140134545d2d8429615552931ef50a15ba2994d03f8Insun Kang @Override 141134545d2d8429615552931ef50a15ba2994d03f8Insun Kang public CharSequence getAccessibilityClassName() { 142134545d2d8429615552931ef50a15ba2994d03f8Insun Kang return SubtitleView.class.getName(); 143134545d2d8429615552931ef50a15ba2994d03f8Insun Kang } 144134545d2d8429615552931ef50a15ba2994d03f8Insun Kang} 145