Skip to content

Commit f572c4e

Browse files
author
Patrick Jackson
committed
[WIP] working before view interface refactor
1 parent 0ae7364 commit f572c4e

28 files changed

+438
-325
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ dependencies {
5353
implementation fileTree(dir: 'libs', include: ['*.jar'])
5454
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
5555
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
56-
implementation 'com.google.android.material:material:1.1.0-alpha08'
56+
implementation 'com.google.android.material:material:1.1.0-alpha09'
5757
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
5858
implementation "android.arch.navigation:navigation-fragment-ktx:$ktxVersion"
5959
implementation "android.arch.navigation:navigation-ui-ktx:$ktxVersion"

android/src/main/java/com/jackson/openlibrary/BottomNavigationDialogFragment.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment
88
import com.willowtreeapps.common.*
99
import com.willowtreeapps.common.external.AttachView
1010
import com.willowtreeapps.common.external.DetachView
11-
import com.willowtreeapps.common.external.SelectorSubscriberBuilder
11+
import com.willowtreeapps.common.external.rootDispatch
1212
import com.willowtreeapps.common.ui.BottomNavSheet
1313
import kotlinx.android.synthetic.main.fragment_bottomsheet.*
14-
import org.reduxkotlin.Dispatcher
1514

1615
class BottomNavigationDrawerFragment : BottomSheetDialogFragment(), BottomNavSheet {
1716

18-
override lateinit var dispatch: Dispatcher
19-
override var selectorBuilder: SelectorSubscriberBuilder<AppState>? = null
17+
// override lateinit var dispatch: Dispatcher
18+
// override var selectorBuilder: SelectorSubscriberBuilder<AppState>? = null
2019

2120

2221
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@@ -36,12 +35,12 @@ class BottomNavigationDrawerFragment : BottomSheetDialogFragment(), BottomNavShe
3635
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3736
navigation_view.setNavigationItemSelectedListener { menuItem ->
3837
when (menuItem.itemId) {
39-
R.id.readingList -> dispatch(UiActions.ReadingListBtnTapped())
40-
R.id.completedList -> dispatch(UiActions.CompletedListBtnTapped())
38+
R.id.readingList -> rootDispatch(UiActions.ReadingListBtnTapped())
39+
R.id.completedList -> rootDispatch(UiActions.CompletedListBtnTapped())
4140
}
4241
dismiss()
4342

4443
true
4544
}
4645
}
47-
}
46+
}

android/src/main/java/com/jackson/openlibrary/store/BaseLibraryViewFragment.kt

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@ package com.jackson.openlibrary.store
22

33
import android.os.Bundle
44
import androidx.fragment.app.Fragment
5-
import com.jackson.openlibrary.OpenLibraryApp
6-
import com.willowtreeapps.common.*
7-
import com.willowtreeapps.common.external.AttachView
8-
import com.willowtreeapps.common.external.DetachView
9-
import com.willowtreeapps.common.external.SelectorSubscriberBuilder
10-
import com.willowtreeapps.common.ui.LibraryView
11-
import kotlinx.coroutines.CoroutineScope
12-
import kotlinx.coroutines.Dispatchers
13-
import org.reduxkotlin.Dispatcher
14-
import kotlin.coroutines.CoroutineContext
15-
16-
open class BaseLibraryViewFragment<V: LibraryView>: Fragment(), LibraryView {
5+
import androidx.lifecycle.*
6+
import com.willowtreeapps.common.AppState
7+
import com.willowtreeapps.common.external.*
178

9+
abstract class BaseLibraryViewFragment<V: ViewWithProvider<AppState>>: Fragment(), ViewWithProvider<AppState> {
10+
11+
private val presenterObserver = PresenterLifecycleObserver(this)
1812
private var viewRecreated: Boolean = false
19-
override lateinit var dispatch: Dispatcher
20-
override var selectorBuilder: SelectorSubscriberBuilder<AppState>? = null
13+
14+
override fun onCreate(savedInstanceState: Bundle?) {
15+
retainInstance = true
16+
lifecycle.addObserver(presenterObserver)
17+
super.onCreate(savedInstanceState)
18+
}
19+
/*
2120
2221
override fun onViewCreated(view: android.view.View, savedInstanceState: Bundle?) {
2322
super.onViewCreated(view, savedInstanceState)
@@ -31,17 +30,66 @@ open class BaseLibraryViewFragment<V: LibraryView>: Fragment(), LibraryView {
3130
3231
override fun onResume() {
3332
super.onResume()
34-
OpenLibraryApp.dispatch(AttachView(this))
33+
// OpenLibraryApp.dispatch(AttachView(this))
34+
rootDispatch(AttachView(this))
3535
if (viewRecreated) {
3636
//TODO update view with all state
3737
// presenter?.recreateView()
3838
}
3939
}
4040
41+
*/
42+
43+
/*
4144
override fun onPause() {
4245
super.onPause()
43-
OpenLibraryApp.dispatch(DetachView(this))
46+
// OpenLibraryApp.dispatch(DetachView(this))
47+
rootDispatch(DetachView(this))
48+
}
49+
50+
override fun onDestroy() {
51+
super.onDestroy()
52+
// rootDispatch(ClearView(this))
53+
// OpenLibraryApp.dispatch(ClearView(this))
54+
}
55+
*/
56+
}
57+
58+
59+
class PresenterLifecycleObserver(val view: ViewWithProvider<AppState>): LifecycleObserver {
60+
61+
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
62+
fun onAttach() {
63+
rootDispatch(AttachView(view))
4464
}
65+
66+
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
67+
fun onDetach() {
68+
rootDispatch(DetachView(view))
69+
}
70+
71+
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
72+
fun onClear() {
73+
rootDispatch(ClearView(view))
74+
}
75+
4576
}
4677

78+
/*
79+
class PresenterMiddlewareViewModel: LifecycleObserver, ViewModel() {
80+
81+
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
82+
fun onAttach() {
83+
rootDispatch(AttachView(this))
84+
}
85+
86+
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
87+
fun onDetach() {
88+
rootDispatch(AttachView(this))
89+
}
90+
override fun onCleared() {
91+
super.onCleared()
92+
}
93+
}
4794
95+
*/

android/src/main/java/com/jackson/openlibrary/store/CompletedFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
88
import com.jackson.openlibrary.MainActivity
99
import com.jackson.openlibrary.R
1010
import com.willowtreeapps.common.UiActions
11+
import com.willowtreeapps.common.external.rootDispatch
1112
import com.willowtreeapps.common.ui.CompletedView
1213
import kotlinx.android.synthetic.main.fragment_completed.*
1314
import kotlinx.android.synthetic.main.fragment_reading_list.loading_spinner
@@ -34,7 +35,7 @@ class CompletedFragment : BaseLibraryViewFragment<CompletedView>(), CoroutineSco
3435
override fun onResume() {
3536
super.onResume()
3637
(activity as MainActivity).showFab()
37-
dispatch(UiActions.CompletedListShown())
38+
rootDispatch(UiActions.CompletedListShown())
3839
}
3940

4041
override fun hideLoading() {

android/src/main/java/com/jackson/openlibrary/store/DetailsFragment.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
package com.jackson.openlibrary.store
22

3-
import android.R.color
4-
import android.graphics.drawable.Drawable
53
import android.os.Bundle
64
import android.view.*
7-
import androidx.core.content.ContextCompat
8-
import androidx.core.graphics.drawable.DrawableCompat
95
import com.jackson.openlibrary.GlideApp
106
import com.jackson.openlibrary.MainActivity
7+
import com.jackson.openlibrary.OpenLibraryApp.Companion.dispatch
118
import com.jackson.openlibrary.R
129
import com.jackson.openlibrary.tintAllIcons
1310
import com.willowtreeapps.common.UiActions
11+
import com.willowtreeapps.common.external.rootDispatch
1412
import com.willowtreeapps.common.ui.BookDetailViewState
1513
import com.willowtreeapps.common.ui.DetailsView
1614
import kotlinx.android.synthetic.main.fragment_book_detail.*
17-
import kotlinx.coroutines.CoroutineScope
18-
import kotlinx.coroutines.Dispatchers
19-
import kotlin.coroutines.CoroutineContext
20-
21-
22-
class DetailsFragment : BaseLibraryViewFragment<DetailsView>(), CoroutineScope, DetailsView {
23-
24-
override val coroutineContext: CoroutineContext
25-
get() = Dispatchers.Main
2615

16+
class DetailsFragment : BaseLibraryViewFragment<DetailsView>(), DetailsView {
2717

2818
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
2919
(activity as MainActivity).hideFab()
@@ -39,8 +29,8 @@ class DetailsFragment : BaseLibraryViewFragment<DetailsView>(), CoroutineScope,
3929

4030
override fun onOptionsItemSelected(item: MenuItem): Boolean {
4131
when (item.itemId) {
42-
R.id.addToCompletedList -> dispatch(UiActions.AddToCompletedButtonTapped())
43-
R.id.addToReadingList -> dispatch(UiActions.AddToReadingButtonTapped())
32+
R.id.addToCompletedList -> rootDispatch(UiActions.AddToCompletedButtonTapped())
33+
R.id.addToReadingList -> rootDispatch(UiActions.AddToReadingButtonTapped())
4434
}
4535
return true
4636
}

android/src/main/java/com/jackson/openlibrary/store/ReadingListFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import kotlinx.coroutines.Dispatchers
1313
import kotlin.coroutines.CoroutineContext
1414
import com.jackson.openlibrary.R
1515
import com.willowtreeapps.common.UiActions
16+
import com.willowtreeapps.common.external.rootDispatch
1617

1718

1819
class ReadingListFragment : BaseLibraryViewFragment<ReadingListView>(), CoroutineScope, ReadingListView {
@@ -35,7 +36,7 @@ class ReadingListFragment : BaseLibraryViewFragment<ReadingListView>(), Coroutin
3536

3637
override fun onResume() {
3738
super.onResume()
38-
dispatch(UiActions.ReadingListShown())
39+
rootDispatch(UiActions.ReadingListShown())
3940
(activity as MainActivity).showFab()
4041
}
4142

android/src/main/java/com/jackson/openlibrary/store/SearchFragment.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
1010
import com.jackson.openlibrary.OpenLibraryApp
1111
import com.jackson.openlibrary.R
1212
import com.willowtreeapps.common.UiActions
13+
import com.willowtreeapps.common.external.rootDispatch
1314
import com.willowtreeapps.common.ui.BookListItemViewState
1415
import com.willowtreeapps.common.ui.SearchView
1516
import kotlinx.android.synthetic.main.fragment_search.*
@@ -20,13 +21,9 @@ import kotlinx.coroutines.Dispatchers
2021
import java.util.*
2122
import kotlin.coroutines.CoroutineContext
2223

23-
class SearchFragment : BaseLibraryViewFragment<SearchView>(), CoroutineScope, SearchView {
24+
class SearchFragment : BaseLibraryViewFragment<SearchView>(), SearchView {
2425
private val adapter = BooksAdapter()
2526

26-
override val coroutineContext: CoroutineContext
27-
get() = Dispatchers.Main
28-
29-
3027
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3128
return inflater.inflate(R.layout.fragment_search, container, false)
3229
}
@@ -38,16 +35,19 @@ class SearchFragment : BaseLibraryViewFragment<SearchView>(), CoroutineScope, Se
3835
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3936
searchRecycler.adapter = adapter
4037
searchRecycler.layoutManager = LinearLayoutManager(context)
38+
val ignoreNextTextChange = savedInstanceState != null
4139
txt_search.addTextChangedListener(object : TextWatcher {
4240
var timer: Timer? = null
4341
override fun afterTextChanged(s: Editable?) {
44-
timer = Timer()
45-
timer?.schedule(object: TimerTask() {
46-
override fun run() {
47-
dispatch(UiActions.SearchQueryEntered(s.toString()))
48-
}
42+
if (!ignoreNextTextChange) {
43+
timer = Timer()
44+
timer?.schedule(object : TimerTask() {
45+
override fun run() {
46+
rootDispatch(UiActions.SearchQueryEntered(s.toString()))
47+
}
4948

50-
}, 1000)
49+
}, 1000)
50+
}
5151

5252
}
5353

android/src/main/res/values/styles.xml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,89 @@
5656
<item name="android:textColor">@color/black</item>
5757
</style>
5858

59+
60+
<style name="H1">
61+
<item name="android:textSize">96sp</item>
62+
<item name="android:letterSpacing">-0.16</item>
63+
<item name="android:fontFamily">sans-serif-light</item>
64+
</style>
65+
66+
<style name="H2">
67+
<item name="android:textSize">60sp</item>
68+
<item name="android:letterSpacing">-0.007</item>
69+
<item name="android:fontFamily">sans-serif-light</item>
70+
</style>
71+
72+
<style name="H3">
73+
<item name="android:textSize">48sp</item>
74+
<item name="android:letterSpacing">0</item>
75+
<item name="android:fontFamily">sans-serif</item>
76+
</style>
77+
78+
<style name="H4">
79+
<item name="android:textSize">34sp</item>
80+
<item name="android:letterSpacing">0.007</item>
81+
<item name="android:fontFamily">sans-serif</item>
82+
</style>
83+
<style name="H4.Dark">
84+
<item name="android:color">@color/colorPrimary</item>
85+
</style>
86+
87+
<style name="H5">
88+
<item name="android:textSize">24sp</item>
89+
<item name="android:letterSpacing">0</item>
90+
<item name="android:fontFamily">sans-serif</item>
91+
</style>
92+
93+
<style name="H6">
94+
<item name="android:textSize">20sp</item>
95+
<item name="android:letterSpacing">0.0075</item>
96+
<item name="android:fontFamily">sans-serif-medium</item>
97+
</style>
98+
99+
<style name="Subtitle1">
100+
<item name="android:textSize">16sp</item>
101+
<item name="android:letterSpacing">0.009</item>
102+
<item name="android:fontFamily">sans-serif-medium</item>
103+
</style>
104+
105+
<style name="Subtitle2">
106+
<item name="android:textSize">14sp</item>
107+
<item name="android:letterSpacing">0.007</item>
108+
<item name="android:fontFamily">sans-serif-medium</item>
109+
</style>
110+
111+
<style name="Body1">
112+
<item name="android:textSize">16sp</item>
113+
<item name="android:letterSpacing">0.031</item>
114+
<item name="android:fontFamily">sans-serif</item>
115+
</style>
116+
117+
<style name="Body2">
118+
<item name="android:textSize">14sp</item>
119+
<item name="android:letterSpacing">0.018</item>
120+
<item name="android:fontFamily">sans-serif</item>
121+
</style>
122+
123+
<style name="Button">
124+
<item name="android:textSize">14sp</item>
125+
<item name="android:letterSpacing">0.089</item>
126+
<item name="android:fontFamily">sans-serif-medium</item>
127+
<item name="android:textAllCaps">true</item>
128+
</style>
129+
130+
<style name="Caption">
131+
<item name="android:textSize">12sp</item>
132+
<item name="android:letterSpacing">0.033333</item>
133+
<item name="android:fontFamily">sans-serif</item>
134+
</style>
135+
136+
<style name="Overline">
137+
<item name="android:textSize">10sp</item>
138+
<item name="android:letterSpacing">.15</item>
139+
<item name="android:fontFamily">sans-serif</item>
140+
<item name="android:textAllCaps">true</item>
141+
</style>
142+
59143
</resources>
60144

common/build.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ kotlin {
2424
targets {
2525
// fromPreset(presets.jvm, 'jvm')
2626
fromPreset(presets.android, 'android')
27+
// fromPreset(presets.android, 'androidMock')
2728
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
2829
? presets.iosArm64 : presets.iosX64
2930

3031
fromPreset(iOSTarget, 'ios') {
3132
binaries {
32-
framework('common')
33+
framework('common', [DEBUG])
3334
}
3435
}
3536

@@ -49,8 +50,8 @@ kotlin {
4950
implementation "io.ktor:ktor-client-logging:$ktorVersion"
5051
implementation "com.willowtreeapps:fuzzywuzzy-kotlin:0.2.1"
5152
implementation "org.reduxkotlin:redux-kotlin:0.2.4"
52-
implementation "org.reduxkotlin:redux-kotlin-thunk:0.2.5"
53-
implementation "org.reduxkotlin:redux-kotlin-reselect:0.2.5"
53+
implementation "org.reduxkotlin:redux-kotlin-thunk:0.2.6"
54+
implementation "org.reduxkotlin:redux-kotlin-reselect:0.2.7"
5455

5556

5657
implementation "io.ktor:ktor-client-core:$ktorVersion"

0 commit comments

Comments
 (0)