Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3202d002 authored by Insun Kang's avatar Insun Kang Committed by Android (Google) Code Review
Browse files

Merge "Make VV2 & MCV2 extend ViewGroup"

parents e7d1dea2 5135ac13
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ import android.media.update.SessionPlayer2Provider;
import android.media.update.SessionToken2Provider;
import android.media.update.StaticProvider;
import android.media.update.VideoView2Provider;
import android.media.update.ViewProvider;
import android.media.update.ViewGroupProvider;
import android.media.update.VolumeProvider2Provider;
import android.os.Bundle;
import android.os.IInterface;
@@ -205,16 +205,17 @@ public class ApiFactory implements StaticProvider {
    }

    @Override
    public MediaControlView2Provider createMediaControlView2(
            MediaControlView2 instance, ViewProvider superProvider) {
        return new MediaControlView2Impl(instance, superProvider);
    public MediaControlView2Provider createMediaControlView2(MediaControlView2 instance,
            ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
            @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        return new MediaControlView2Impl(instance, superProvider, privateProvider);
    }

    @Override
    public VideoView2Provider createVideoView2(
            VideoView2 instance, ViewProvider superProvider,
            VideoView2 instance, ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
            @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        return new VideoView2Impl(instance, superProvider, attrs, defStyleAttr, defStyleRes);
        return new VideoView2Impl(instance, superProvider, privateProvider);
    }

    @Override
+215 −0
Original line number Diff line number Diff line
/*
 * Copyright 2018 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.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.widget;

import android.graphics.drawable.Drawable;
import android.media.update.ViewGroupProvider;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;

import java.util.ArrayList;

public class BaseLayout extends ViewGroupImpl {
    private final ViewGroup mInstance;
    private final ViewGroupProvider mSuperProvider;
    private final ViewGroupProvider mPrivateProvider;

    private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);

    public BaseLayout(ViewGroup instance,
            ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
        super(instance, superProvider, privateProvider);
        mInstance = instance;
        mSuperProvider = superProvider;
        mPrivateProvider = privateProvider;
    }

    @Override
    public boolean checkLayoutParams_impl(LayoutParams p) {
        return p instanceof MarginLayoutParams;
    }

    @Override
    public LayoutParams generateDefaultLayoutParams_impl() {
        return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }

    @Override
    public LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
        return new MarginLayoutParams(mInstance.getContext(), attrs);
    }

    @Override
    public LayoutParams generateLayoutParams_impl(LayoutParams lp) {
        if (lp instanceof MarginLayoutParams) {
            return lp;
        }
        return new MarginLayoutParams(lp);
    }

    @Override
    public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
        int count = mInstance.getChildCount();

        final boolean measureMatchParentChildren =
                View.MeasureSpec.getMode(widthMeasureSpec) != View.MeasureSpec.EXACTLY ||
                        View.MeasureSpec.getMode(heightMeasureSpec) != View.MeasureSpec.EXACTLY;
        mMatchParentChildren.clear();

        int maxHeight = 0;
        int maxWidth = 0;
        int childState = 0;

        for (int i = 0; i < count; i++) {
            final View child = mInstance.getChildAt(i);
            if (child.getVisibility() != View.GONE) {
                mPrivateProvider.measureChildWithMargins_impl(
                        child, widthMeasureSpec, 0, heightMeasureSpec, 0);
                final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
                maxWidth = Math.max(maxWidth,
                        child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                maxHeight = Math.max(maxHeight,
                        child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
                childState = childState | child.getMeasuredState();
                if (measureMatchParentChildren) {
                    if (lp.width == LayoutParams.MATCH_PARENT ||
                            lp.height == LayoutParams.MATCH_PARENT) {
                        mMatchParentChildren.add(child);
                    }
                }
            }
        }

        // Account for padding too
        maxWidth += getPaddingLeftWithForeground() + getPaddingRightWithForeground();
        maxHeight += getPaddingTopWithForeground() + getPaddingBottomWithForeground();

        // Check against our minimum height and width
        maxHeight = Math.max(maxHeight, mPrivateProvider.getSuggestedMinimumHeight_impl());
        maxWidth = Math.max(maxWidth, mPrivateProvider.getSuggestedMinimumWidth_impl());

        // Check against our foreground's minimum height and width
        final Drawable drawable = mInstance.getForeground();
        if (drawable != null) {
            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
        }

        mPrivateProvider.setMeasuredDimension_impl(
                mInstance.resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
                mInstance.resolveSizeAndState(maxHeight, heightMeasureSpec,
                        childState << View.MEASURED_HEIGHT_STATE_SHIFT));

        count = mMatchParentChildren.size();
        if (count > 1) {
            for (int i = 0; i < count; i++) {
                final View child = mMatchParentChildren.get(i);
                final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();

                final int childWidthMeasureSpec;
                if (lp.width == LayoutParams.MATCH_PARENT) {
                    final int width = Math.max(0, mInstance.getMeasuredWidth()
                            - getPaddingLeftWithForeground() - getPaddingRightWithForeground()
                            - lp.leftMargin - lp.rightMargin);
                    childWidthMeasureSpec = View.MeasureSpec.makeMeasureSpec(
                            width, View.MeasureSpec.EXACTLY);
                } else {
                    childWidthMeasureSpec = mInstance.getChildMeasureSpec(widthMeasureSpec,
                            getPaddingLeftWithForeground() + getPaddingRightWithForeground() +
                                    lp.leftMargin + lp.rightMargin,
                            lp.width);
                }

                final int childHeightMeasureSpec;
                if (lp.height == LayoutParams.MATCH_PARENT) {
                    final int height = Math.max(0, mInstance.getMeasuredHeight()
                            - getPaddingTopWithForeground() - getPaddingBottomWithForeground()
                            - lp.topMargin - lp.bottomMargin);
                    childHeightMeasureSpec = View.MeasureSpec.makeMeasureSpec(
                            height, View.MeasureSpec.EXACTLY);
                } else {
                    childHeightMeasureSpec = mInstance.getChildMeasureSpec(heightMeasureSpec,
                            getPaddingTopWithForeground() + getPaddingBottomWithForeground() +
                                    lp.topMargin + lp.bottomMargin,
                            lp.height);
                }

                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
        }
    }

    @Override
    public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
        final int count = mInstance.getChildCount();

        final int parentLeft = getPaddingLeftWithForeground();
        final int parentRight = right - left - getPaddingRightWithForeground();

        final int parentTop = getPaddingTopWithForeground();
        final int parentBottom = bottom - top - getPaddingBottomWithForeground();

        for (int i = 0; i < count; i++) {
            final View child = mInstance.getChildAt(i);
            if (child.getVisibility() != View.GONE) {
                final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();

                final int width = child.getMeasuredWidth();
                final int height = child.getMeasuredHeight();

                int childLeft;
                int childTop;

                childLeft = parentLeft + (parentRight - parentLeft - width) / 2 +
                        lp.leftMargin - lp.rightMargin;

                childTop = parentTop + (parentBottom - parentTop - height) / 2 +
                        lp.topMargin - lp.bottomMargin;

                child.layout(childLeft, childTop, childLeft + width, childTop + height);
            }
        }
    }

    @Override
    public boolean shouldDelayChildPressedState_impl() {
        return false;
    }

    private int getPaddingLeftWithForeground() {
        return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingLeft(), 0) :
                mInstance.getPaddingLeft() + 0;
    }

    private int getPaddingRightWithForeground() {
        return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingRight(), 0) :
                mInstance.getPaddingRight() + 0;
    }

    private int getPaddingTopWithForeground() {
        return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingTop(), 0) :
                mInstance.getPaddingTop() + 0;
    }

    private int getPaddingBottomWithForeground() {
        return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingBottom(), 0) :
                mInstance.getPaddingBottom() + 0;
    }
}
+39 −46
Original line number Diff line number Diff line
@@ -21,8 +21,10 @@ import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.PlaybackState;
import android.media.update.MediaControlView2Provider;
import android.media.update.ViewProvider;
import android.media.update.ViewGroupProvider;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
@@ -46,11 +48,10 @@ import java.util.Formatter;
import java.util.List;
import java.util.Locale;

public class MediaControlView2Impl implements MediaControlView2Provider {
public class MediaControlView2Impl extends BaseLayout implements MediaControlView2Provider {
    private static final String TAG = "MediaControlView2";

    private final MediaControlView2 mInstance;
    private final ViewProvider mSuperProvider;

    static final String ARGUMENT_KEY_FULLSCREEN = "fullScreen";

@@ -63,7 +64,7 @@ public class MediaControlView2Impl implements MediaControlView2Provider {
    private static final int REWIND_TIME_MS = 10000;
    private static final int FORWARD_TIME_MS = 30000;

    private final AccessibilityManager mAccessibilityManager;
    private AccessibilityManager mAccessibilityManager;

    private MediaController mController;
    private MediaController.TransportControls mControls;
@@ -113,10 +114,14 @@ public class MediaControlView2Impl implements MediaControlView2Provider {
    private MediaRouteButton mRouteButton;
    private MediaRouteSelector mRouteSelector;

    public MediaControlView2Impl(
            MediaControlView2 instance, ViewProvider superProvider) {
    public MediaControlView2Impl(MediaControlView2 instance,
            ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
        super(instance, superProvider, privateProvider);
        mInstance = instance;
        mSuperProvider = superProvider;
    }

    @Override
    public void initialize(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        mAccessibilityManager = AccessibilityManager.getInstance(mInstance.getContext());

        // Inflate MediaControlView2 from XML
@@ -232,39 +237,6 @@ public class MediaControlView2Impl implements MediaControlView2Provider {
        return mTimeout;
    }

    @Override
    public void onVisibilityAggregated_impl(boolean invisible) {
        int visibility = mInstance.getVisibility();
        if (mCurrentVisibility != visibility) {
            mInstance.setVisibility(visibility);
            mCurrentVisibility = visibility;

            if (visibility == View.VISIBLE) {
                setProgress();
                disableUnsupportedButtons();
                // cause the progress bar to be updated even if mShowing
                // was already true.  This happens, for example, if we're
                // paused with the progress bar showing the user hits play.
                mInstance.post(mShowProgress);
                resetFadeOutRunnable();
            } else if (visibility == View.GONE) {
                mInstance.removeCallbacks(mShowProgress);
                // Remove existing call to mFadeOut to avoid from being called later.
                mInstance.removeCallbacks(mFadeOut);
            }
        }
    }

    @Override
    public void onAttachedToWindow_impl() {
        mSuperProvider.onAttachedToWindow_impl();
    }

    @Override
    public void onDetachedFromWindow_impl() {
        mSuperProvider.onDetachedFromWindow_impl();
    }

    @Override
    public CharSequence getAccessibilityClassName_impl() {
        return MediaControlView2.class.getName();
@@ -282,13 +254,10 @@ public class MediaControlView2Impl implements MediaControlView2Provider {
        return false;
    }

    @Override
    public void onFinishInflate_impl() {
        mSuperProvider.onFinishInflate_impl();
    }

    @Override
    public void setEnabled_impl(boolean enabled) {
        super.setEnabled_impl(enabled);

        if (mPlayPauseButton != null) {
            mPlayPauseButton.setEnabled(enabled);
        }
@@ -308,7 +277,31 @@ public class MediaControlView2Impl implements MediaControlView2Provider {
            mProgress.setEnabled(enabled);
        }
        disableUnsupportedButtons();
        mSuperProvider.setEnabled_impl(enabled);
    }

    @Override
    public void onVisibilityAggregated_impl(boolean invisible) {
        super.onVisibilityAggregated_impl(invisible);

        int visibility = mInstance.getVisibility();
        if (mCurrentVisibility != visibility) {
            mInstance.setVisibility(visibility);
            mCurrentVisibility = visibility;

            if (visibility == View.VISIBLE) {
                setProgress();
                disableUnsupportedButtons();
                // cause the progress bar to be updated even if mShowing
                // was already true.  This happens, for example, if we're
                // paused with the progress bar showing the user hits play.
                mInstance.post(mShowProgress);
                resetFadeOutRunnable();
            } else if (visibility == View.GONE) {
                mInstance.removeCallbacks(mShowProgress);
                // Remove existing call to mFadeOut to avoid from being called later.
                mInstance.removeCallbacks(mFadeOut);
            }
        }
    }

    public void setRouteSelector(MediaRouteSelector selector) {
+17 −24
Original line number Diff line number Diff line
@@ -39,17 +39,16 @@ import android.media.session.MediaController.PlaybackInfo;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;
import android.media.update.VideoView2Provider;
import android.media.update.ViewProvider;
import android.media.update.ViewGroupProvider;
import android.net.Uri;
import android.os.Bundle;
import android.os.ResultReceiver;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout.LayoutParams;
import android.view.ViewGroup.LayoutParams;
import android.widget.MediaControlView2;
import android.widget.VideoView2;

@@ -67,12 +66,12 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;

public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.SurfaceListener {
public class VideoView2Impl extends BaseLayout
        implements VideoView2Provider, VideoViewInterface.SurfaceListener {
    private static final String TAG = "VideoView2";
    private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);

    private final VideoView2 mInstance;
    private final ViewProvider mSuperProvider;

    private static final int STATE_ERROR = -1;
    private static final int STATE_IDLE = 0;
@@ -82,7 +81,7 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su
    private static final int STATE_PAUSED = 4;
    private static final int STATE_PLAYBACK_COMPLETED = 5;

    private final AudioManager mAudioManager;
    private AudioManager mAudioManager;
    private AudioAttributes mAudioAttributes;
    private int mAudioFocusType = AudioManager.AUDIOFOCUS_GAIN; // legacy focus gain

@@ -127,11 +126,14 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su
    // Refer: https://docs.google.com/document/d/1nzAfns6i2hJ3RkaUre3QMT6wsDedJ5ONLiA_OOBFFX8/edit
    private float mFallbackSpeed;  // keep the original speed before 'pause' is called.

    public VideoView2Impl(VideoView2 instance, ViewProvider superProvider,
            @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    public VideoView2Impl(VideoView2 instance,
            ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
        super(instance, superProvider, privateProvider);
        mInstance = instance;
        mSuperProvider = superProvider;
    }

    @Override
    public void initialize(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mSpeed = 1.0f;
@@ -150,7 +152,6 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su
        mSurfaceView = new VideoSurfaceView(mInstance.getContext());
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT);
        params.gravity = Gravity.CENTER;
        mTextureView.setLayoutParams(params);
        mSurfaceView.setLayoutParams(params);
        mTextureView.setSurfaceListener(this);
@@ -397,7 +398,7 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su

    @Override
    public void onAttachedToWindow_impl() {
        mSuperProvider.onAttachedToWindow_impl();
        super.onAttachedToWindow_impl();

        // Create MediaSession
        mMediaSession = new MediaSession(mInstance.getContext(), "VideoView2MediaSession");
@@ -412,8 +413,8 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su

    @Override
    public void onDetachedFromWindow_impl() {
        Log.e(TAG, ".... Debugging. onDetachedFromWindow_impl()");
        mSuperProvider.onDetachedFromWindow_impl();
        super.onDetachedFromWindow_impl();

        mMediaSession.release();
        mMediaSession = null;
        mMediaController = null;
@@ -434,7 +435,8 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su
                && isInPlaybackState() && mMediaControlView != null) {
            toggleMediaControlViewVisibility();
        }
        return mSuperProvider.onTouchEvent_impl(ev);

        return super.onTouchEvent_impl(ev);
    }

    @Override
@@ -443,17 +445,8 @@ public class VideoView2Impl implements VideoView2Provider, VideoViewInterface.Su
                && isInPlaybackState() && mMediaControlView != null) {
            toggleMediaControlViewVisibility();
        }
        return mSuperProvider.onTrackballEvent_impl(ev);
    }

    @Override
    public void onFinishInflate_impl() {
        mSuperProvider.onFinishInflate_impl();
    }

    @Override
    public void setEnabled_impl(boolean enabled) {
        mSuperProvider.setEnabled_impl(enabled);
        return super.onTrackballEvent_impl(ev);
    }

    ///////////////////////////////////////////////////
+129 −0
Original line number Diff line number Diff line
/*
 * Copyright 2018 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.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.widget;

import android.media.update.ViewGroupProvider;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

public abstract class ViewGroupImpl implements ViewGroupProvider {
    private final ViewGroupProvider mSuperProvider;

    public ViewGroupImpl(ViewGroup instance,
            ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
        mSuperProvider = superProvider;
    }

    @Override
    public void onAttachedToWindow_impl() {
        mSuperProvider.onAttachedToWindow_impl();
    }

    @Override
    public void onDetachedFromWindow_impl() {
        mSuperProvider.onDetachedFromWindow_impl();
    }

    @Override
    public CharSequence getAccessibilityClassName_impl() {
        return mSuperProvider.getAccessibilityClassName_impl();
    }

    @Override
    public boolean onTouchEvent_impl(MotionEvent ev) {
        return mSuperProvider.onTouchEvent_impl(ev);
    }

    @Override
    public boolean onTrackballEvent_impl(MotionEvent ev) {
        return mSuperProvider.onTrackballEvent_impl(ev);
    }

    @Override
    public void onFinishInflate_impl() {
        mSuperProvider.onFinishInflate_impl();
    }

    @Override
    public void setEnabled_impl(boolean enabled) {
        mSuperProvider.setEnabled_impl(enabled);
    }

    @Override
    public void onVisibilityAggregated_impl(boolean isVisible) {
        mSuperProvider.onVisibilityAggregated_impl(isVisible);
    }

    @Override
    public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
        mSuperProvider.onLayout_impl(changed, left, top, right, bottom);
    }

    @Override
    public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
        mSuperProvider.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    public int getSuggestedMinimumWidth_impl() {
        return mSuperProvider.getSuggestedMinimumWidth_impl();
    }

    @Override
    public int getSuggestedMinimumHeight_impl() {
        return mSuperProvider.getSuggestedMinimumHeight_impl();
    }

    @Override
    public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) {
        mSuperProvider.setMeasuredDimension_impl(measuredWidth, measuredHeight);
    }

    @Override
    public boolean checkLayoutParams_impl(ViewGroup.LayoutParams p) {
        return mSuperProvider.checkLayoutParams_impl(p);
    }

    @Override
    public ViewGroup.LayoutParams generateDefaultLayoutParams_impl() {
        return mSuperProvider.generateDefaultLayoutParams_impl();
    }

    @Override
    public ViewGroup.LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
        return mSuperProvider.generateLayoutParams_impl(attrs);
    }

    @Override
    public ViewGroup.LayoutParams generateLayoutParams_impl(ViewGroup.LayoutParams lp) {
        return mSuperProvider.generateLayoutParams_impl(lp);
    }

    @Override
    public boolean shouldDelayChildPressedState_impl() {
        return mSuperProvider.shouldDelayChildPressedState_impl();
    }

    @Override
    public void measureChildWithMargins_impl(View child,
        int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {
        mSuperProvider.measureChildWithMargins_impl(child,
                parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
    }
}