aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/intro/IntroMainFragments.kt
blob: 552fad3bc485776a1c530c085595808a4a33cc27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.pitchedapps.frost.intro

import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.os.Bundle
import android.support.constraint.ConstraintLayout
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import ca.allanwang.kau.kotlin.LazyResettableRegistry
import ca.allanwang.kau.utils.Kotterknife
import ca.allanwang.kau.utils.bindViewResettable
import ca.allanwang.kau.utils.setOnSingleTapListener
import com.pitchedapps.frost.R
import com.pitchedapps.frost.activities.IntroActivity
import com.pitchedapps.frost.utils.Prefs
import org.jetbrains.anko.childrenSequence

/**
 * Created by Allan Wang on 2017-07-28.
 *
 * Contains the base, start, and end fragments
 */

/**
 * The core intro fragment for all other fragments
 */
abstract class BaseIntroFragment(val layoutRes: Int) : Fragment() {

    val screenWidth
        get() = resources.displayMetrics.widthPixels

    val lazyRegistry = LazyResettableRegistry()

    protected fun translate(offset: Float, views: Array<Array<out View>>) {
        val maxTranslation = offset * screenWidth
        val increment = maxTranslation / views.size
        views.forEachIndexed { i, group ->
            group.forEach {
                it.translationX = if (offset > 0) -maxTranslation + i * increment else -(i + 1) * increment
                it.alpha = 1 - Math.abs(offset)
            }
        }
    }

    fun <T : Any> lazyResettableRegistered(initializer: () -> T) = lazyRegistry.lazy(initializer)

    /*
     * Note that these ids aren't actually inside all layouts
     * However, they are in most of them, so they are added here
     * for convenience
     */
    protected val title: TextView by bindViewResettable(R.id.intro_title)
    protected val image: ImageView by bindViewResettable(R.id.intro_image)
    protected val desc: TextView by bindViewResettable(R.id.intro_desc)

    protected fun defaultViewArray(): Array<Array<out View>> = arrayOf(arrayOf(title), arrayOf(image), arrayOf(desc))

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(layoutRes, container, false)
        return view
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        themeFragment()
    }

    override fun onDestroyView() {
        super.onDestroyView()
        Kotterknife.reset(this)
        lazyRegistry.invalidateAll()
    }

    fun themeFragment() {
        if (view != null) themeFragmentImpl()
    }

    protected open fun themeFragmentImpl() {
        view?.childrenSequence()?.forEach { (it as? TextView)?.setTextColor(Prefs.textColor) }
    }

    protected val viewArray: Array<Array<out View>> by lazyResettableRegistered { viewArray() }

    protected abstract fun viewArray(): Array<Array<out View>>

    fun onPageScrolled(positionOffset: Float) {
        if (view != null) onPageScrolledImpl(positionOffset)
    }

    protected open fun onPageScrolledImpl(positionOffset: Float) {
        translate(positionOffset, viewArray)
    }

    fun onPageSelected() {
        if (view != null) onPageSelectedImpl()
    }

    protected open fun onPageSelectedImpl() {

    }
}

class IntroFragmentWelcome : BaseIntroFragment(R.layout.intro_welcome) {

    override fun viewArray(): Array<Array<out View>> = defaultViewArray()

    override fun themeFragmentImpl() {
        super.themeFragmentImpl()
        image.imageTintList = ColorStateList.valueOf(Prefs.textColor)
    }
}

class IntroFragmentEnd : BaseIntroFragment(R.layout.intro_end) {

    val container: ConstraintLayout by bindViewResettable(R.id.intro_end_container)

    override fun viewArray(): Array<Array<out View>> = defaultViewArray()

    override fun themeFragmentImpl() {
        super.themeFragmentImpl()
        image.imageTintList = ColorStateList.valueOf(Prefs.textColor)
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        container.setOnSingleTapListener { _, event ->
            (activity as IntroActivity).finish(event.x, event.y)
        }
    }
}