forked from organicmaps/organicmaps
[android] Added Immersive Compat Background
This commit is contained in:
parent
08a680e75e
commit
9489e1f5de
4 changed files with 82 additions and 78 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue