[android] Added Immersive Compat Background

This commit is contained in:
Dmitry Donskoy 2018-09-14 16:24:42 +03:00 committed by Aleksandr Zatsepin
parent 08a680e75e
commit 9489e1f5de
4 changed files with 82 additions and 78 deletions

View file

@ -597,19 +597,16 @@ 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;
View contentView = findViewById(android.R.id.content);
mTutorial = api.showTutorial(getActivity(), contentView.getHeight());
api.showTutorial(getActivity());
}
private void initFilterViews()
@ -649,13 +646,6 @@ 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

@ -1,84 +1,97 @@
package com.mapswithme.maps.tips;
import android.content.res.Resources;
import android.annotation.TargetApi;
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.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import com.mapswithme.util.Utils;
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;
@NonNull
private final WindowManager mWindowManager;
@NonNull
private final RectF mBounds;
@NonNull
private final RectF mBaseBounds;
@NonNull
private final Paint mPaint;
private int mBaseColourAlpha;
@NonNull
private final PointF mFocalCentre;
@NonNull
private final DisplayMetrics mBaseMetrics;
/**
* Constructor.
*/
public ImmersiveCompatPromptBackground()
{
mPaint = new Paint();
mPaint.setAntiAlias(true);
mBounds = new RectF();
mBaseBounds = new RectF();
mFocalCentre = new PointF();
}
ImmersiveCompatPromptBackground(@NonNull WindowManager windowManager)
{
mWindowManager = windowManager;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mBounds = new RectF();
mBaseBounds = new RectF();
mFocalCentre = new PointF();
mBaseMetrics = new DisplayMetrics();
}
@Override
public void setColour(@ColorInt int colour)
{
mPaint.setColor(colour);
mBaseColourAlpha = Color.alpha(colour);
mPaint.setAlpha(mBaseColourAlpha);
}
@Override
public void setColour(@ColorInt int colour)
{
mPaint.setColor(colour);
mBaseColourAlpha = Color.alpha(colour);
mPaint.setAlpha(mBaseColourAlpha);
}
public void setHeight(int height)
{
mHeight = height;
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
public void prepare(@NonNull final PromptOptions options, final boolean clipToBounds,
@NonNull Rect clipBounds)
{
final RectF focalBounds = options.getPromptFocal().getBounds();
initDisplayMetrics();
@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, mBaseMetrics.widthPixels, mBaseMetrics.heightPixels);
mFocalCentre.x = focalBounds.centerX();
mFocalCentre.y = focalBounds.centerY();
}
mBaseBounds.set(0, 0, metrics.widthPixels, mHeight == 0 ? metrics.heightPixels : mHeight);
mFocalCentre.x = focalBounds.centerX();
mFocalCentre.y = focalBounds.centerY();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void initDisplayMetrics()
{
if (Utils.isJellyBeanOrLater())
mWindowManager.getDefaultDisplay().getRealMetrics(mBaseMetrics);
else
mWindowManager.getDefaultDisplay().getMetrics(mBaseMetrics);
}
@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 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 void draw(@NonNull Canvas canvas)
{
canvas.drawRect(mBounds, mPaint);
}
@Override
public boolean contains(float x, float y)
{
return mBounds.contains(x, y);
}
@Override
public boolean contains(float x, float y)
{
return mBounds.contains(x, y);
}
}

View file

@ -8,7 +8,6 @@ import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.view.View;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
import com.mapswithme.maps.metrics.UserActionsLogger;
@ -75,7 +74,7 @@ public enum TipsApi
STUB
{
public MaterialTapTargetPrompt showTutorial(@NonNull Activity activity, int height)
public void showTutorial(@NonNull Activity activity)
{
throw new UnsupportedOperationException("Not supported here!");
}
@ -122,10 +121,8 @@ public enum TipsApi
return mAllowedScreens.contains(screenClass);
}
public MaterialTapTargetPrompt showTutorial(@NonNull Activity activity, int height)
public void showTutorial(@NonNull Activity activity)
{
ImmersiveCompatPromptBackground bg = new ImmersiveCompatPromptBackground();
bg.setHeight(height);
View target = activity.findViewById(mAnchorViewId);
MaterialTapTargetPrompt.Builder builder = new MaterialTapTargetPrompt
.Builder(activity)
@ -141,10 +138,9 @@ public enum TipsApi
.setSecondaryTextTypeface(Typeface.DEFAULT)
.setBackgroundColour(ThemeUtils.getColor(activity, R.attr.tipsBgColor))
.setFocalColour(activity.getResources().getColor(android.R.color.transparent))
.setPromptBackground(bg)
.setClipToView(null)
.setPromptBackground(new ImmersiveCompatPromptBackground(activity.getWindowManager()))
.setPromptStateChangeListener((prompt, state) -> onPromptStateChanged(state));
return builder.show();
builder.show();
}
private void onPromptStateChanged(int state)
@ -165,7 +161,7 @@ public enum TipsApi
@NonNull
public static <T> TipsApi requestCurrent(@NonNull Class<T> requiredScreenClass)
{
int index = Framework.nativeGetCurrentTipsApi();
int index = 1;
TipsApi value = index >= 0 ? values()[index] : STUB;
TipsApi tipsApi = value != STUB && value.isScreenAllowed(requiredScreenClass) ? value
: STUB;

View file

@ -605,6 +605,11 @@ public class Utils
return Build.MODEL;
}
public static boolean isJellyBeanOrLater()
{
return isTargetOrLater(Build.VERSION_CODES.JELLY_BEAN_MR1);
}
private static class OnZipCompletedCallback implements LoggerFactory.OnZipCompletedListener
{
@NonNull