1// CHECKSTYLE:OFF Generated code
2/* This file is auto-generated from VideoSupportFragmentTest.java.  DO NOT MODIFY. */
3
4/*
5 * Copyright (C) 2016 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package androidx.leanback.app;
20
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertFalse;
23import static org.junit.Assert.assertNotNull;
24import static org.junit.Assert.assertNotSame;
25import static org.junit.Assert.assertTrue;
26
27import android.net.Uri;
28import android.os.Bundle;
29import android.os.SystemClock;
30import android.support.test.InstrumentationRegistry;
31import android.support.test.filters.LargeTest;
32import android.support.test.runner.AndroidJUnit4;
33import android.view.LayoutInflater;
34import android.view.SurfaceHolder;
35import android.view.View;
36import android.view.ViewGroup;
37
38import androidx.leanback.media.MediaPlayerGlue;
39import androidx.leanback.media.PlaybackGlue;
40import androidx.leanback.media.PlaybackGlueHost;
41import androidx.leanback.test.R;
42import androidx.leanback.testutils.PollingCheck;
43
44import org.junit.Test;
45import org.junit.runner.RunWith;
46
47@LargeTest
48@RunWith(AndroidJUnit4.class)
49public class VideoFragmentTest extends SingleFragmentTestBase {
50
51    public static class Fragment_setSurfaceViewCallbackBeforeCreate extends VideoFragment {
52        boolean mSurfaceCreated;
53        @Override
54        public View onCreateView(
55                LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
56
57            setSurfaceHolderCallback(new SurfaceHolder.Callback() {
58                @Override
59                public void surfaceCreated(SurfaceHolder holder) {
60                    mSurfaceCreated = true;
61                }
62
63                @Override
64                public void surfaceChanged(SurfaceHolder holder, int format, int width,
65                                           int height) {
66                }
67
68                @Override
69                public void surfaceDestroyed(SurfaceHolder holder) {
70                    mSurfaceCreated = false;
71                }
72            });
73
74            return super.onCreateView(inflater, container, savedInstanceState);
75        }
76    }
77
78    @Test
79    public void setSurfaceViewCallbackBeforeCreate() {
80        final SingleFragmentTestActivity activity =
81                launchAndWaitActivity(Fragment_setSurfaceViewCallbackBeforeCreate.class, 1000);
82        Fragment_setSurfaceViewCallbackBeforeCreate fragment1 =
83                (Fragment_setSurfaceViewCallbackBeforeCreate) activity.getTestFragment();
84        assertNotNull(fragment1);
85        assertTrue(fragment1.mSurfaceCreated);
86
87        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
88            @Override
89            public void run() {
90                activity.getFragmentManager().beginTransaction()
91                        .replace(R.id.main_frame, new Fragment_setSurfaceViewCallbackBeforeCreate())
92                        .commitAllowingStateLoss();
93            }
94        });
95        SystemClock.sleep(500);
96
97        assertFalse(fragment1.mSurfaceCreated);
98
99        Fragment_setSurfaceViewCallbackBeforeCreate fragment2 =
100                (Fragment_setSurfaceViewCallbackBeforeCreate) activity.getTestFragment();
101        assertNotNull(fragment2);
102        assertTrue(fragment2.mSurfaceCreated);
103        assertNotSame(fragment1, fragment2);
104    }
105
106    @Test
107    public void setSurfaceViewCallbackAfterCreate() {
108        SingleFragmentTestActivity activity = launchAndWaitActivity(VideoFragment.class, 1000);
109        VideoFragment fragment = (VideoFragment) activity.getTestFragment();
110
111        assertNotNull(fragment);
112
113        final boolean[] surfaceCreated = new boolean[1];
114        fragment.setSurfaceHolderCallback(new SurfaceHolder.Callback() {
115            @Override
116            public void surfaceCreated(SurfaceHolder holder) {
117                surfaceCreated[0] = true;
118            }
119
120            @Override
121            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
122            }
123
124            @Override
125            public void surfaceDestroyed(SurfaceHolder holder) {
126                surfaceCreated[0] = false;
127            }
128        });
129        assertTrue(surfaceCreated[0]);
130    }
131
132    public static class Fragment_withVideoPlayer extends VideoFragment {
133        MediaPlayerGlue mGlue;
134        int mOnCreateCalled;
135        int mOnCreateViewCalled;
136        int mOnDestroyViewCalled;
137        int mOnDestroyCalled;
138        int mGlueAttachedToHost;
139        int mGlueDetachedFromHost;
140        int mGlueOnReadyForPlaybackCalled;
141
142        public Fragment_withVideoPlayer() {
143            setRetainInstance(true);
144        }
145
146        @Override
147        public void onCreate(Bundle savedInstanceState) {
148            mOnCreateCalled++;
149            super.onCreate(savedInstanceState);
150            mGlue = new MediaPlayerGlue(getActivity()) {
151                @Override
152                protected void onDetachedFromHost() {
153                    mGlueDetachedFromHost++;
154                    super.onDetachedFromHost();
155                }
156
157                @Override
158                protected void onAttachedToHost(PlaybackGlueHost host) {
159                    super.onAttachedToHost(host);
160                    mGlueAttachedToHost++;
161                }
162            };
163            mGlue.setMode(MediaPlayerGlue.REPEAT_ALL);
164            mGlue.setArtist("Leanback");
165            mGlue.setTitle("Leanback team at work");
166            mGlue.setMediaSource(
167                    Uri.parse("android.resource://androidx.leanback.test/raw/video"));
168            mGlue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
169                @Override
170                public void onPreparedStateChanged(PlaybackGlue glue) {
171                    if (glue.isPrepared()) {
172                        mGlueOnReadyForPlaybackCalled++;
173                        mGlue.play();
174                    }
175                }
176            });
177            mGlue.setHost(new VideoFragmentGlueHost(this));
178        }
179
180        @Override
181        public View onCreateView(LayoutInflater inflater, ViewGroup container,
182                                 Bundle savedInstanceState) {
183            mOnCreateViewCalled++;
184            return super.onCreateView(inflater, container, savedInstanceState);
185        }
186
187        @Override
188        public void onDestroyView() {
189            mOnDestroyViewCalled++;
190            super.onDestroyView();
191        }
192
193        @Override
194        public void onDestroy() {
195            mOnDestroyCalled++;
196            super.onDestroy();
197        }
198    }
199
200    @Test
201    public void mediaPlayerGlueInVideoFragment() {
202        final SingleFragmentTestActivity activity =
203                launchAndWaitActivity(Fragment_withVideoPlayer.class, 1000);
204        final Fragment_withVideoPlayer fragment = (Fragment_withVideoPlayer)
205                activity.getTestFragment();
206
207        PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
208            @Override
209            public boolean canProceed() {
210                return fragment.mGlue.isMediaPlaying();
211            }
212        });
213
214        assertEquals(1, fragment.mOnCreateCalled);
215        assertEquals(1, fragment.mOnCreateViewCalled);
216        assertEquals(0, fragment.mOnDestroyViewCalled);
217        assertEquals(1, fragment.mGlueOnReadyForPlaybackCalled);
218        View fragmentViewBeforeRecreate = fragment.getView();
219
220        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
221            @Override
222            public void run() {
223                activity.recreate();
224            }
225        });
226
227        PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
228            @Override
229            public boolean canProceed() {
230                return fragment.mOnCreateViewCalled == 2 && fragment.mGlue.isMediaPlaying();
231            }
232        });
233        View fragmentViewAfterRecreate = fragment.getView();
234
235        assertNotSame(fragmentViewBeforeRecreate, fragmentViewAfterRecreate);
236        assertEquals(1, fragment.mOnCreateCalled);
237        assertEquals(2, fragment.mOnCreateViewCalled);
238        assertEquals(1, fragment.mOnDestroyViewCalled);
239
240        assertEquals(1, fragment.mGlueAttachedToHost);
241        assertEquals(0, fragment.mGlueDetachedFromHost);
242        assertEquals(1, fragment.mGlueOnReadyForPlaybackCalled);
243
244        activity.finish();
245        PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
246            @Override
247            public boolean canProceed() {
248                return fragment.mGlueDetachedFromHost == 1;
249            }
250        });
251        assertEquals(2, fragment.mOnDestroyViewCalled);
252        assertEquals(1, fragment.mOnDestroyCalled);
253    }
254
255}
256