aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentContract.kt
blob: 62b1de330ddd3f8107b2a25e06a42be49b5462a1 (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
package com.pitchedapps.frost.fragments

import android.content.Context
import com.pitchedapps.frost.contracts.FrostContentContainer
import com.pitchedapps.frost.contracts.FrostContentCore
import com.pitchedapps.frost.contracts.FrostContentParent
import com.pitchedapps.frost.contracts.MainActivityContract
import com.pitchedapps.frost.views.FrostRecyclerView
import io.reactivex.disposables.Disposable

/**
 * Created by Allan Wang on 2017-11-07.
 */

interface FragmentContract : FrostContentContainer {

    val content: FrostContentParent?

    /**
     * Helper to retrieve the core from [content]
     */
    val core: FrostContentCore?
        get() = content?.core

    /**
     * Specifies position in Activity's viewpager
     */
    val position: Int

    /**
     * Specifies whether if current load
     * will be fragment's first load
     *
     * Defaults to true
     */
    var firstLoad: Boolean

    /**
     * Called when the fragment is first visible
     * Typically, if [firstLoad] is true,
     * the fragment should call [reload] and make [firstLoad] false
     */
    fun firstLoadRequest()

    /**
     * Single callable action to be executed upon creation
     * Note that this call is not guaranteed
     */
    fun post(action: (fragment: FragmentContract) -> Unit)

    /**
     * Call whenever a fragment is attached so that it may listen
     * to activity emissions
     */
    fun attachMainObservable(contract: MainActivityContract): Disposable

    /**
     * Load custom layout to container
     */
    fun innerView(context: Context): FrostContentCore

    /**
     * Call when fragment is detached so that any existing
     * observable is disposed
     */
    fun detachMainObservable()

    /*
     * -----------------------------------------
     * Delegates
     * -----------------------------------------
     */

    fun onBackPressed(): Boolean

    fun onTabClick()


}

interface RecyclerContentContract {

    fun bind(recyclerView: FrostRecyclerView)

    /**
     * Completely handle data reloading
     * Optional progress emission update
     * Callback returns [true] for success, [false] otherwise
     */
    fun reload(progress: (Int) -> Unit, callback: (Boolean) -> Unit)

}