Skip to content

Commit fa05aa0

Browse files
Optimize usage
1 parent 1d12b2d commit fa05aa0

File tree

14 files changed

+181
-37
lines changed

14 files changed

+181
-37
lines changed

loadingstateview-ktx/src/main/java/com/dylanc/loadingstateview/LoadingState.kt

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,46 @@ import androidx.annotation.StringRes
2323
import androidx.fragment.app.Fragment
2424

2525
interface LoadingState {
26-
fun Activity.decorateContentView(listener: OnReloadListener, isDecorated: Boolean = true)
27-
fun View.decorate(listener: OnReloadListener, isDecorated: Boolean = true): View
26+
27+
fun Activity.decorateContentView(listener: OnReloadListener, isDecorated: Boolean)
28+
29+
fun View.decorate(listener: OnReloadListener, isDecorated: Boolean): View
30+
2831
fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate)
32+
2933
fun Activity.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
34+
3035
fun Activity.setToolbar(title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
36+
3137
fun Fragment.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
38+
3239
fun Fragment.setToolbar(title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
40+
3341
fun Activity.setHeaders(vararg delegates: LoadingStateView.ViewDelegate)
42+
3443
fun Fragment.setHeaders(vararg delegates: LoadingStateView.ViewDelegate)
44+
3545
fun Activity.setDecorView(delegate: LoadingStateView.DecorViewDelegate)
46+
3647
fun Fragment.setDecorView(delegate: LoadingStateView.DecorViewDelegate)
48+
3749
fun showLoadingView()
50+
3851
fun showContentView()
52+
3953
fun showErrorView()
54+
4055
fun showEmptyView()
56+
4157
fun showCustomView(viewType: Any)
58+
4259
fun updateToolbar(block: ToolbarConfig.() -> Unit)
60+
4361
fun <T : LoadingStateView.ViewDelegate> updateView(viewType: Any, block: T.() -> Unit)
62+
63+
fun ToolbarViewDelegate(
64+
title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null
65+
): ToolbarViewDelegate
4466
}
4567

4668
class LoadingStateImpl : LoadingState {
@@ -66,15 +88,15 @@ class LoadingStateImpl : LoadingState {
6688
}
6789

6890
override fun Activity.setToolbar(title: String?, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) {
69-
setHeaders(ToolbarViewDelegate(title, navBtnType, block))
91+
loadingStateView?.setHeaders(ToolbarViewDelegate(title, navBtnType, block))
7092
}
7193

7294
override fun Fragment.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) {
7395
setToolbar(getString(titleId), navBtnType, block)
7496
}
7597

7698
override fun Fragment.setToolbar(title: String?, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) {
77-
setHeaders(ToolbarViewDelegate(title, navBtnType, block))
99+
loadingStateView?.setHeaders(ToolbarViewDelegate(title, navBtnType, block))
78100
}
79101

80102
override fun Activity.setHeaders(vararg delegates: LoadingStateView.ViewDelegate) {
@@ -120,4 +142,11 @@ class LoadingStateImpl : LoadingState {
120142
override fun <T : LoadingStateView.ViewDelegate> updateView(viewType: Any, block: T.() -> Unit) {
121143
loadingStateView?.getViewDelegate<T>(viewType)?.apply(block)
122144
}
145+
146+
override fun ToolbarViewDelegate(title: String?, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) =
147+
requireNotNull(loadingStateView?.getViewDelegate<ToolbarViewDelegate>(ViewType.TITLE)) {
148+
"ToolbarViewDelegate must be registered before."
149+
}.apply {
150+
config = ToolbarConfig(title, navBtnType).apply { block?.invoke(this) }
151+
}
123152
}

loadingstateview-ktx/src/main/java/com/dylanc/loadingstateview/ToolbarViewDelegate.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,6 @@ import android.view.LayoutInflater
2222
import android.view.View
2323
import android.view.ViewGroup
2424

25-
typealias ToolbarFactory = () -> ToolbarViewDelegate
26-
27-
lateinit var toolbarFactory: ToolbarFactory
28-
29-
fun ToolbarViewDelegate(title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null) =
30-
toolbarFactory().apply { config = ToolbarConfig(title, navBtnType).apply { block?.invoke(this) } }
31-
3225
abstract class ToolbarViewDelegate : LoadingStateView.ViewDelegate(ViewType.TITLE) {
3326
internal lateinit var config: ToolbarConfig
3427

loadingstateview/src/main/java/com/dylanc/loadingstateview/LoadingStateView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ class LoadingStateView @JvmOverloads constructor(
248248
}
249249
}
250250

251-
fun interface OnReloadListener {
252-
fun onReload()
251+
interface OnReloadListener {
252+
fun onReload() = Unit
253253
}
254254

255255
enum class ViewType {

sample-java/src/main/java/com/dylanc/loadingstateview/sample/java/base/BaseActivity.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import androidx.appcompat.app.AppCompatActivity;
2121

2222
import com.dylanc.loadingstateview.LoadingStateView;
23+
import com.dylanc.loadingstateview.OnReloadListener;
2324
import com.dylanc.loadingstateview.sample.java.delegate.NavIconType;
2425
import com.dylanc.loadingstateview.sample.java.delegate.ToolbarViewDelegate;
2526

@@ -33,7 +34,7 @@
3334
* @author Dylan Cai
3435
*/
3536
@SuppressWarnings("unused")
36-
public class BaseActivity extends AppCompatActivity {
37+
public class BaseActivity extends AppCompatActivity implements OnReloadListener {
3738

3839
private LoadingStateView loadingStateView;
3940

@@ -45,7 +46,7 @@ public void setContentView(int layoutResID) {
4546
public void setContentView(int layoutResID, @IdRes int contentViewId) {
4647
super.setContentView(layoutResID);
4748
if (contentViewId == 0) {
48-
loadingStateView = new LoadingStateView(this, this::onReload);
49+
loadingStateView = new LoadingStateView(this, this);
4950
} else {
5051
loadingStateView = new LoadingStateView(findViewById(contentViewId));
5152
}
@@ -86,6 +87,7 @@ public void showCustomView(Object viewType) {
8687
loadingStateView.showView(viewType);
8788
}
8889

89-
protected void onReload() {
90+
@Override
91+
public void onReload() {
9092
}
9193
}

sample-java/src/main/java/com/dylanc/loadingstateview/sample/java/ui/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class MainActivity extends BaseActivity {
3838
protected void onCreate(@Nullable Bundle savedInstanceState) {
3939
super.onCreate(savedInstanceState);
4040
setContentView(R.layout.activity_main);
41-
setToolbar("LoadingHelper", NavIconType.NONE, R.menu.menu_about);
41+
setToolbar(getString(R.string.app_name), NavIconType.NONE, R.menu.menu_about);
4242
}
4343

4444
@Override

sample-kotlin/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ dependencies {
4343
implementation 'com.google.android.material:material:1.4.0'
4444
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
4545
implementation 'com.github.bumptech.glide:glide:4.12.0'
46+
implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.0.5'
4647
testImplementation 'junit:junit:4.13.2'
4748
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
4849
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

sample-kotlin/src/main/java/com/dylanc/loadingstateview/sample/kotlin/App.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@ import com.dylanc.loadingstateview.LoadingStateView
55
import com.dylanc.loadingstateview.sample.kotlin.delegate.ErrorViewDelegate
66
import com.dylanc.loadingstateview.sample.kotlin.delegate.LoadingViewDelegate
77
import com.dylanc.loadingstateview.toolbar.SimpleToolbarViewDelegate
8-
import com.dylanc.loadingstateview.toolbarFactory
98

109
class App : Application() {
1110

1211
override fun onCreate() {
1312
super.onCreate()
1413
LoadingStateView.setViewDelegatePool {
15-
register(LoadingViewDelegate(), ErrorViewDelegate())
14+
register(SimpleToolbarViewDelegate(), LoadingViewDelegate(), ErrorViewDelegate())
1615
}
17-
toolbarFactory = { SimpleToolbarViewDelegate() }
1816
}
1917
}
Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
/*
2+
* Copyright (c) 2019. Dylan Cai
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
117
package com.dylanc.loadingstateview.sample.kotlin.base
218

319
import android.os.Bundle
@@ -6,9 +22,8 @@ import com.dylanc.loadingstateview.LoadingState
622
import com.dylanc.loadingstateview.LoadingStateImpl
723
import com.dylanc.loadingstateview.OnReloadListener
824

9-
abstract class BaseActivity : AppCompatActivity(), LoadingState by LoadingStateImpl(), OnReloadListener {
10-
11-
abstract val layoutRes: Int
25+
abstract class BaseActivity(private val layoutRes: Int) : AppCompatActivity(),
26+
LoadingState by LoadingStateImpl(), OnReloadListener {
1227

1328
override fun onCreate(savedInstanceState: Bundle?) {
1429
super.onCreate(savedInstanceState)
@@ -17,6 +32,4 @@ abstract class BaseActivity : AppCompatActivity(), LoadingState by LoadingStateI
1732
}
1833

1934
open val isDecorated = true
20-
21-
override fun onReload() = Unit
2235
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright (c) 2019. Dylan Cai
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.dylanc.loadingstateview.sample.kotlin.base
18+
19+
import android.os.Bundle
20+
import androidx.appcompat.app.AppCompatActivity
21+
import androidx.viewbinding.ViewBinding
22+
import com.dylanc.loadingstateview.LoadingState
23+
import com.dylanc.loadingstateview.LoadingStateImpl
24+
import com.dylanc.loadingstateview.OnReloadListener
25+
import com.dylanc.viewbinding.base.ViewBindingUtil
26+
27+
abstract class BaseBindingActivity<VB : ViewBinding> : AppCompatActivity(),
28+
LoadingState by LoadingStateImpl(), OnReloadListener {
29+
30+
lateinit var binding: VB private set
31+
32+
override fun onCreate(savedInstanceState: Bundle?) {
33+
super.onCreate(savedInstanceState)
34+
binding = ViewBindingUtil.inflateWithGeneric(this, layoutInflater)
35+
setContentView(binding.root)
36+
binding.root.decorate(this, isDecorated)
37+
}
38+
39+
open val isDecorated = true
40+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2019. Dylan Cai
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.dylanc.loadingstateview.sample.kotlin.base
18+
19+
import android.os.Bundle
20+
import android.view.LayoutInflater
21+
import android.view.View
22+
import android.view.ViewGroup
23+
import androidx.fragment.app.Fragment
24+
import androidx.viewbinding.ViewBinding
25+
import com.dylanc.loadingstateview.LoadingState
26+
import com.dylanc.loadingstateview.LoadingStateImpl
27+
import com.dylanc.loadingstateview.OnReloadListener
28+
import com.dylanc.viewbinding.base.ViewBindingUtil
29+
30+
abstract class BaseBindingFragment<VB : ViewBinding> : Fragment(),
31+
LoadingState by LoadingStateImpl(), OnReloadListener {
32+
33+
lateinit var binding: VB private set
34+
35+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
36+
binding = ViewBindingUtil.inflateWithGeneric(this, inflater, container, false)
37+
return binding.root.decorate(this, isDecorated)
38+
}
39+
40+
open val isDecorated = true
41+
}

0 commit comments

Comments
 (0)