diff --git a/android/src/com/mapswithme/maps/widget/placepage/BannerController.java b/android/src/com/mapswithme/maps/widget/placepage/BannerController.java index 8452ab0610..f7040e596b 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/BannerController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/BannerController.java @@ -6,7 +6,6 @@ import android.content.Context; import android.content.res.Resources; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.transition.TransitionManager; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.view.LayoutInflater; @@ -61,7 +60,6 @@ final class BannerController LayoutInflater li = LayoutInflater.from(context); View bannerView = li.inflate(type.getLayoutId(), containerView, false); containerView.removeAllViews(); - TransitionManager.beginDelayedTransition(containerView); containerView.addView(bannerView); return bannerView; } @@ -197,30 +195,26 @@ final class BannerController private void updateVisibility() { if (mBanners == null) - return; + throw new AssertionError("Banners must be non-null at this point!"); - UiUtils.showIf(!hasErrorOccurred() && mCurrentAd != null, mContainerView); - if ((mAdsLoader.isAdLoading() || hasErrorOccurred()) - && mCurrentAd == null) - { - UiUtils.hide(mIcon, mTitle, mMessage, mActionSmall, mActionContainer, mActionLarge, mAdChoices, - mAdChoicesLabel, mAdsRemovalIcon, mAdsRemovalButton); - } - else if (mCurrentAd != null) - { - UiUtils.showIf(mCurrentAd.getType().showAdChoiceIcon(), mAdChoices); - PurchaseController purchaseController - = mAdsRemovalProvider.getAdsRemovalPurchaseController(); - boolean showRemovalButtons = purchaseController != null - && purchaseController.isPurchaseSupported(); - UiUtils.showIf(showRemovalButtons, mAdsRemovalIcon, mAdsRemovalButton); - UiUtils.show(mIcon, mTitle, mMessage, mActionSmall, mActionContainer, mActionLarge, - mAdsRemovalButton, mAdChoicesLabel); - if (mOpened) - UiUtils.hide(mActionSmall); - else - UiUtils.hide(mActionContainer, mActionLarge, mAdsRemovalButton, mIcon); - } + UiUtils.hideIf(hasErrorOccurred() || mCurrentAd == null, mContainerView); + + if (mCurrentAd == null) + throw new AssertionError("Banners must be non-null at this point!"); + + UiUtils.showIf(mCurrentAd.getType().showAdChoiceIcon(), mAdChoices); + PurchaseController purchaseController + = mAdsRemovalProvider.getAdsRemovalPurchaseController(); + boolean showRemovalButtons = purchaseController != null + && purchaseController.isPurchaseSupported(); + UiUtils.showIf(showRemovalButtons, mAdsRemovalIcon, mAdsRemovalButton); + UiUtils.show(mIcon, mTitle, mMessage, mActionSmall, mActionContainer, mActionLarge, + mAdsRemovalButton, mAdChoicesLabel); + if (mOpened) + UiUtils.hide(mActionSmall); + else + UiUtils.hide(mActionContainer, mActionLarge, mAdsRemovalButton, mIcon); + UiUtils.show(mBannerView); } void updateData(@Nullable List banners) @@ -231,16 +225,15 @@ final class BannerController unregisterCurrentAd(); } - UiUtils.hide(mContainerView); setErrorStatus(false); mBanners = banners != null ? Collections.unmodifiableList(banners) : null; + UiUtils.showIf(mBanners != null, mContainerView); if (mBanners == null) return; - UiUtils.show(mContainerView); + UiUtils.hide(mBannerView); mAdsLoader.loadAd(mContainerView.getContext(), mBanners); - updateVisibility(); } private void unregisterCurrentAd() @@ -398,7 +391,7 @@ final class BannerController @Override public void onAdLoaded(@NonNull MwmNativeAd ad) { - LOGGER.d("XXX", "onAdLoaded, ad = " + ad); + LOGGER.d(TAG, "onAdLoaded, ad = " + ad); if (mBanners == null) return; @@ -413,14 +406,12 @@ final class BannerController mLastAdType = mCurrentAd.getType(); + fillViews(ad); + loadIconAndOpenIfNeeded(ad); updateVisibility(); - fillViews(ad); - ad.registerView(mBannerView); - loadIconAndOpenIfNeeded(ad); - if (mAdTracker != null) { onChangedVisibility(isBannerContainerVisible()); @@ -436,7 +427,7 @@ final class BannerController boolean isNotCached = mCurrentAd == null; setErrorStatus(isNotCached); - updateVisibility(); + UiUtils.hide(mContainerView); Statistics.INSTANCE.trackPPBannerError(bannerId, provider, error, mOpened ? 1 : 0); } diff --git a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java index e37508faec..15bcd11a51 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java @@ -1,11 +1,14 @@ package com.mapswithme.maps.widget.placepage; +import android.animation.Animator; +import android.animation.ObjectAnimator; import android.app.Activity; import android.graphics.Rect; import android.location.Location; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -31,6 +34,7 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC); private static final String TAG = BottomSheetPlacePageController.class.getSimpleName(); private static final String EXTRA_MAP_OBJECT = "extra_map_object"; + private static final int PEEK_HEIGHT_ANIM_DURATION = 300; @NonNull private final Activity mActivity; @SuppressWarnings("NullableProblems") @@ -87,6 +91,8 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca } }; + private boolean mPeekHeightAnimating; + public BottomSheetPlacePageController(@NonNull Activity activity, @NonNull AdsRemovalPurchaseControllerProvider provider) { @@ -164,21 +170,62 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca private void setPeekHeight() { - int peekHeight = getPeekHeight(); - if (peekHeight == mPlacePageBehavior.getPeekHeight()) - return; - - if (mPlacePageBehavior.getState() == AnchorBottomSheetBehavior.STATE_SETTLING || - mPlacePageBehavior.getState() == AnchorBottomSheetBehavior.STATE_DRAGGING) + if (mPeekHeightAnimating) { - LOGGER.d(TAG, "Set new peek height ignored, sheet state inappropriate"); + Log.d(TAG, "Peek animation in progress, ignore."); + return; + } + + final int peekHeight = getPeekHeight(); + if (peekHeight == mPlacePageBehavior.getPeekHeight()) + return; + + @AnchorBottomSheetBehavior.State + int currentState = mPlacePageBehavior.getState(); + if (isSettlingState(currentState) || isDraggingState(currentState)) + { + LOGGER.d(TAG, "Sheet state inappropriate, ignore."); + return; + } + + if (isCollapsedState(currentState) && mPlacePageBehavior.getPeekHeight() > 0) + { + setPeekHeightAnimatedly(peekHeight); return; } - LOGGER.d(TAG, "Set new peek height = " + peekHeight); mPlacePageBehavior.setPeekHeight(peekHeight); } + private void setPeekHeightAnimatedly(int peekHeight) + { + int delta = peekHeight - mPlacePageBehavior.getPeekHeight(); + ObjectAnimator animator = ObjectAnimator.ofFloat(mPlacePage, "translationY", -delta); + animator.setDuration(PEEK_HEIGHT_ANIM_DURATION); + animator.addListener(new UiUtils.SimpleAnimatorListener() + { + @Override + public void onAnimationStart(Animator animation) + { + mPeekHeightAnimating = true; + mPlacePage.setScrollable(false); + mPlacePageBehavior.setAllowUserDragging(false); + } + + @Override + public void onAnimationEnd(Animator animation) + { + mPlacePage.setTranslationY(0); + mPeekHeightAnimating = false; + mPlacePage.setScrollable(true); + mPlacePageBehavior.setAllowUserDragging(true); + mPlacePageBehavior.setPeekHeight(peekHeight); + } + }); + + animator.start(); + } + private void setPlacePageAnchor() { View parent = (View) mPlacePage.getParent(); @@ -354,4 +401,19 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca { // No op. } + + private static boolean isSettlingState(@AnchorBottomSheetBehavior.State int state) + { + return state == AnchorBottomSheetBehavior.STATE_SETTLING; + } + + private static boolean isDraggingState(@AnchorBottomSheetBehavior.State int state) + { + return state == AnchorBottomSheetBehavior.STATE_DRAGGING; + } + + private static boolean isCollapsedState(@AnchorBottomSheetBehavior.State int state) + { + return state == AnchorBottomSheetBehavior.STATE_COLLAPSED; + } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index aa42d617f9..ba600c4bfe 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -25,9 +25,11 @@ import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.text.util.Linkify; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; @@ -303,6 +305,33 @@ public class PlacePageView extends NestedScrollView } }; + private boolean mScrollable = true; + + void setScrollable(boolean scrollable) + { + mScrollable = scrollable; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) + { + switch (ev.getAction()) + { + case MotionEvent.ACTION_DOWN: + Log.d("XXX", "onTouchEvent mScrollable = " + mScrollable); + return mScrollable && super.onTouchEvent(ev); + default: + return super.onTouchEvent(ev); + } + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) + { + Log.d("XXX", "onInterceptTouchEvent mScrollable = " + mScrollable); + return mScrollable && super.onInterceptTouchEvent(event); + } + public enum State { HIDDEN,