com.github.pockethub.ui.WelcomeActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.github.pockethub.ui.WelcomeActivity.java

Source

/*
 * Copyright (c) 2015 PocketHub
 *
 * 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.github.pockethub.ui;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.ColorInt;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

import com.github.pockethub.R;

public class WelcomeActivity extends DotPagerActivity {

    private final View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            closeAndOpenLogin();
        }
    };

    private int[] colors;
    @ColorInt
    int accentsColorDark;
    @ColorInt
    int accentsColorLight = Color.parseColor("#54FFFFFF");
    @ColorInt
    int darkDividerColor = Color.parseColor("#24000000");

    private View divider;
    private Button doneBtn;
    private Button skipBtn;
    private ImageButton nextBtn;

    /**
     * Find views and do needed initialization
     * @param savedInstanceState
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        configureDotPager();
        loadColors();

        doneBtn = (Button) findViewById(R.id.btn_done);
        skipBtn = (Button) findViewById(R.id.btn_skip);
        nextBtn = (ImageButton) findViewById(R.id.btn_next);
        divider = findViewById(R.id.divider);

        skipBtn.setOnClickListener(onClickListener);
        doneBtn.setOnClickListener(onClickListener);
        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ViewPager pager = getViewPager();
                if (pager.getCurrentItem() + 1 < adapter.getCount()) {
                    pager.setCurrentItem(pager.getCurrentItem() + 1, true);
                } else {
                    configureDotPager();
                }
            }
        });
    }

    /**
     * "Removes" listeners
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        findViewById(R.id.btn_skip).setOnClickListener(null);
        findViewById(R.id.btn_done).setOnClickListener(null);
    }

    /**
     * Create a {@link WelcomePagerAdapter} for the activity
     * @return The created {@link WelcomePagerAdapter}
     */
    @Override
    protected PagerAdapter createAdapter() {
        return new WelcomePagerAdapter(R.layout.welcome_pager_item,
                new int[] { R.drawable.waving_android, R.drawable.welcome_app_icon, R.drawable.thumb_up },
                getResources().getStringArray(R.array.welcome_texts),
                getResources().getStringArray(R.array.welcome_titles));
    }

    /**
     * Close the activity and start login
     */
    private void closeAndOpenLogin() {
        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
        editor.putBoolean(MainActivity.PREF_FIRST_USE, false);
        editor.apply();
        startActivity(new Intent(this, MainActivity.class));
        finish();
    }

    /**
     * Update background color depending on scroll position
     * @param position
     * @param positionOffset
     * @param positionOffsetPixels
     */
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        super.onPageScrolled(position, positionOffset, positionOffsetPixels);
        @ColorInt
        int color;
        @ColorInt
        int accentsColor;
        if (positionOffsetPixels >= 0) {
            color = blendColors(getBackgroundColor(position), getBackgroundColor(position + 1),
                    (1 - positionOffset));
            accentsColor = blendColors(getAccentsColor(position), getAccentsColor(position + 1),
                    (1 - positionOffset));
        } else {
            color = blendColors(getBackgroundColor(position + 1), getBackgroundColor(position),
                    (1 - positionOffset));
            accentsColor = blendColors(getAccentsColor(position + 1), getAccentsColor(position),
                    (1 - positionOffset));
        }

        setBackgroundColor(color);
        skipBtn.setTextColor(accentsColor);
        nextBtn.setColorFilter(accentsColor);
        divider.setBackgroundColor(accentsColor);
        dotPageIndicator.setSelectedDotColor(accentsColor);
    }

    /**
     * Show/hide buttons depending on page
     * @param position
     */
    @Override
    public void onPageSelected(int position) {
        super.onPageSelected(position);
        if (getViewPager().getCurrentItem() == adapter.getCount() - 1) {
            doneBtn.setVisibility(View.VISIBLE);
            nextBtn.setVisibility(View.GONE);
            skipBtn.setVisibility(View.GONE);
        } else {
            doneBtn.setVisibility(View.GONE);
            nextBtn.setVisibility(View.VISIBLE);
            skipBtn.setVisibility(View.VISIBLE);
        }
    }

    /**
     * @return Layout id of the activity content view
     */
    @Override
    public int getContentView() {
        return R.layout.welcome_activity;
    }

    /**
     * Loads the color array
     */
    private void loadColors() {
        TypedArray ta = getResources().obtainTypedArray(R.array.welcome_screen_colors);
        colors = new int[ta.length()];
        for (int i = 0; i < ta.length(); i++) {
            colors[i] = ta.getColor(i, 0);
        }
        ta.recycle();
        accentsColorDark = ContextCompat.getColor(this, R.color.primary);
    }

    /**
     * Safe way to get colors from the color array
     * @param pos
     * @return The color
     */
    private int getBackgroundColor(int pos) {
        if (pos < colors.length)
            return colors[pos];
        else
            return colors[colors.length - 1];
    }

    private int getAccentsColor(int pos) {
        if (pos == 0) {
            return accentsColorDark;
        } else {
            return accentsColorLight;
        }
    }

    private int divider(int pos) {
        if (pos == 0) {
            return darkDividerColor;
        } else {
            return accentsColorLight;
        }
    }

    /**
     * Sets the view background color
     * @param color
     */
    private void setBackgroundColor(int color) {
        findViewById(R.id.container).setBackgroundColor(color);
    }

    /**
     * Blends two colors with a specified ratio
     *
     * (Borrowed form http://developer.android.com/samples/SlidingTabsColors/src/com.example.android.common/view/SlidingTabStrip.html)
     *
     * @param color1
     * @param color2
     * @param ratio
     * @return The blended colors
     */
    private static int blendColors(int color1, int color2, float ratio) {
        final float inverseRation = 1f - ratio;
        float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
        float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
        float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
        return Color.rgb((int) r, (int) g, (int) b);
    }
}