Loading packages/MediaComponents/src/com/android/media/update/ApiFactory.java +7 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading packages/MediaComponents/src/com/android/widget/BaseLayout.java 0 → 100644 +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; } } packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java +39 −46 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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"; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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); } Loading @@ -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) { Loading packages/MediaComponents/src/com/android/widget/VideoView2Impl.java +17 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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); Loading Loading @@ -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"); Loading @@ -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; Loading @@ -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 Loading @@ -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); } /////////////////////////////////////////////////// Loading packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java 0 → 100644 +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); } } Loading
packages/MediaComponents/src/com/android/media/update/ApiFactory.java +7 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
packages/MediaComponents/src/com/android/widget/BaseLayout.java 0 → 100644 +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; } }
packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java +39 −46 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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"; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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); } Loading @@ -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) { Loading
packages/MediaComponents/src/com/android/widget/VideoView2Impl.java +17 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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); Loading Loading @@ -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"); Loading @@ -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; Loading @@ -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 Loading @@ -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); } /////////////////////////////////////////////////// Loading
packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java 0 → 100644 +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); } }