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