com.hookedonplay.decoviewsample.SampleFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.hookedonplay.decoviewsample.SampleFragment.java

Source

/*
 * Copyright (C) 2015 Brent Marriott
 *
 * 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 com.hookedonplay.decoviewsample;

import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;

import com.hookedonplay.decoviewlib.DecoView;
import com.hookedonplay.decoviewlib.charts.SeriesItem;

abstract public class SampleFragment extends Fragment {
    protected final String TAG = getClass().getSimpleName();

    final protected int COLOR_BLUE = Color.parseColor("#AA1D76D2");
    final protected int COLOR_PINK = Color.parseColor("#AAFF4081");
    final protected int COLOR_YELLOW = Color.parseColor("#AAFFC107");
    final protected int COLOR_GREEN = Color.parseColor("#AA07CC07");
    final protected int COLOR_EDGE = Color.parseColor("#22000000");
    final protected int COLOR_BACK = Color.parseColor("#22888888");
    final protected int COLOR_NEUTRAL = Color.parseColor("#FF999999");
    protected boolean mUpdateListeners = true;
    private boolean mInitialized;

    /**
     * Add a listener to update the progress on a TextView
     *
     * @param seriesItem ArcItem to listen for update changes
     * @param view       View to update
     * @param format     String.format to display the progress
     *                   <p/>
     *                   If the string format includes a percentage character we assume that we should set
     *                   a percentage into the string, otherwise the current position is added into the string
     *                   For example if the arc has a min of 0 and a max of 50 and the current position is 20
     *                   Format -> "%.0f%% Complete" -> "40% Complete"
     *                   Format -> "%.1f Km" -> "20.0 Km"
     *                   Format -> "%.0f/40 Levels Complete" -> "20/40 Levels Complete"
     */
    protected void addProgressListener(@NonNull final SeriesItem seriesItem, @NonNull final TextView view,
            @NonNull final String format) {
        if (format.length() <= 0) {
            throw new IllegalArgumentException("String formatter can not be empty");
        }

        seriesItem.addArcSeriesItemListener(new SeriesItem.SeriesItemListener() {
            @Override
            public void onSeriesItemAnimationProgress(float percentComplete, float currentPosition) {
                if (mUpdateListeners) {
                    if (format.contains("%%")) {
                        // We found a percentage so we insert a percentage
                        float percentFilled = (currentPosition - seriesItem.getMinValue())
                                / (seriesItem.getMaxValue() - seriesItem.getMinValue());
                        view.setText(String.format(format, percentFilled * 100f));
                    } else {
                        view.setText(String.format(format, currentPosition));
                    }
                }
            }

            @Override
            public void onSeriesItemDisplayProgress(float percentComplete) {

            }
        });
    }

    protected void addProgressRemainingListener(@NonNull final SeriesItem seriesItem, @NonNull final TextView view,
            @NonNull final String format, final float maxValue) {
        if (format.length() <= 0) {
            throw new IllegalArgumentException("String formatter can not be empty");
        }

        seriesItem.addArcSeriesItemListener(new SeriesItem.SeriesItemListener() {

            @Override
            public void onSeriesItemAnimationProgress(float percentComplete, float currentPosition) {
                if (mUpdateListeners) {
                    if (format.contains("%%")) {
                        // We found a percentage so we insert a percentage
                        view.setText(String.format(format,
                                (1.0f - (currentPosition / seriesItem.getMaxValue())) * 100f));
                    } else {
                        view.setText(String.format(format, maxValue - currentPosition));
                    }
                }
            }

            @Override
            public void onSeriesItemDisplayProgress(float percentComplete) {

            }
        });
    }

    private boolean createAnimation() {
        if (mInitialized) {
            createTracks();
            if (super.getUserVisibleHint()) {
                setupEvents();
            }
            return true;
        }
        return false;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            if (getView() != null) {
                setDemoFinished(false);
                createAnimation();
            }
        } else {
            stopFragment();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (getView() == null) {
            return;
        }

        mInitialized = true;
        final View replay = getView().findViewById(R.id.imageReplay);
        final View swipe = getView().findViewById(R.id.imageSwipe);
        if (replay != null) {
            replay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.rotate_hide);

                    animation.setAnimationListener(new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
                            swipe.setVisibility(View.INVISIBLE);
                            replay.setEnabled(false);
                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            setDemoFinished(false);
                            createAnimation();
                            replay.setEnabled(true);
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {

                        }
                    });
                    replay.startAnimation(animation);
                }
            });
        }
        createAnimation();
    }

    /**
     * Override to create events for demo. For example move, reveal or effect
     */
    abstract protected void setupEvents();

    /**
     * Override to create all the tracks (arcs) required for current page
     */
    abstract protected void createTracks();

    /**
     * Override to stop all once it is no longer displayed
     */
    protected void stopFragment() {
        final DecoView arcView = getDecoView();

        if (arcView == null || arcView.isEmpty()) {
            return;
        }
        arcView.executeReset();
        arcView.deleteAll();
    }

    @Override
    public void onPause() {
        super.onPause();
        stopFragment();
    }

    @Override
    public void onResume() {
        super.onResume();
        createAnimation();
    }

    protected void setDemoFinished(boolean finished) {
        if (getView() != null) {
            final View continueLayout = getView().findViewById(R.id.layoutContinue);
            final View swipe = getView().findViewById(R.id.imageSwipe);
            if (finished) {
                if (continueLayout != null) {
                    continueLayout.setVisibility(View.VISIBLE);
                }
                if (swipe != null) {
                    swipe.setVisibility(View.VISIBLE);
                }
            } else {
                if (continueLayout != null) {
                    continueLayout.setVisibility(View.INVISIBLE);
                }
            }
        }
    }

    /**
     * Convert base dip into pixels based on the display metrics of the current device
     *
     * @param base dip value
     * @return pixels from base dip
     */
    protected float getDimension(float base) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, base, getResources().getDisplayMetrics());
    }

    protected DecoView getDecoView() {
        if (getView() == null) {
            return null;
        }

        try {
            return (DecoView) getView().findViewById(R.id.dynamicArcView);
        } catch (NullPointerException npe) {
            Log.e(TAG, "Unable to resolve view " + npe.getMessage());
        }
        return null;
    }
}