Merge "Initial commit for VideoView2Impl"
diff --git a/core/java/android/widget/MediaController2.java b/core/java/android/widget/MediaControlView2.java
similarity index 63%
rename from core/java/android/widget/MediaController2.java
rename to core/java/android/widget/MediaControlView2.java
index 9035137..6e85ece 100644
--- a/core/java/android/widget/MediaController2.java
+++ b/core/java/android/widget/MediaControlView2.java
@@ -19,130 +19,145 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
-import android.graphics.Canvas;
 import android.media.session.MediaController;
 import android.media.update.ApiLoader;
-import android.media.update.MediaController2Provider;
+import android.media.update.MediaControlView2Provider;
 import android.media.update.ViewProvider;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
 
 /**
  * TODO PUBLIC API
  * @hide
  */
-public class MediaController2 extends FrameLayout {
-    private final MediaController2Provider mProvider;
+public class MediaControlView2 extends FrameLayout {
+    private final MediaControlView2Provider mProvider;
 
-    public MediaController2(@NonNull Context context) {
+    public MediaControlView2(@NonNull Context context) {
         this(context, null);
     }
 
-    public MediaController2(@NonNull Context context, @Nullable AttributeSet attrs) {
+    public MediaControlView2(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public MediaController2(@NonNull Context context, @Nullable AttributeSet attrs,
+    public MediaControlView2(@NonNull Context context, @Nullable AttributeSet attrs,
                             int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public MediaController2(@NonNull Context context, @Nullable AttributeSet attrs,
+    public MediaControlView2(@NonNull Context context, @Nullable AttributeSet attrs,
                             int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         mProvider = ApiLoader.getProvider(context)
-                .createMediaController2(this, new SuperProvider());
+                .createMediaControlView2(this, new SuperProvider());
     }
 
+    public MediaControlView2Provider getProvider() {
+        return mProvider;
+    }
+
+    /**
+     * TODO: add docs
+     */
     public void setController(MediaController controller) {
         mProvider.setController_impl(controller);
     }
 
-    public void setAnchorView(View view) {
-        mProvider.setAnchorView_impl(view);
-    }
-
+    /**
+     * TODO: add docs
+     */
     public void show() {
         mProvider.show_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public void show(int timeout) {
         mProvider.show_impl(timeout);
     }
 
+    /**
+     * TODO: add docs
+     */
     public boolean isShowing() {
         return mProvider.isShowing_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public void hide() {
         mProvider.hide_impl();
     }
 
-    public void setPrevNextListeners(OnClickListener next, OnClickListener prev) {
-        mProvider.setPrevNextListeners_impl(next, prev);
-    }
-
+    /**
+     * TODO: add docs
+     */
     public void showCCButton() {
         mProvider.showCCButton_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public boolean isPlaying() {
         return mProvider.isPlaying_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public int getCurrentPosition() {
         return mProvider.getCurrentPosition_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public int getBufferPercentage() {
         return mProvider.getBufferPercentage_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public boolean canPause() {
         return mProvider.canPause_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public boolean canSeekBackward() {
         return mProvider.canSeekBackward_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public boolean canSeekForward() {
         return mProvider.canSeekForward_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public void showSubtitle() {
         mProvider.showSubtitle_impl();
     }
 
+    /**
+     * TODO: add docs
+     */
     public void hideSubtitle() {
         mProvider.hideSubtitle_impl();
     }
 
     @Override
-    protected void onAttachedToWindow() {
-        mProvider.onAttachedToWindow_impl();
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        mProvider.onDetachedFromWindow_impl();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        mProvider.onLayout_impl(changed, left, top, right, bottom);
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        mProvider.draw_impl(canvas);
-    }
-
-    @Override
     public CharSequence getAccessibilityClassName() {
         return mProvider.getAccessibilityClassName_impl();
     }
@@ -179,58 +194,38 @@
 
     private class SuperProvider implements ViewProvider {
         @Override
-        public void onAttachedToWindow_impl() {
-            MediaController2.super.onAttachedToWindow();
-        }
-
-        @Override
-        public void onDetachedFromWindow_impl() {
-            MediaController2.super.onDetachedFromWindow();
-        }
-
-        @Override
-        public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
-            MediaController2.super.onLayout(changed, left, top, right, bottom);
-        }
-
-        @Override
-        public void draw_impl(Canvas canvas) {
-            MediaController2.super.draw(canvas);
-        }
-
-        @Override
         public CharSequence getAccessibilityClassName_impl() {
-            return MediaController2.super.getAccessibilityClassName();
+            return MediaControlView2.super.getAccessibilityClassName();
         }
 
         @Override
         public boolean onTouchEvent_impl(MotionEvent ev) {
-            return MediaController2.super.onTouchEvent(ev);
+            return MediaControlView2.super.onTouchEvent(ev);
         }
 
         @Override
         public boolean onTrackballEvent_impl(MotionEvent ev) {
-            return MediaController2.super.onTrackballEvent(ev);
+            return MediaControlView2.super.onTrackballEvent(ev);
         }
 
         @Override
         public boolean onKeyDown_impl(int keyCode, KeyEvent event) {
-            return MediaController2.super.onKeyDown(keyCode, event);
+            return MediaControlView2.super.onKeyDown(keyCode, event);
         }
 
         @Override
         public void onFinishInflate_impl() {
-            MediaController2.super.onFinishInflate();
+            MediaControlView2.super.onFinishInflate();
         }
 
         @Override
         public boolean dispatchKeyEvent_impl(KeyEvent event) {
-            return MediaController2.super.dispatchKeyEvent(event);
+            return MediaControlView2.super.dispatchKeyEvent(event);
         }
 
         @Override
         public void setEnabled_impl(boolean enabled) {
-            MediaController2.super.setEnabled(enabled);
+            MediaControlView2.super.setEnabled(enabled);
         }
     }
 }
diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java
index 310a7bb..955f053 100644
--- a/core/java/android/widget/VideoView2.java
+++ b/core/java/android/widget/VideoView2.java
@@ -20,9 +20,8 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
-import android.graphics.Canvas;
 import android.media.AudioAttributes;
-import android.media.MediaPlayer;
+import android.media.AudioManager;
 import android.media.update.ApiLoader;
 import android.media.update.VideoView2Provider;
 import android.media.update.ViewProvider;
@@ -80,7 +79,8 @@
             int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
-        mProvider = ApiLoader.getProvider(context).createVideoView2(this, new SuperProvider());
+        mProvider = ApiLoader.getProvider(context).createVideoView2(this, new SuperProvider(),
+                attrs, defStyleAttr, defStyleRes);
     }
 
     /**
@@ -93,6 +93,20 @@
     /**
      * @hide
      */
+    public void setMediaControlView2(MediaControlView2 mediaControlView) {
+        mProvider.setMediaControlView2_impl(mediaControlView);
+    }
+
+    /**
+     * @hide
+     */
+    public MediaControlView2 getMediaControlView2() {
+        return mProvider.getMediaControlView2_impl();
+    }
+
+    /**
+     * @hide
+     */
     public void start() {
         mProvider.start_impl();
     }
@@ -161,6 +175,45 @@
     }
 
     /**
+     * Sets playback speed.
+     *
+     * It is expressed as a multiplicative factor, where normal speed is 1.0f. If it is less than
+     * or equal to zero, it will be just ignored and nothing will be changed. If it exceeds the
+     * maximum speed that internal engine supports, system will determine best handling or it will
+     * be reset to the normal speed 1.0f.
+     * TODO: This should be revised after integration with MediaPlayer2.
+     * @param speed the playback speed. It should be positive.
+     * @hide
+     */
+    public void setSpeed(float speed) {
+        mProvider.setSpeed_impl(speed);
+    }
+
+    /**
+     * Returns current speed setting.
+     *
+     * If setSpeed() has never been called, returns the default value 1.0f.
+     * @return current speed setting
+     * @hide
+     */
+    public float getSpeed() {
+        return mProvider.getSpeed_impl();
+    }
+
+    /**
+     * Sets which type of audio focus will be requested during the playback, or configures playback
+     * to not request audio focus. Valid values for focus requests are
+     * {@link AudioManager#AUDIOFOCUS_GAIN}, {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT},
+     * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, and
+     * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}. Or use
+     * {@link AudioManager#AUDIOFOCUS_NONE} to express that audio focus should not be
+     * requested when playback starts. You can for instance use this when playing a silent animation
+     * through this class, and you don't want to affect other audio applications playing in the
+     * background.
+     *
+     * @param focusGain the type of audio focus gain that will be requested, or
+     *     {@link AudioManager#AUDIOFOCUS_NONE} to disable the use audio focus during playback.
+     *
      * @hide
      */
     public void setAudioFocusRequest(int focusGain) {
@@ -168,6 +221,10 @@
     }
 
     /**
+     * Sets the {@link AudioAttributes} to be used during the playback of the video.
+     *
+     * @param attributes non-null <code>AudioAttributes</code>.
+     *
      * @hide
      */
     public void setAudioAttributes(@NonNull AudioAttributes attributes) {
@@ -175,6 +232,9 @@
     }
 
     /**
+     * Sets video path.
+     *
+     * @param path the path of the video.
      * @hide
      */
     public void setVideoPath(String path) {
@@ -198,13 +258,6 @@
     /**
      * @hide
      */
-    public void setMediaController2(MediaController2 controllerView) {
-        mProvider.setMediaController2_impl(controllerView);
-    }
-
-    /**
-     * @hide
-     */
     public void setViewType(@ViewType int viewType) {
         mProvider.setViewType_impl(viewType);
     }
@@ -227,28 +280,28 @@
     /**
      * @hide
      */
-    public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) {
+    public void setOnPreparedListener(OnPreparedListener l) {
         mProvider.setOnPreparedListener_impl(l);
     }
 
     /**
      * @hide
      */
-    public void setOnCompletionListener(MediaPlayer.OnCompletionListener l) {
+    public void setOnCompletionListener(OnCompletionListener l) {
         mProvider.setOnCompletionListener_impl(l);
     }
 
     /**
      * @hide
      */
-    public void setOnErrorListener(MediaPlayer.OnErrorListener l) {
+    public void setOnErrorListener(OnErrorListener l) {
         mProvider.setOnErrorListener_impl(l);
     }
 
     /**
      * @hide
      */
-    public void setOnInfoListener(MediaPlayer.OnInfoListener l) {
+    public void setOnInfoListener(OnInfoListener l) {
         mProvider.setOnInfoListener_impl(l);
     }
 
@@ -260,15 +313,61 @@
     }
 
     /**
+     * Interface definition of a callback to be invoked when the viw type has been changed.
      * @hide
      */
     public interface OnViewTypeChangedListener {
         /**
-         * @hide
+         * Called when the view type has been changed.
+         * @see VideoView2#setViewType(int)
          */
         void onViewTypeChanged(@ViewType int viewType);
     }
 
+    /**
+     * @hide
+     */
+    public interface OnPreparedListener {
+        /**
+         * Called when the media file is ready for playback.
+         */
+        void onPrepared();
+    }
+
+    /**
+     * @hide
+     */
+    public interface OnCompletionListener {
+        /**
+         * Called when the end of a media source is reached during playback.
+         */
+        void onCompletion();
+    }
+
+    /**
+     * @hide
+     */
+    public interface OnErrorListener {
+        /**
+         * Called to indicate an error.
+         */
+        boolean onError(int what, int extra);
+    }
+
+    /**
+     * @hide
+     */
+    public interface OnInfoListener {
+        /**
+         * Called to indicate an info or a warning.
+         * @see MediaPlayer#OnInfoListener
+         *
+         * @param what the type of info or warning.
+         * @param extra an extra code, specific to the info.
+         */
+        void onInfo(int what, int extra);
+    }
+
     @Override
     public CharSequence getAccessibilityClassName() {
         return mProvider.getAccessibilityClassName_impl();
@@ -306,26 +405,6 @@
 
     private class SuperProvider implements ViewProvider {
         @Override
-        public void onAttachedToWindow_impl() {
-            VideoView2.super.onAttachedToWindow();
-        }
-
-        @Override
-        public void onDetachedFromWindow_impl() {
-            VideoView2.super.onDetachedFromWindow();
-        }
-
-        @Override
-        public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
-            VideoView2.super.onLayout(changed, left, top, right, bottom);
-        }
-
-        @Override
-        public void draw_impl(Canvas canvas) {
-            VideoView2.super.draw(canvas);
-        }
-
-        @Override
         public CharSequence getAccessibilityClassName_impl() {
             return VideoView2.super.getAccessibilityClassName();
         }
diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaControlView2Provider.java
similarity index 82%
rename from media/java/android/media/update/MediaController2Provider.java
rename to media/java/android/media/update/MediaControlView2Provider.java
index 71fbd08..83763b4 100644
--- a/media/java/android/media/update/MediaController2Provider.java
+++ b/media/java/android/media/update/MediaControlView2Provider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@
 import android.annotation.SystemApi;
 import android.media.session.MediaController;
 import android.view.View;
-import android.view.View.OnClickListener;
 
 /**
  * Interface for connecting the public API to an updatable implementation.
@@ -30,19 +29,17 @@
  *
  * All methods behave as per their namesake in the public API.
  *
- * @see android.widget.MediaController2
+ * @see android.widget.MediaControlView2
  *
  * @hide
  */
 // TODO @SystemApi
-public interface MediaController2Provider extends ViewProvider {
+public interface MediaControlView2Provider extends ViewProvider {
     void setController_impl(MediaController controller);
-    void setAnchorView_impl(View view);
     void show_impl();
     void show_impl(int timeout);
     boolean isShowing_impl();
     void hide_impl();
-    void setPrevNextListeners_impl(OnClickListener next, OnClickListener prev);
     void showCCButton_impl();
     boolean isPlaying_impl();
     int getCurrentPosition_impl();
diff --git a/media/java/android/media/update/StaticProvider.java b/media/java/android/media/update/StaticProvider.java
index a1e2404..1a0df52 100644
--- a/media/java/android/media/update/StaticProvider.java
+++ b/media/java/android/media/update/StaticProvider.java
@@ -16,8 +16,10 @@
 
 package android.media.update;
 
+import android.annotation.Nullable;
 import android.annotation.SystemApi;
-import android.widget.MediaController2;
+import android.util.AttributeSet;
+import android.widget.MediaControlView2;
 import android.widget.VideoView2;
 
 /**
@@ -30,7 +32,9 @@
  */
 // TODO @SystemApi
 public interface StaticProvider {
-    MediaController2Provider createMediaController2(
-            MediaController2 instance, ViewProvider superProvider);
-    VideoView2Provider createVideoView2(VideoView2 instance, ViewProvider superProvider);
+    MediaControlView2Provider createMediaControlView2(
+            MediaControlView2 instance, ViewProvider superProvider);
+    VideoView2Provider createVideoView2(
+            VideoView2 instance, ViewProvider superProvider,
+            @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes);
 }
diff --git a/media/java/android/media/update/VideoView2Provider.java b/media/java/android/media/update/VideoView2Provider.java
index 6fc9bdc..b7a24e5 100644
--- a/media/java/android/media/update/VideoView2Provider.java
+++ b/media/java/android/media/update/VideoView2Provider.java
@@ -17,9 +17,8 @@
 package android.media.update;
 
 import android.media.AudioAttributes;
-import android.media.MediaPlayer;
 import android.net.Uri;
-import android.widget.MediaController2;
+import android.widget.MediaControlView2;
 import android.widget.VideoView2;
 
 import java.util.Map;
@@ -39,6 +38,8 @@
  */
 // TODO @SystemApi
 public interface VideoView2Provider extends ViewProvider {
+    void setMediaControlView2_impl(MediaControlView2 mediaControlView);
+    MediaControlView2 getMediaControlView2_impl();
     void start_impl();
     void pause_impl();
     int getDuration_impl();
@@ -49,18 +50,19 @@
     int getAudioSessionId_impl();
     void showSubtitle_impl();
     void hideSubtitle_impl();
+    void setSpeed_impl(float speed);
+    float getSpeed_impl();
     void setAudioFocusRequest_impl(int focusGain);
     void setAudioAttributes_impl(AudioAttributes attributes);
     void setVideoPath_impl(String path);
     void setVideoURI_impl(Uri uri);
     void setVideoURI_impl(Uri uri, Map<String, String> headers);
-    void setMediaController2_impl(MediaController2 controllerView);
     void setViewType_impl(int viewType);
     int getViewType_impl();
     void stopPlayback_impl();
-    void setOnPreparedListener_impl(MediaPlayer.OnPreparedListener l);
-    void setOnCompletionListener_impl(MediaPlayer.OnCompletionListener l);
-    void setOnErrorListener_impl(MediaPlayer.OnErrorListener l);
-    void setOnInfoListener_impl(MediaPlayer.OnInfoListener l);
+    void setOnPreparedListener_impl(VideoView2.OnPreparedListener l);
+    void setOnCompletionListener_impl(VideoView2.OnCompletionListener l);
+    void setOnErrorListener_impl(VideoView2.OnErrorListener l);
+    void setOnInfoListener_impl(VideoView2.OnInfoListener l);
     void setOnViewTypeChangedListener_impl(VideoView2.OnViewTypeChangedListener l);
 }
diff --git a/media/java/android/media/update/ViewProvider.java b/media/java/android/media/update/ViewProvider.java
index bc8f203..e542404 100644
--- a/media/java/android/media/update/ViewProvider.java
+++ b/media/java/android/media/update/ViewProvider.java
@@ -37,10 +37,6 @@
 // TODO @SystemApi
 public interface ViewProvider {
     // TODO Add more (all?) methods from View
-    void onAttachedToWindow_impl();
-    void onDetachedFromWindow_impl();
-    void onLayout_impl(boolean changed, int left, int top, int right, int bottom);
-    void draw_impl(Canvas canvas);
     CharSequence getAccessibilityClassName_impl();
     boolean onTouchEvent_impl(MotionEvent ev);
     boolean onTrackballEvent_impl(MotionEvent ev);