Skip to content

Commit 3142ef9

Browse files
Optimize usage
1 parent 29bd803 commit 3142ef9

File tree

20 files changed

+141
-46
lines changed

20 files changed

+141
-46
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ abstract class BaseToolbarViewDelegate : LoadingStateView.ViewDelegate(ViewType.
2424
internal lateinit var config: ToolbarConfig
2525

2626
override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup) =
27-
onCreateToolbar(inflater, parent).apply { bind(config) }
27+
onCreateToolbar(inflater, parent).apply { onBindToolbar(config) }
2828

2929
abstract fun onCreateToolbar(inflater: LayoutInflater, parent: ViewGroup): View
3030

31-
abstract fun bind(config: ToolbarConfig)
31+
abstract fun onBindToolbar(config: ToolbarConfig)
3232
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import androidx.fragment.app.Fragment
2323

2424
interface LoadingState {
2525

26-
fun Activity.decorateContentView(listener: OnReloadListener, isDecorated: Boolean = true)
26+
fun Activity.decorateContentView(listener: OnReloadListener? = null, isDecorated: Boolean = true)
2727

28-
fun View.decorate(listener: OnReloadListener, isDecorated: Boolean = true): View
28+
fun View.decorate(listener: OnReloadListener? = null, isDecorated: Boolean = true): View
2929

3030
fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate)
3131

@@ -59,6 +59,7 @@ interface LoadingState {
5959

6060
fun <T : LoadingStateView.ViewDelegate> updateView(viewType: Any, block: T.() -> Unit)
6161

62+
@Suppress("FunctionName")
6263
fun ToolbarViewDelegate(
6364
title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null
6465
): BaseToolbarViewDelegate

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

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,12 @@ import androidx.fragment.app.Fragment
2525
class LoadingStateImpl : LoadingState {
2626
private var loadingStateView: LoadingStateView? = null
2727

28-
override fun Activity.decorateContentView(listener: OnReloadListener, isDecorated: Boolean) {
28+
override fun Activity.decorateContentView(listener: OnReloadListener?, isDecorated: Boolean) {
2929
findViewById<ViewGroup>(android.R.id.content).getChildAt(0).decorate(listener, isDecorated)
3030
}
3131

32-
override fun View.decorate(listener: OnReloadListener, isDecorated: Boolean): View =
33-
if (isDecorated) {
34-
LoadingStateView(this, listener).also { loadingStateView = it }.decorView
35-
} else {
36-
this
37-
}
32+
override fun View.decorate(listener: OnReloadListener?, isDecorated: Boolean): View =
33+
if (isDecorated) LoadingStateView(this, listener).also { loadingStateView = it }.decorView else this
3834

3935
override fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate) {
4036
loadingStateView?.register(*viewDelegates)
@@ -93,11 +89,11 @@ class LoadingStateImpl : LoadingState {
9389
}
9490

9591
override fun updateToolbar(block: ToolbarConfig.() -> Unit) {
96-
updateView<BaseToolbarViewDelegate>(ViewType.TITLE) { bind(config.apply(block)) }
92+
updateView<BaseToolbarViewDelegate>(ViewType.TITLE) { onBindToolbar(config.apply(block)) }
9793
}
9894

9995
override fun <T : LoadingStateView.ViewDelegate> updateView(viewType: Any, block: T.() -> Unit) {
100-
loadingStateView?.getViewDelegate<T>(viewType)?.apply(block)
96+
loadingStateView?.updateViewDelegate(viewType, block)
10197
}
10298

10399
override fun ToolbarViewDelegate(title: String?, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) =

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
package com.dylanc.loadingstateview
2020

2121
import android.app.Activity
22+
import android.content.Context
23+
import android.content.ContextWrapper
2224
import android.view.View
2325
import androidx.annotation.DrawableRes
2426
import kotlin.properties.ReadWriteProperty
@@ -35,12 +37,16 @@ class ToolbarConfig(
3537
) {
3638
@DrawableRes
3739
var navIcon: Int? = null
38-
private set
3940
var navText: String? = null
4041
private set
4142
var onNavClickListener = View.OnClickListener {
42-
if (it.context is Activity) {
43-
(it.context as Activity).finish()
43+
var context: Context? = it.context
44+
while (context is ContextWrapper) {
45+
if (context is Activity) {
46+
context.finish()
47+
return@OnClickListener
48+
}
49+
context = context.baseContext
4450
}
4551
}
4652
private set
@@ -53,7 +59,7 @@ class ToolbarConfig(
5359
var onRightClickListener: View.OnClickListener? = null
5460
private set
5561

56-
fun navIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
62+
fun navIcon(@DrawableRes icon: Int? = navIcon, listener: View.OnClickListener) {
5763
navIcon = icon
5864
onNavClickListener = listener
5965
}

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

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class LoadingStateView @JvmOverloads constructor(
5151
this(activity.findViewById<ViewGroup>(android.R.id.content).getChildAt(0), listener)
5252

5353
init {
54-
viewDelegatePool?.apply { ViewDelegatePool(this@LoadingStateView).invoke() }
54+
poolInitializer?.apply { PoolInitializer(this@LoadingStateView).invoke() }
5555
parent = contentView.parent as ViewGroup?
5656
register(ContentViewDelegate())
5757
setDecorView(LinearDecorViewDelegate(emptyList()))
@@ -62,7 +62,7 @@ class LoadingStateView @JvmOverloads constructor(
6262
*
6363
* @param delegates the view delegates of creating view
6464
*/
65-
fun setHeaders(vararg delegates: ViewDelegate) = setDecorView(LinearDecorViewDelegate(*delegates))
65+
fun setHeaders(vararg delegates: ViewDelegate) = setDecorView(LinearDecorViewDelegate(delegates))
6666

6767
/**
6868
* Sets an view delegate for decorating content view.
@@ -93,7 +93,7 @@ class LoadingStateView @JvmOverloads constructor(
9393
*
9494
* @param delegates the view delegates of creating view
9595
*/
96-
fun addChildHeaders(vararg delegates: ViewDelegate) = addChildDecorView(LinearDecorViewDelegate(*delegates))
96+
fun addChildHeaders(vararg delegates: ViewDelegate) = addChildDecorView(LinearDecorViewDelegate(delegates))
9797

9898
/**
9999
* Adds child decorative view between the content and the decorative view.
@@ -152,7 +152,7 @@ class LoadingStateView @JvmOverloads constructor(
152152
view.visibility = View.VISIBLE
153153
if (animation != null) {
154154
animation.onStartHideAnimation(currentView, currentViewType)
155-
animation.onStartShowAnimation(view, getViewDelegate<ViewDelegate>(viewType).viewType)
155+
animation.onStartShowAnimation(view, getViewDelegate<ViewDelegate>(viewType)!!.viewType)
156156
} else {
157157
currentView.visibility = View.GONE
158158
}
@@ -162,14 +162,15 @@ class LoadingStateView @JvmOverloads constructor(
162162
currentViewType = viewType
163163
}
164164

165+
fun <T : ViewDelegate> updateViewDelegate(viewType: Any, callback: Callback<T>) =
166+
callback.apply { getViewDelegate<T>(viewType)?.invoke() }
167+
165168
@Suppress("UNCHECKED_CAST")
166-
fun <T : ViewDelegate> getViewDelegate(viewType: Any) = viewDelegates[viewType] as T
169+
fun <T : ViewDelegate> getViewDelegate(viewType: Any) = viewDelegates[viewType] as? T
167170

168171
private fun addView(viewType: Any) {
169172
val view = getView(viewType)
170-
if (view.parent != null) {
171-
(view.parent as ViewGroup).removeView(view)
172-
}
173+
(view.parent as? ViewGroup)?.removeView(view)
173174
if (parent is ConstraintLayout && viewType == ViewType.CONTENT) {
174175
view.updateLayoutParams {
175176
if (view.measuredWidth == 0) width = MATCH_PARENT
@@ -182,7 +183,7 @@ class LoadingStateView @JvmOverloads constructor(
182183

183184
private fun getView(viewType: Any): View {
184185
if (viewCashes[viewType] == null) {
185-
val viewDelegate: ViewDelegate = getViewDelegate(viewType)
186+
val viewDelegate = requireNotNull(getViewDelegate(viewType)) { "Please register view delegate for $viewType type." }
186187
val view = viewDelegate.onCreateView(LayoutInflater.from(contentParent.context), contentParent)
187188
viewDelegate.onReloadListener = onReloadListener
188189
viewCashes[viewType] = view
@@ -209,7 +210,7 @@ class LoadingStateView @JvmOverloads constructor(
209210
private inner class LinearDecorViewDelegate(private val views: List<View>) : DecorViewDelegate() {
210211
private lateinit var contentParent: FrameLayout
211212

212-
constructor(vararg delegates: ViewDelegate) : this(delegates.map {
213+
constructor(delegates: Array<out ViewDelegate>) : this(delegates.map {
213214
register(it)
214215
getView(it.viewType)
215216
})
@@ -226,7 +227,7 @@ class LoadingStateView @JvmOverloads constructor(
226227
override fun getContentParent(decorView: View) = contentParent
227228
}
228229

229-
class ViewDelegatePool internal constructor(private val stateView: LoadingStateView) {
230+
class PoolInitializer internal constructor(private val stateView: LoadingStateView) {
230231
fun register(vararg delegates: ViewDelegate) = stateView.register(*delegates)
231232
}
232233

@@ -240,11 +241,11 @@ class LoadingStateView @JvmOverloads constructor(
240241
}
241242

242243
companion object {
243-
private var viewDelegatePool: Callback<ViewDelegatePool>? = null
244+
private var poolInitializer: Callback<PoolInitializer>? = null
244245

245246
@JvmStatic
246-
fun setViewDelegatePool(viewDelegatePool: Callback<ViewDelegatePool>) {
247-
this.viewDelegatePool = viewDelegatePool
247+
fun setViewDelegatePool(poolInitializer: Callback<PoolInitializer>) {
248+
this.poolInitializer = poolInitializer
248249
}
249250
}
250251
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import android.app.Application;
2020

2121
import com.dylanc.loadingstateview.LoadingStateView;
22-
import com.dylanc.loadingstateview.ViewType;
23-
import com.dylanc.loadingstateview.sample.java.animation.FadeAnimation;
2422
import com.dylanc.loadingstateview.sample.java.delegate.EmptyViewDelegate;
2523
import com.dylanc.loadingstateview.sample.java.delegate.ErrorViewDelegate;
2624
import com.dylanc.loadingstateview.sample.java.delegate.LoadingViewDelegate;

sample-java/src/main/java/com/dylanc/loadingstateview/sample/java/delegate/BottomEditorDecorViewDelegate.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
package com.dylanc.loadingstateview.sample.java.delegate;
1818

1919
import android.annotation.SuppressLint;
20+
import android.content.Context;
2021
import android.view.LayoutInflater;
2122
import android.view.View;
2223
import android.view.ViewGroup;
2324
import android.widget.EditText;
2425

26+
import androidx.annotation.NonNull;
27+
2528
import com.dylanc.loadingstateview.LoadingStateView;
2629
import com.dylanc.loadingstateview.sample.java.R;
2730
import com.dylanc.loadingstateview.sample.java.utils.KeyboardUtils;
@@ -41,7 +44,7 @@ public BottomEditorDecorViewDelegate(OnSendListener onSendListener) {
4144
@NotNull
4245
@Override
4346
@SuppressLint("InflateParams")
44-
public View onCreateDecorView(@NotNull LayoutInflater inflater) {
47+
public View onCreateDecorView(@NonNull Context context, @NotNull LayoutInflater inflater) {
4548
View view = inflater.inflate(R.layout.layout_bottom_editor, null);
4649
EditText edtContent = view.findViewById(R.id.edt_content);
4750
view.findViewById(R.id.btn_send).setOnClickListener(v -> {

sample-java/src/main/java/com/dylanc/loadingstateview/sample/java/delegate/LoadingViewDelegate.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.dylanc.loadingstateview.sample.java.delegate;
1818

1919
import androidx.annotation.NonNull;
20+
2021
import android.view.LayoutInflater;
2122
import android.view.View;
2223
import android.view.ViewGroup;
@@ -28,7 +29,7 @@
2829
/**
2930
* @author Dylan Cai
3031
*/
31-
public class LoadingViewDelegate extends LoadingStateView.ViewDelegate{
32+
public class LoadingViewDelegate extends LoadingStateView.ViewDelegate {
3233

3334
public int height = ViewGroup.LayoutParams.MATCH_PARENT;
3435

sample-java/src/main/java/com/dylanc/loadingstateview/sample/java/delegate/ScrollingDecorViewDelegate.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
import android.annotation.SuppressLint;
2020
import android.app.Activity;
21+
import android.content.Context;
2122
import android.os.Build;
2223
import android.view.LayoutInflater;
2324
import android.view.View;
2425
import android.view.ViewGroup;
2526

27+
import androidx.annotation.NonNull;
2628
import androidx.appcompat.widget.Toolbar;
2729

2830
import com.dylanc.loadingstateview.LoadingStateView;
@@ -43,7 +45,7 @@ public ScrollingDecorViewDelegate(String title) {
4345
@NotNull
4446
@Override
4547
@SuppressLint("InflateParams")
46-
public View onCreateDecorView(@NotNull LayoutInflater inflater) {
48+
public View onCreateDecorView(@NonNull Context context, @NotNull LayoutInflater inflater) {
4749
View view = inflater.inflate(R.layout.layout_scrolling_toolbar, null);
4850
Activity activity = (Activity) inflater.getContext();
4951
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import androidx.appcompat.app.AppCompatActivity;
2323

2424
import com.dylanc.loadingstateview.LoadingStateView;
25+
import com.dylanc.loadingstateview.OnReloadListener;
2526
import com.dylanc.loadingstateview.sample.java.R;
2627
import com.dylanc.loadingstateview.sample.java.delegate.NavIconType;
2728
import com.dylanc.loadingstateview.sample.java.animation.FadeAnimation;
@@ -31,7 +32,7 @@
3132
/**
3233
* @author Dylan Cai
3334
*/
34-
public class ActErrorActivity extends AppCompatActivity {
35+
public class ActErrorActivity extends AppCompatActivity implements OnReloadListener {
3536

3637
private LoadingStateView loadingStateView;
3738

@@ -40,7 +41,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
4041
super.onCreate(savedInstanceState);
4142
setContentView(R.layout.layout_content);
4243
loadingStateView = ToolbarUtils.setToolbar(this, "Activity(error)", NavIconType.BACK);
43-
loadingStateView.setOnReloadListener(this::onReload);
44+
loadingStateView.setOnReloadListener(this);
4445
loadData();
4546
}
4647

@@ -59,6 +60,7 @@ public void onFailure() {
5960
});
6061
}
6162

63+
@Override
6264
public void onReload() {
6365
loadingStateView.showLoadingView(new FadeAnimation());
6466
HttpUtils.requestSuccess(new HttpUtils.Callback() {

0 commit comments

Comments
 (0)