diff --git a/android/res/anim/dog_btn_rotation.xml b/android/res/anim/dog_btn_rotation.xml new file mode 100644 index 0000000000..40fbed6bb2 --- /dev/null +++ b/android/res/anim/dog_btn_rotation.xml @@ -0,0 +1,10 @@ + + diff --git a/android/res/drawable-hdpi/ic_dog.png b/android/res/drawable-hdpi/ic_dog.png new file mode 100755 index 0000000000..0c51dcc078 Binary files /dev/null and b/android/res/drawable-hdpi/ic_dog.png differ diff --git a/android/res/drawable-hdpi/ic_dog_bg.png b/android/res/drawable-hdpi/ic_dog_bg.png new file mode 100755 index 0000000000..19114bee91 Binary files /dev/null and b/android/res/drawable-hdpi/ic_dog_bg.png differ diff --git a/android/res/drawable-mdpi/ic_dog.png b/android/res/drawable-mdpi/ic_dog.png new file mode 100755 index 0000000000..0bcf716b92 Binary files /dev/null and b/android/res/drawable-mdpi/ic_dog.png differ diff --git a/android/res/drawable-mdpi/ic_dog_bg.png b/android/res/drawable-mdpi/ic_dog_bg.png new file mode 100755 index 0000000000..61736ceff3 Binary files /dev/null and b/android/res/drawable-mdpi/ic_dog_bg.png differ diff --git a/android/res/drawable-xhdpi/ic_dog.png b/android/res/drawable-xhdpi/ic_dog.png new file mode 100755 index 0000000000..b372007b01 Binary files /dev/null and b/android/res/drawable-xhdpi/ic_dog.png differ diff --git a/android/res/drawable-xhdpi/ic_dog_bg.png b/android/res/drawable-xhdpi/ic_dog_bg.png new file mode 100755 index 0000000000..24c42be116 Binary files /dev/null and b/android/res/drawable-xhdpi/ic_dog_bg.png differ diff --git a/android/res/drawable-xxhdpi/ic_dog.png b/android/res/drawable-xxhdpi/ic_dog.png new file mode 100755 index 0000000000..2b63819ed2 Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_dog.png differ diff --git a/android/res/drawable-xxhdpi/ic_dog_bg.png b/android/res/drawable-xxhdpi/ic_dog_bg.png new file mode 100755 index 0000000000..f0f0525053 Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_dog_bg.png differ diff --git a/android/res/drawable-xxxhdpi/ic_dog.png b/android/res/drawable-xxxhdpi/ic_dog.png new file mode 100755 index 0000000000..0ad3ca344d Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_dog.png differ diff --git a/android/res/drawable-xxxhdpi/ic_dog_bg.png b/android/res/drawable-xxxhdpi/ic_dog_bg.png new file mode 100755 index 0000000000..9cca9415d5 Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_dog_bg.png differ diff --git a/android/res/layout-land/map_navigation_buttons.xml b/android/res/layout-land/map_navigation_buttons.xml index d327168fc9..4f956a381c 100644 --- a/android/res/layout-land/map_navigation_buttons.xml +++ b/android/res/layout-land/map_navigation_buttons.xml @@ -53,13 +53,26 @@ android:contentDescription="@string/core_my_position" android:tint="@null"/> - + android:layout_alignParentStart="true" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + + + + diff --git a/android/res/layout/map_navigation_buttons.xml b/android/res/layout/map_navigation_buttons.xml index 3e64563fbc..78e28128a4 100644 --- a/android/res/layout/map_navigation_buttons.xml +++ b/android/res/layout/map_navigation_buttons.xml @@ -53,13 +53,26 @@ android:layout_alignParentRight="true" android:layout_alignParentEnd="true"/> - + android:layout_alignParentStart="true" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + + + + diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 7ab8fa156f..32795c6d47 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -74,12 +74,13 @@ import com.mapswithme.maps.maplayer.traffic.widget.TrafficButton; import com.mapswithme.maps.metrics.UserActionsLogger; import com.mapswithme.maps.onboarding.IntroductionDialogFragment; import com.mapswithme.maps.onboarding.IntroductionScreenFactory; +import com.mapswithme.maps.onboarding.OnboardingScreen; +import com.mapswithme.maps.onboarding.OnboardingTip; import com.mapswithme.maps.promo.Promo; import com.mapswithme.maps.promo.PromoAfterBooking; import com.mapswithme.maps.promo.PromoBookingDialogFragment; import com.mapswithme.maps.purchase.AdsRemovalActivationCallback; import com.mapswithme.maps.purchase.AdsRemovalPurchaseControllerProvider; -import com.mapswithme.maps.purchase.BookmarkSubscriptionActivity; import com.mapswithme.maps.purchase.FailedPurchaseChecker; import com.mapswithme.maps.purchase.PurchaseCallback; import com.mapswithme.maps.purchase.PurchaseController; @@ -140,6 +141,7 @@ import com.mapswithme.util.statistics.Statistics; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; import java.util.List; +import java.util.Objects; import java.util.Stack; public class MwmActivity extends BaseMwmFragmentActivity @@ -721,37 +723,36 @@ public class MwmActivity extends BaseMwmFragmentActivity mNavMyPosition = new MyPositionButton(myPosition, mOnMyPositionClickListener); initToggleMapLayerController(frame); - View openSubsScreenBtn = frame.findViewById(R.id.subs_screen_btn); - boolean hasCrownView = Framework.nativeNeedToShowCrown(); + View openSubsScreenBtnContainer = frame.findViewById(R.id.subs_screen_btn_container); + boolean hasCrownView = OnboardingTip.get() != null; mNavAnimationController = new NavigationButtonsAnimationController( zoomIn, zoomOut, myPosition, getWindow().getDecorView().getRootView(), this, - hasCrownView ? openSubsScreenBtn : null); + hasCrownView ? openSubsScreenBtnContainer : null); - UiUtils.showIf(hasCrownView, openSubsScreenBtn); + UiUtils.showIf(hasCrownView, openSubsScreenBtnContainer); if (hasCrownView) { - openSubsScreenBtn.setOnClickListener(v -> onCrownClicked()); + openSubsScreenBtnContainer.findViewById(R.id.subs_screen_btn) + .setOnClickListener(v -> onBoardingBtnClicked()); Statistics.ParameterBuilder builder = Statistics.makeGuidesSubscriptionBuilder(); Statistics.INSTANCE.trackEvent(Statistics.EventName.MAP_SPONSORED_BUTTON_SHOW, builder); } } - private void onCrownClicked() + private void onBoardingBtnClicked() { - openBookmarkSubscriptionScreen(); + OnboardingTip tip = Objects.requireNonNull(OnboardingTip.get()); + + OnboardingScreen screen = OnboardingScreen.values()[tip.getType()]; + screen.getOnboardingActivityLauncher().launchScreen(this, tip.getUrl()); UserActionsLogger.logCrownClicked(); Statistics.ParameterBuilder builder = Statistics.makeGuidesSubscriptionBuilder(); Statistics.INSTANCE.trackEvent(Statistics.EventName.MAP_SPONSORED_BUTTON_CLICK, builder); if (mNavAnimationController == null) return; - mNavAnimationController.hideCrownView(); - } - - private void openBookmarkSubscriptionScreen() - { - BookmarkSubscriptionActivity.startForResult(this); + mNavAnimationController.hideOnBoardingTipBtn(); } private void initToggleMapLayerController(@NonNull View frame) diff --git a/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java b/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java index 6c300ac307..faaebf1993 100644 --- a/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java +++ b/android/src/com/mapswithme/maps/NavigationButtonsAnimationController.java @@ -4,6 +4,8 @@ import android.content.res.Resources; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.location.LocationState; @@ -20,7 +22,7 @@ class NavigationButtonsAnimationController @NonNull private final View mMyPosition; @Nullable - private View mCrownView; + private View mObBoardingTipBtnContainer; @Nullable private final OnTranslationChangedListener mTranslationListener; @@ -37,11 +39,11 @@ class NavigationButtonsAnimationController NavigationButtonsAnimationController(@NonNull View zoomIn, @NonNull View zoomOut, @NonNull View myPosition, @NonNull final View contentView, @Nullable OnTranslationChangedListener translationListener, - @Nullable View crownView) + @Nullable View onBoardingTipBtnContainer) { - mZoomIn = zoomIn; mZoomOut = zoomOut; - mCrownView = crownView; + mZoomIn = zoomIn; + mObBoardingTipBtnContainer = onBoardingTipBtnContainer; checkZoomButtonsVisibility(); mMyPosition = myPosition; Resources res = mZoomIn.getResources(); @@ -49,17 +51,14 @@ class NavigationButtonsAnimationController mBottomLimit = res.getDimension(R.dimen.menu_line_height); mCompassHeight = res.getDimension(R.dimen.compass_height); calculateLimitTranslations(); - contentView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() - { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, - int oldTop, int oldRight, int oldBottom) - { - mContentHeight = bottom - top; - contentView.removeOnLayoutChangeListener(this); - } - }); + contentView.addOnLayoutChangeListener(new ContentViewLayoutChangeListener(contentView)); mTranslationListener = translationListener; + if (onBoardingTipBtnContainer != null) + { + Animation animation = AnimationUtils.loadAnimation(onBoardingTipBtnContainer.getContext(), + R.anim.dog_btn_rotation); + onBoardingTipBtnContainer.findViewById(R.id.subs_screen_btn).setAnimation(animation); + } } private void checkZoomButtonsVisibility() @@ -114,15 +113,15 @@ class NavigationButtonsAnimationController mMyPosition.setTranslationY(translation); mZoomOut.setTranslationY(translation); mZoomIn.setTranslationY(translation); - if (mCrownView != null) - mCrownView.setTranslationY(translation); + if (mObBoardingTipBtnContainer != null) + mObBoardingTipBtnContainer.setTranslationY(translation); if (mZoomIn.getVisibility() == View.VISIBLE && !isViewInsideLimits(mZoomIn)) { UiUtils.invisible(mZoomIn, mZoomOut); - if (mCrownView != null) - UiUtils.invisible(mCrownView); + if (mObBoardingTipBtnContainer != null) + UiUtils.invisible(mObBoardingTipBtnContainer); if (mTranslationListener != null) mTranslationListener.onFadeOutZoomButtons(); @@ -131,8 +130,8 @@ class NavigationButtonsAnimationController && isViewInsideLimits(mZoomIn)) { UiUtils.show(mZoomIn, mZoomOut); - if (mCrownView != null) - UiUtils.show(mCrownView); + if (mObBoardingTipBtnContainer != null) + UiUtils.show(mObBoardingTipBtnContainer); if (mTranslationListener != null) mTranslationListener.onFadeInZoomButtons(); } @@ -169,19 +168,19 @@ class NavigationButtonsAnimationController return; UiUtils.hide(mZoomIn, mZoomOut); - if (mCrownView == null) + if (mObBoardingTipBtnContainer == null) return; - UiUtils.hide(mCrownView); + UiUtils.hide(mObBoardingTipBtnContainer); } - void hideCrownView() + void hideOnBoardingTipBtn() { - if (mCrownView == null) + if (mObBoardingTipBtnContainer == null) return; - mCrownView.setVisibility(View.GONE); - mCrownView = null; + mObBoardingTipBtnContainer.setVisibility(View.GONE); + mObBoardingTipBtnContainer = null; } void appearZoomButtons() @@ -191,10 +190,10 @@ class NavigationButtonsAnimationController UiUtils.show(mZoomIn, mZoomOut); - if (mCrownView == null) + if (mObBoardingTipBtnContainer == null) return; - UiUtils.show(mCrownView); + UiUtils.show(mObBoardingTipBtnContainer); } private static boolean showZoomButtons() @@ -221,4 +220,23 @@ class NavigationButtonsAnimationController void onFadeOutZoomButtons(); } + + private class ContentViewLayoutChangeListener implements View.OnLayoutChangeListener + { + @NonNull + private final View mContentView; + + public ContentViewLayoutChangeListener(@NonNull View contentView) + { + mContentView = contentView; + } + + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) + { + mContentHeight = bottom - top; + mContentView.removeOnLayoutChangeListener(this); + } + } } diff --git a/android/src/com/mapswithme/maps/onboarding/BuySubscriptionScreenLauncher.java b/android/src/com/mapswithme/maps/onboarding/BuySubscriptionScreenLauncher.java new file mode 100644 index 0000000000..fb97515749 --- /dev/null +++ b/android/src/com/mapswithme/maps/onboarding/BuySubscriptionScreenLauncher.java @@ -0,0 +1,16 @@ +package com.mapswithme.maps.onboarding; + +import android.content.Intent; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import com.mapswithme.maps.purchase.BookmarksAllSubscriptionActivity; + +public class BuySubscriptionScreenLauncher implements OnboardingScreenLauncher +{ + @Override + public void launchScreen(@NonNull FragmentActivity activity, @NonNull String url) + { + activity.startActivity(new Intent(activity, BookmarksAllSubscriptionActivity.class)); + } +} diff --git a/android/src/com/mapswithme/maps/onboarding/OnboardingScreen.java b/android/src/com/mapswithme/maps/onboarding/OnboardingScreen.java new file mode 100644 index 0000000000..04753286a0 --- /dev/null +++ b/android/src/com/mapswithme/maps/onboarding/OnboardingScreen.java @@ -0,0 +1,24 @@ +package com.mapswithme.maps.onboarding; + +import androidx.annotation.NonNull; + +public enum OnboardingScreen +{ + DISCOVER_CATALOG(new OpenCatalogLauncher()), + DOWNLOAD_SAMPLES(new OpenCatalogLauncher()), + BUY_SUBSCRIPTION(new BuySubscriptionScreenLauncher()); + + @NonNull + private final OnboardingScreenLauncher mLauncher; + + OnboardingScreen(@NonNull OnboardingScreenLauncher launcher) + { + mLauncher = launcher; + } + + @NonNull + public OnboardingScreenLauncher getOnboardingActivityLauncher() + { + return mLauncher; + } +} diff --git a/android/src/com/mapswithme/maps/onboarding/OnboardingScreenLauncher.java b/android/src/com/mapswithme/maps/onboarding/OnboardingScreenLauncher.java new file mode 100644 index 0000000000..17f888467a --- /dev/null +++ b/android/src/com/mapswithme/maps/onboarding/OnboardingScreenLauncher.java @@ -0,0 +1,9 @@ +package com.mapswithme.maps.onboarding; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; + +public interface OnboardingScreenLauncher +{ + void launchScreen(@NonNull FragmentActivity activity, @NonNull String url); +} diff --git a/android/src/com/mapswithme/maps/onboarding/OpenCatalogLauncher.java b/android/src/com/mapswithme/maps/onboarding/OpenCatalogLauncher.java new file mode 100644 index 0000000000..c6ba1276e4 --- /dev/null +++ b/android/src/com/mapswithme/maps/onboarding/OpenCatalogLauncher.java @@ -0,0 +1,14 @@ +package com.mapswithme.maps.onboarding; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import com.mapswithme.maps.bookmarks.BookmarksCatalogActivity; + +public class OpenCatalogLauncher implements OnboardingScreenLauncher +{ + @Override + public void launchScreen(@NonNull FragmentActivity activity, @NonNull String url) + { + BookmarksCatalogActivity.start(activity, url); + } +}