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);
+ }
+}