Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.widget.cts;
     18 
     19 import com.android.cts.widget.R;
     20 
     21 
     22 import org.xmlpull.v1.XmlPullParser;
     23 
     24 import android.app.Activity;
     25 import android.app.Instrumentation;
     26 import android.content.Context;
     27 import android.cts.util.PollingCheck;
     28 import android.test.ActivityInstrumentationTestCase2;
     29 import android.test.UiThreadTest;
     30 import android.util.AttributeSet;
     31 import android.util.Xml;
     32 import android.view.MotionEvent;
     33 import android.view.View;
     34 import android.view.View.OnClickListener;
     35 import android.widget.MediaController;
     36 import android.widget.VideoView;
     37 
     38 import java.io.IOException;
     39 import java.io.InputStream;
     40 import java.io.OutputStream;
     41 
     42 /**
     43  * Test {@link MediaController}.
     44  */
     45 public class MediaControllerTest extends
     46         ActivityInstrumentationTestCase2<MediaControllerCtsActivity> {
     47     private MediaController mMediaController;
     48     private Activity mActivity;
     49     private Instrumentation mInstrumentation;
     50     private static final long DEFAULT_TIMEOUT = 3000;
     51 
     52     public MediaControllerTest() {
     53         super("com.android.cts.widget", MediaControllerCtsActivity.class);
     54     }
     55 
     56     @Override
     57     protected void setUp() throws Exception {
     58         super.setUp();
     59         mActivity = getActivity();
     60         mInstrumentation = getInstrumentation();
     61     }
     62 
     63     @UiThreadTest
     64     public void testConstructor() {
     65         new MediaController(mActivity, null);
     66 
     67         new MediaController(mActivity, true);
     68 
     69         new MediaController(mActivity);
     70 
     71         final XmlPullParser parser =
     72                 mActivity.getResources().getXml(R.layout.mediacontroller_layout);
     73         final AttributeSet attrs = Xml.asAttributeSet(parser);
     74         new MediaController(mActivity, attrs);
     75     }
     76 
     77     /**
     78      * scenario description:
     79      * 1. Show the MediaController.
     80      *
     81      */
     82     @UiThreadTest
     83     public void testMediaController() {
     84         mMediaController = new MediaController(mActivity);
     85         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
     86         mMediaController.setMediaPlayer(mediaPlayerControl);
     87 
     88         assertFalse(mMediaController.isShowing());
     89         mMediaController.show();
     90         // setAnchorView() must be called before show(),
     91         // otherwise MediaController never show.
     92         assertFalse(mMediaController.isShowing());
     93 
     94         View videoview = mActivity.findViewById(R.id.mediacontroller_videoview);
     95         mMediaController.setAnchorView(videoview);
     96 
     97         mMediaController.show();
     98         assertTrue(mMediaController.isShowing());
     99 
    100         // ideally test would trigger pause/play/ff/rew here and test response, but no way
    101         // to trigger those actions from MediaController
    102 
    103         mMediaController = new MediaController(mActivity, false);
    104         mMediaController.setMediaPlayer(mediaPlayerControl);
    105         videoview = mActivity.findViewById(R.id.mediacontroller_videoview);
    106         mMediaController.setAnchorView(videoview);
    107 
    108         mMediaController.show();
    109         assertTrue(mMediaController.isShowing());
    110     }
    111 
    112     public void testShow() {
    113         mActivity.runOnUiThread(new Runnable() {
    114             public void run() {
    115                 mMediaController = new MediaController(mActivity, true);
    116             }
    117         });
    118         mInstrumentation.waitForIdleSync();
    119         assertFalse(mMediaController.isShowing());
    120 
    121         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
    122         mMediaController.setMediaPlayer(mediaPlayerControl);
    123 
    124         final VideoView videoView =
    125                 (VideoView) mActivity.findViewById(R.id.mediacontroller_videoview);
    126         mMediaController.setAnchorView(videoView);
    127 
    128         mActivity.runOnUiThread(new Runnable() {
    129             public void run() {
    130                 mMediaController.show();
    131             }
    132         });
    133         mInstrumentation.waitForIdleSync();
    134         assertTrue(mMediaController.isShowing());
    135 
    136         mActivity.runOnUiThread(new Runnable() {
    137             public void run() {
    138                 mMediaController.hide();
    139             }
    140         });
    141         mInstrumentation.waitForIdleSync();
    142         assertFalse(mMediaController.isShowing());
    143 
    144         final int timeout = 2000;
    145         mActivity.runOnUiThread(new Runnable() {
    146             public void run() {
    147                 mMediaController.show(timeout);
    148             }
    149         });
    150         mInstrumentation.waitForIdleSync();
    151         assertTrue(mMediaController.isShowing());
    152 
    153         // isShowing() should return false, but MediaController still shows, this may be a bug.
    154         new PollingCheck(timeout + 500) {
    155             @Override
    156             protected boolean check() {
    157                 return mMediaController.isShowing();
    158             }
    159         }.run();
    160     }
    161 
    162     private String prepareSampleVideo() {
    163         InputStream source = null;
    164         OutputStream target = null;
    165         final String VIDEO_NAME   = "testvideo.3gp";
    166 
    167         try {
    168             source = mActivity.getResources().openRawResource(R.raw.testvideo);
    169             target = mActivity.openFileOutput(VIDEO_NAME, Context.MODE_WORLD_READABLE);
    170 
    171             final byte[] buffer = new byte[1024];
    172             for (int len = source.read(buffer); len > 0; len = source.read(buffer)) {
    173                 target.write(buffer, 0, len);
    174             }
    175         } catch (final IOException e) {
    176             fail(e.getMessage());
    177         } finally {
    178             try {
    179                 if (source != null) {
    180                     source.close();
    181                 }
    182                 if (target != null) {
    183                     target.close();
    184                 }
    185             } catch (final IOException _) {
    186                 // Ignore the IOException.
    187             }
    188         }
    189 
    190         return mActivity.getFileStreamPath(VIDEO_NAME).getAbsolutePath();
    191     }
    192 
    193     public void testOnTrackballEvent() {
    194         mActivity.runOnUiThread(new Runnable() {
    195             public void run() {
    196                 mMediaController = new MediaController(mActivity);
    197             }
    198         });
    199         mInstrumentation.waitForIdleSync();
    200         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
    201         mMediaController.setMediaPlayer(mediaPlayerControl);
    202 
    203         final VideoView videoView =
    204                 (VideoView) mActivity.findViewById(R.id.mediacontroller_videoview);
    205         videoView.setMediaController(mMediaController);
    206         mActivity.runOnUiThread(new Runnable() {
    207             public void run() {
    208                 videoView.setVideoPath(prepareSampleVideo());
    209                 videoView.requestFocus();
    210             }
    211         });
    212         mInstrumentation.waitForIdleSync();
    213 
    214         final long curTime = System.currentTimeMillis();
    215         // get the center of the VideoView.
    216         final int[] xy = new int[2];
    217         videoView.getLocationOnScreen(xy);
    218 
    219         final int viewWidth = videoView.getWidth();
    220         final int viewHeight = videoView.getHeight();
    221 
    222         final float x = xy[0] + viewWidth / 2.0f;
    223         final float y = xy[1] + viewHeight / 2.0f;
    224         final MotionEvent event = MotionEvent.obtain(curTime, 100,
    225                 MotionEvent.ACTION_DOWN, x, y, 0);
    226         mInstrumentation.sendTrackballEventSync(event);
    227         mInstrumentation.waitForIdleSync();
    228     }
    229 
    230     @UiThreadTest
    231     public void testSetEnabled() {
    232         final View videoView = mActivity.findViewById(R.id.mediacontroller_videoview);
    233         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
    234 
    235         mMediaController = new MediaController(mActivity);
    236         mMediaController.setAnchorView(videoView);
    237         mMediaController.setMediaPlayer(mediaPlayerControl);
    238 
    239         final MockOnClickListener next = new MockOnClickListener();
    240         final MockOnClickListener prev = new MockOnClickListener();
    241         mMediaController.setPrevNextListeners(next, prev);
    242 
    243         mMediaController.show();
    244 
    245         mMediaController.setEnabled(true);
    246         assertTrue(mMediaController.isEnabled());
    247 
    248         mMediaController.setEnabled(false);
    249         assertFalse(mMediaController.isEnabled());
    250     }
    251 
    252     @UiThreadTest
    253     public void testSetPrevNextListeners() {
    254         final View videoView = mActivity.findViewById(R.id.mediacontroller_videoview);
    255         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
    256 
    257         mMediaController = new MediaController(mActivity);
    258         mMediaController.setAnchorView(videoView);
    259         mMediaController.setMediaPlayer(mediaPlayerControl);
    260 
    261         final MockOnClickListener next = new MockOnClickListener();
    262         final MockOnClickListener prev = new MockOnClickListener();
    263         mMediaController.setPrevNextListeners(next, prev);
    264     }
    265 
    266     private static class MockMediaPlayerControl implements MediaController.MediaPlayerControl {
    267         private boolean mIsPlayingCalled = false;
    268         private boolean mIsPlaying = false;
    269         private int mPosition = 0;
    270 
    271         public boolean hasIsPlayingCalled() {
    272             return mIsPlayingCalled;
    273         }
    274 
    275         public void start() {
    276             mIsPlaying = true;
    277         }
    278 
    279         public void pause() {
    280             mIsPlaying = false;
    281         }
    282 
    283         public int getDuration() {
    284             return 0;
    285         }
    286 
    287         public int getCurrentPosition() {
    288             return mPosition;
    289         }
    290 
    291         public void seekTo(int pos) {
    292             mPosition = pos;
    293         }
    294 
    295         public boolean isPlaying() {
    296             mIsPlayingCalled = true;
    297             return mIsPlaying;
    298         }
    299 
    300         public int getBufferPercentage() {
    301             return 0;
    302         }
    303 
    304         public boolean canPause() {
    305             return true;
    306         }
    307 
    308         public boolean canSeekBackward() {
    309             return true;
    310         }
    311 
    312         public boolean canSeekForward() {
    313             return true;
    314         }
    315 
    316         @Override
    317         public int getAudioSessionId() {
    318             return 0;
    319         }
    320     }
    321 
    322     private static class MockOnClickListener implements OnClickListener {
    323         private boolean mOnClickCalled = false;
    324 
    325         public boolean hasOnClickCalled() {
    326             return mOnClickCalled;
    327         }
    328 
    329         public void onClick(View v) {
    330             mOnClickCalled = true;
    331         }
    332     }
    333 }
    334