diff options
author | Yorke Lee <yorkelee@google.com> | 2015-03-23 15:44:27 -0700 |
---|---|---|
committer | Yorke Lee <yorkelee@google.com> | 2015-03-23 15:47:10 -0700 |
commit | 83b8696f0300f65ef6383982ab22592b47ef821f (patch) | |
tree | 9b9dcf7188fa2504e523974857f04c8ae0897e95 | |
parent | ecafeee463929da27bbfc8bd72217653b3299c38 (diff) |
Fix for misaligned video view surface
* Stash the true height of mPrimaryCallCardContainer in a view tag
so that its height is not misreported during the outgoing call animation
* Move the onGlobalLayoutListener so that the callbacks occur after
the surfaces have been inflated, to ensure the views are non-null.
Bug: 19773495
Change-Id: Ib762285c595ec826c6da15296db66d830d9fe24e
-rw-r--r-- | InCallUI/res/values/ids.xml | 1 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/CallCardFragment.java | 17 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/VideoCallFragment.java | 44 |
3 files changed, 37 insertions, 25 deletions
diff --git a/InCallUI/res/values/ids.xml b/InCallUI/res/values/ids.xml index c6ad2099c..accb8fb73 100644 --- a/InCallUI/res/values/ids.xml +++ b/InCallUI/res/values/ids.xml @@ -16,4 +16,5 @@ <resources> <item type="id" name="fadeState" /> + <item type="id" name="view_tag_callcard_actual_height" /> </resources> diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java index e63e7a6a4..7dd36ff41 100644 --- a/InCallUI/src/com/android/incallui/CallCardFragment.java +++ b/InCallUI/src/com/android/incallui/CallCardFragment.java @@ -57,7 +57,6 @@ import java.util.List; */ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPresenter.CallCardUi> implements CallCardPresenter.CallCardUi { - private AnimatorSet mAnimatorSet; private int mShrinkAnimationDuration; private int mFabNormalDiameter; @@ -360,7 +359,17 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr if (mIsLandscape) { return getView().getWidth() - mPrimaryCallCardContainer.getWidth(); } else { - return getView().getHeight() - mPrimaryCallCardContainer.getHeight(); + final int callCardHeight; + // Retrieve the actual height of the call card, independent of whether or not the + // outgoing call animation is in progress. The animation does not run in landscape mode + // so this only needs to be done for portrait. + if (mPrimaryCallCardContainer.getTag(R.id.view_tag_callcard_actual_height) != null) { + callCardHeight = (int) mPrimaryCallCardContainer.getTag( + R.id.view_tag_callcard_actual_height); + } else { + callCardHeight = mPrimaryCallCardContainer.getHeight(); + } + return getView().getHeight() - callCardHeight; } } @@ -856,6 +865,8 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr // Prepare the state of views before the slide animation final int originalHeight = mPrimaryCallCardContainer.getHeight(); + mPrimaryCallCardContainer.setTag(R.id.view_tag_callcard_actual_height, + originalHeight); mPrimaryCallCardContainer.setBottom(parent.getHeight()); // Set up FAB. @@ -873,6 +884,8 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { + mPrimaryCallCardContainer.setTag(R.id.view_tag_callcard_actual_height, + null); setViewStatePostAnimation(listener); } }); diff --git a/InCallUI/src/com/android/incallui/VideoCallFragment.java b/InCallUI/src/com/android/incallui/VideoCallFragment.java index 6e4abfc26..2b0ddd534 100644 --- a/InCallUI/src/com/android/incallui/VideoCallFragment.java +++ b/InCallUI/src/com/android/incallui/VideoCallFragment.java @@ -347,28 +347,6 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter, final View view = inflater.inflate(R.layout.video_call_fragment, container, false); - // Attempt to center the incoming video view, if it is in the layout. - final ViewTreeObserver observer = view.getViewTreeObserver(); - observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - // Check if the layout includes the incoming video surface -- this will only be the - // case for a video call. - View displayVideo = view.findViewById(R.id.incomingVideo); - if (displayVideo != null) { - centerDisplayView(displayVideo); - } - - mIsLayoutComplete = true; - - // Remove the listener so we don't continually re-layout. - ViewTreeObserver observer = view.getViewTreeObserver(); - if (observer.isAlive()) { - observer.removeOnGlobalLayoutListener(this); - } - } - }); - return view; } @@ -387,7 +365,6 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter, // In a right-to-left locale, the space for the video view is to the left of the call card // so we need to translate it in the -X direction. final boolean isLayoutRtl = InCallPresenter.isRtl(); - float spaceBesideCallCard = InCallPresenter.getInstance().getSpaceBesideCallCard(); if (mIsLandscape) { float videoViewTranslation = displayVideo.getWidth() / 2 @@ -576,6 +553,27 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter, sPreviewSurface.recreateView((TextureView) mVideoViews.findViewById( R.id.previewVideo)); } + + // Attempt to center the incoming video view, if it is in the layout. + final ViewTreeObserver observer = mVideoViews.getViewTreeObserver(); + observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + // Check if the layout includes the incoming video surface -- this will only be the + // case for a video call. + View displayVideo = mVideoViews.findViewById(R.id.incomingVideo); + if (displayVideo != null) { + centerDisplayView(displayVideo); + } + mIsLayoutComplete = true; + + // Remove the listener so we don't continually re-layout. + ViewTreeObserver observer = mVideoViews.getViewTreeObserver(); + if (observer.isAlive()) { + observer.removeOnGlobalLayoutListener(this); + } + } + }); } } |