[android] Immersive tips and tricks view

This commit is contained in:
Dmitry Donskoy 2018-09-13 17:57:56 +03:00 committed by Aleksandr Zatsepin
parent a94f7c7811
commit 08a680e75e
3 changed files with 109 additions and 11 deletions

View file

@ -67,17 +67,16 @@ import com.mapswithme.maps.location.CompassData;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.maplayer.MapLayerCompositeController;
import com.mapswithme.maps.maplayer.Mode;
import com.mapswithme.maps.metrics.UserActionsLogger;
import com.mapswithme.maps.tips.TipsApi;
import com.mapswithme.maps.maplayer.subway.OnSubwayLayerToggleListener;
import com.mapswithme.maps.maplayer.subway.SubwayManager;
import com.mapswithme.maps.maplayer.traffic.OnTrafficLayerToggleListener;
import com.mapswithme.maps.maplayer.traffic.TrafficManager;
import com.mapswithme.maps.maplayer.traffic.widget.TrafficButton;
import com.mapswithme.maps.metrics.UserActionsLogger;
import com.mapswithme.maps.purchase.AdsRemovalPurchaseCallback;
import com.mapswithme.maps.purchase.PurchaseFactory;
import com.mapswithme.maps.purchase.PurchaseController;
import com.mapswithme.maps.purchase.AdsRemovalPurchaseControllerProvider;
import com.mapswithme.maps.purchase.PurchaseController;
import com.mapswithme.maps.purchase.PurchaseFactory;
import com.mapswithme.maps.routing.NavigationController;
import com.mapswithme.maps.routing.RoutePointInfo;
import com.mapswithme.maps.routing.RoutingBottomMenuListener;
@ -100,6 +99,7 @@ import com.mapswithme.maps.settings.UnitLocale;
import com.mapswithme.maps.sound.TtsPlayer;
import com.mapswithme.maps.taxi.TaxiInfo;
import com.mapswithme.maps.taxi.TaxiManager;
import com.mapswithme.maps.tips.TipsApi;
import com.mapswithme.maps.widget.FadeView;
import com.mapswithme.maps.widget.menu.BaseMenu;
import com.mapswithme.maps.widget.menu.MainMenu;
@ -125,6 +125,7 @@ import com.mapswithme.util.sharing.SharingHelper;
import com.mapswithme.util.statistics.AlohaHelper;
import com.mapswithme.util.statistics.PlacePageTracker;
import com.mapswithme.util.statistics.Statistics;
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
import java.io.Serializable;
import java.util.Locale;
@ -240,6 +241,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
PurchaseFactory.createPurchaseController();
@NonNull
private final OnClickListener mOnMyPositionClickListener = new CurrentPositionClickListener();
private MaterialTapTargetPrompt mTutorial;
public interface LeftAnimationTrackListener
{
@ -595,16 +597,19 @@ public class MwmActivity extends BaseMwmFragmentActivity
initOnmapDownloader();
initPositionChooser();
initFilterViews();
initTips();
}
private void initTips()
{
if (mTutorial != null)
return;
TipsApi api = TipsApi.requestCurrent(getClass());
if (api == TipsApi.STUB)
return;
api.showTutorial(getActivity());
View contentView = findViewById(android.R.id.content);
mTutorial = api.showTutorial(getActivity(), contentView.getHeight());
}
private void initFilterViews()
@ -644,6 +649,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
initTips();
}
private void runSearch()
{
// The previous search should be cancelled before the new one is started, since previous search

View file

@ -0,0 +1,84 @@
package com.mapswithme.maps.tips;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
import uk.co.samuelwall.materialtaptargetprompt.extras.PromptBackground;
import uk.co.samuelwall.materialtaptargetprompt.extras.PromptOptions;
import uk.co.samuelwall.materialtaptargetprompt.extras.PromptUtils;
/**
* {@link PromptBackground} implementation that renders the prompt background as a rectangle.
*/
public class ImmersiveCompatPromptBackground extends PromptBackground
{
private RectF mBounds, mBaseBounds;
private Paint mPaint;
private int mBaseColourAlpha;
private PointF mFocalCentre;
int mHeight = 0;
/**
* Constructor.
*/
public ImmersiveCompatPromptBackground()
{
mPaint = new Paint();
mPaint.setAntiAlias(true);
mBounds = new RectF();
mBaseBounds = new RectF();
mFocalCentre = new PointF();
}
@Override
public void setColour(@ColorInt int colour)
{
mPaint.setColor(colour);
mBaseColourAlpha = Color.alpha(colour);
mPaint.setAlpha(mBaseColourAlpha);
}
public void setHeight(int height)
{
mHeight = height;
}
@Override
public void prepare(@NonNull final PromptOptions options, final boolean clipToBounds, @NonNull Rect clipBounds)
{
final RectF focalBounds = options.getPromptFocal().getBounds();
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
mBaseBounds.set(0, 0, metrics.widthPixels, mHeight == 0 ? metrics.heightPixels : mHeight);
mFocalCentre.x = focalBounds.centerX();
mFocalCentre.y = focalBounds.centerY();
}
@Override
public void update(@NonNull final PromptOptions prompt, float revealModifier,
float alphaModifier)
{
mPaint.setAlpha((int) (mBaseColourAlpha * alphaModifier));
PromptUtils.scale(mFocalCentre, mBaseBounds, mBounds, revealModifier, false);
}
@Override
public void draw(@NonNull Canvas canvas)
{
canvas.drawRect(mBounds, mPaint);
}
@Override
public boolean contains(float x, float y)
{
return mBounds.contains(x, y);
}
}

View file

@ -18,7 +18,6 @@ import com.mapswithme.util.UiUtils;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
import uk.co.samuelwall.materialtaptargetprompt.extras.backgrounds.FullscreenPromptBackground;
import java.util.Arrays;
import java.util.List;
@ -76,7 +75,7 @@ public enum TipsApi
STUB
{
public void showTutorial(@NonNull Activity activity)
public MaterialTapTargetPrompt showTutorial(@NonNull Activity activity, int height)
{
throw new UnsupportedOperationException("Not supported here!");
}
@ -123,8 +122,10 @@ public enum TipsApi
return mAllowedScreens.contains(screenClass);
}
public void showTutorial(@NonNull Activity activity)
public MaterialTapTargetPrompt showTutorial(@NonNull Activity activity, int height)
{
ImmersiveCompatPromptBackground bg = new ImmersiveCompatPromptBackground();
bg.setHeight(height);
View target = activity.findViewById(mAnchorViewId);
MaterialTapTargetPrompt.Builder builder = new MaterialTapTargetPrompt
.Builder(activity)
@ -140,9 +141,10 @@ public enum TipsApi
.setSecondaryTextTypeface(Typeface.DEFAULT)
.setBackgroundColour(ThemeUtils.getColor(activity, R.attr.tipsBgColor))
.setFocalColour(activity.getResources().getColor(android.R.color.transparent))
.setPromptBackground(new FullscreenPromptBackground())
.setPromptBackground(bg)
.setClipToView(null)
.setPromptStateChangeListener((prompt, state) -> onPromptStateChanged(state));
builder.show();
return builder.show();
}
private void onPromptStateChanged(int state)