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