io.lqd.sdk.visual.SlideUp.java Source code

Java tutorial

Introduction

Here is the source code for io.lqd.sdk.visual.SlideUp.java

Source

/**
 * Copyright 2014-present Liquid Data Intelligence S.A.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.lqd.sdk.visual;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;

import io.lqd.sdk.LQLog;
import io.lqd.sdk.Liquid;
import io.lqd.sdk.R;
import io.lqd.sdk.model.LQInAppMessage;

public class SlideUp implements OnTouchListener, InappMessage {

    private final SlideUp mInstance;
    private final LQInAppMessage mSlideModel;
    private boolean mNewSDK;
    private Context mContext;
    private View mRoot;
    private ViewGroup container;
    private int height;
    private PopupWindow mPopupWindow;
    private float mDy;
    private int mCurrentX;
    private int mCurrentY;

    public SlideUp(Context context, View root, LQInAppMessage slideModel) {
        mInstance = this;
        mRoot = root;
        mContext = context;
        mSlideModel = slideModel;

        if (Build.VERSION.SDK_INT < 16)
            mNewSDK = false;
        else
            mNewSDK = true;

        setUpSlideUp();
        setUpButton();
    }

    private void setUpSlideUp() {
        LayoutInflater layoutInflater = (LayoutInflater) mContext
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        container = (ViewGroup) layoutInflater.inflate(R.layout.activity_slide_up, null);
        TextView mViewMessage = (TextView) container.findViewById(R.id.slideUpText);

        Typeface RegularLato = Typeface.createFromAsset(mContext.getAssets(), "fonts/Lato-Regular.ttf");

        // Set the font
        mViewMessage.setTypeface(RegularLato);

        // Set the message
        mViewMessage.setText(mSlideModel.getMessage());

        // Change Background Color
        container.findViewById(R.id.lowest_layout).setBackgroundColor(Color.parseColor(mSlideModel.getBgColor()));

        // Change Text Color
        ((TextView) container.findViewById(R.id.slideUpText))
                .setTextColor(Color.parseColor(mSlideModel.getMessageColor()));

        // Get View's height depending on device
        final ViewTreeObserver observer = container.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                height = container.getHeight();
            }
        });

        mPopupWindow = new PopupWindow(container, ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, true);

        mPopupWindow.setFocusable(false);
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                Liquid.getInstance().showInAppMessages();
            }
        });
    }

    public void setUpButton() {
        final ImageView mArrowButton = (ImageView) container.findViewById(R.id.slideUpArrowButton);

        for (final LQInAppMessage.Cta cta : mSlideModel.getCtas()) {

            Drawable myArrow = ContextCompat.getDrawable(mContext, R.drawable.arrow);

            // Change arrow button color
            myArrow.setColorFilter(Color.parseColor(cta.getButtonColor()), PorterDuff.Mode.SRC_IN);
            ((ImageView) container.findViewById(R.id.slideUpArrowButton)).setImageDrawable(myArrow);

            mArrowButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent mIntent = new Intent(Intent.ACTION_VIEW);
                    if (cta.getDeepLink() != null) {
                        try {
                            mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            mIntent.setData(Uri.parse(cta.getDeepLink()));
                            Liquid.getInstance().trackCta(cta);
                            mContext.startActivity(mIntent);
                        } catch (Exception e) {
                            LQLog.infoVerbose("Canceled or not properly assigned to deeplink or URL");
                        }
                    }
                    mPopupWindow.dismiss();
                }
            });
        }
    }

    public void show() {
        show(0);
    }

    public void show(int milliseconds) {

        mRoot.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (mNewSDK)
                    animateNew(0, 0);

                mPopupWindow.setAnimationStyle(R.style.SlideUpAnimation);

                container.setOnTouchListener(mInstance);

                mPopupWindow.showAtLocation(mRoot, Gravity.BOTTOM, 0, 0);
            }
        }, milliseconds);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mDy = mCurrentY - event.getRawY();
        }
        if (isSlidingDown(event))
            animateDown(event);
        if (isCancelingSlideDown(event)) {
            if (mCurrentY * 1.5F >= height / 2)
                dismiss();
            else
                resetPosition();
        }
        return false;
    }

    private boolean isSlidingDown(MotionEvent event) {
        return event.getAction() == MotionEvent.ACTION_MOVE;
    }

    private boolean isCancelingSlideDown(MotionEvent event) {
        return event.getAction() == MotionEvent.ACTION_UP;
    }

    private void animateDown(MotionEvent event) {
        mCurrentY = (int) (event.getRawY() + mDy);
        if (mCurrentY > 0) {
            setTransparency(1 - (float) mCurrentY * 1 / height); //root equation: 0.5F + (float) mCurrentY * 1 / (2 * height)

            if (mNewSDK)
                animateNew(mCurrentY, 0);
            else {
                animateOld(mCurrentX, -mCurrentY, -1, -1, false);
            }
        }
    }

    private void resetPosition() {
        if (mNewSDK) {
            animateNew(0, 0);
        } else {
            animateOld(0, 0, -1, -1, true);
        }
        mCurrentX = 0;
        mCurrentY = 0;
        setTransparency(1);
    }

    private void setTransparency(float slide) {
        ViewHelper.setAlpha(container, slide);
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    private void animateNew(float yCoordinate, int duration) {
        container.animate().y(yCoordinate * 1.5F).setDuration(duration).start();
    }

    private void animateOld(int xCoordinate, int yCoordinate, int width, int height, boolean moveOutside) {
        int yCoordinateUpdated = (int) (yCoordinate * 1.5F);
        mPopupWindow.update(xCoordinate, yCoordinateUpdated, width, height);
        mPopupWindow.setClippingEnabled(moveOutside);
    }

    private void dismiss() {
        Liquid.getInstance().trackDismiss(mSlideModel);
        mPopupWindow.dismiss();
    }
}