package pro.anton.averin.android.skeleton.views; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; import android.widget.ProgressBar; import android.widget.TextView; import pro.anton.averin.android.skeleton.activities.BaseActivity; import pro.anton.averin.android.skeleton.utils.Logger; import pro.anton.averin.android.skeleton.utils.Utils; import pro.averin.anton.android.skeleton.R; /** * Created by AAverin on 7/5/2014. */ public class LoadingOverlay { private static class LoadingDialog extends DialogFragment { public interface DismissCallback { public void onDismiss(DialogInterface dialog); } private DismissCallback dismissCallback = null; public void setDismissCallback(DismissCallback callback) { dismissCallback = callback; } private ProgressBar loAnim; private TextView loText; private ViewGroup contentView = null; BaseActivity activity = null; int offscreen, carLeft, loadingLeft; public static LoadingDialog newInstance() { LoadingDialog dialogFragment = new LoadingDialog(); return dialogFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Panel); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { contentView = (ViewGroup) inflater.inflate(R.layout.d_loading, container, false); return contentView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Window window = getDialog().getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); lp.dimAmount = 0.75f; window.setAttributes(lp); window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); getDialog().setCanceledOnTouchOutside(false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); activity = (BaseActivity) getActivity(); loAnim = (ProgressBar) contentView.findViewById(R.id.lo_anim); loText = (TextView) contentView.findViewById(R.id.lo_text); final DisplayMetrics metrics = getActivity().getResources().getDisplayMetrics(); ViewTreeObserver observer = contentView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Utils.safeRemoveLayoutListener(contentView.getViewTreeObserver(), this); int carWidth = loAnim.getMeasuredWidth(); int loadingWidth = loText.getMeasuredWidth(); offscreen = metrics.widthPixels + carWidth; carLeft = metrics.widthPixels / 2 - (carWidth / 2); loadingLeft = metrics.widthPixels / 2 - (loadingWidth / 2); } }); } @Override public void onDismiss(DialogInterface dialog) { if (dismissCallback != null) { dismissCallback.onDismiss(dialog); } super.onDismiss(dialog); } @Override public void onResume() { super.onResume(); Window window = getDialog().getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); lp.width = WindowManager.LayoutParams.MATCH_PARENT; window.setAttributes(lp); } int SHOW_DURATION = 600; public void showLoading() { contentView.setVisibility(View.VISIBLE); ObjectAnimator carAnimator = ObjectAnimator.ofFloat(loAnim, "x", offscreen, carLeft); carAnimator.setDuration(SHOW_DURATION); carAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); ObjectAnimator textAnimator = ObjectAnimator.ofFloat(loText, "x", offscreen, loadingLeft); textAnimator.setDuration(SHOW_DURATION); textAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); textAnimator.setStartDelay(100); AnimatorSet set = new AnimatorSet(); set.playTogether(carAnimator, textAnimator); set.start(); } public void hideLoading() { ObjectAnimator carAnimator = ObjectAnimator.ofFloat(loAnim, "x", carLeft, -offscreen); carAnimator.setDuration(SHOW_DURATION); carAnimator.setInterpolator(new AccelerateInterpolator()); carAnimator.setStartDelay(100); ObjectAnimator textAnimator = ObjectAnimator.ofFloat(loText, "x", loadingLeft, -offscreen); textAnimator.setDuration(SHOW_DURATION); textAnimator.setInterpolator(new AccelerateInterpolator()); AnimatorSet set = new AnimatorSet(); set.playTogether(carAnimator, textAnimator); set.start(); set.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { if (isAdded() && activity != null && activity.isActive()) dismiss(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } } private static LoadingOverlay instance = null; private boolean isLoadingShowing = false; LoadingDialog loadingDialog = null; private final static String FRAGMENT_TAG = "LOADING_OVERLAY_DIALOG"; private BaseActivity activity; public static LoadingOverlay getInstance() { if (instance == null) { instance = new LoadingOverlay(); } return instance; } private LoadingOverlay() { } public void setActivity(BaseActivity activity) { this.activity = activity; } public void showLoading() { if (isLoadingShowing || activity == null || !activity.isActive()) { return; } Logger.log(this, "showLoading"); loadingDialog = LoadingDialog.newInstance(); loadingDialog.show(activity.getSupportFragmentManager(), FRAGMENT_TAG); activity.uiHandler.postDelayed(new Runnable() { @Override public void run() { loadingDialog.showLoading(); } }, 50); isLoadingShowing = true; } public void hideLoading() { if (!isLoadingShowing || activity == null || !activity.isActive()) { return; } Logger.log(this, "hideLoading"); if (loadingDialog != null) { loadingDialog.setDismissCallback(new LoadingDialog.DismissCallback() { @Override public void onDismiss(DialogInterface dialog) { loadingDialog.setDismissCallback(null); loadingDialog = null; } }); loadingDialog.hideLoading(); } isLoadingShowing = false; } }