add more injector support

androidx
Ztiany 5 years ago
parent 069cd7db7f
commit 24de572943
  1. 18
      lib_base/src/main/java/com/android/base/app/InjectorBaseAppContext.kt
  2. 6
      lib_base/src/main/java/com/android/base/app/Sword.java
  3. 2
      lib_base/src/main/java/com/android/base/app/activity/ActivityDelegateOwner.java
  4. 2
      lib_base/src/main/java/com/android/base/app/activity/ActivityState.kt
  5. 1
      lib_base/src/main/java/com/android/base/app/activity/BackHandlerHelper.java
  6. 224
      lib_base/src/main/java/com/android/base/app/activity/BaseActivity.java
  7. 190
      lib_base/src/main/java/com/android/base/app/activity/BaseActivity.kt
  8. 26
      lib_base/src/main/java/com/android/base/app/activity/InjectorBaseActivity.java
  9. 280
      lib_base/src/main/java/com/android/base/app/fragment/BaseDialogFragment.java
  10. 250
      lib_base/src/main/java/com/android/base/app/fragment/BaseDialogFragment.kt
  11. 13
      lib_base/src/main/java/com/android/base/app/fragment/BaseFragment.kt
  12. 89
      lib_base/src/main/java/com/android/base/app/fragment/BaseListDialogFragment.kt
  13. 119
      lib_base/src/main/java/com/android/base/app/fragment/BaseListV2DialogFragment.kt
  14. 27
      lib_base/src/main/java/com/android/base/app/fragment/BaseListV2Fragment.kt
  15. 151
      lib_base/src/main/java/com/android/base/app/fragment/BaseStateDialogFragment.java
  16. 94
      lib_base/src/main/java/com/android/base/app/fragment/BaseStateDialogFragment.kt
  17. 32
      lib_base/src/main/java/com/android/base/app/fragment/DefaultHorizontalAnimator.java
  18. 32
      lib_base/src/main/java/com/android/base/app/fragment/DefaultNoAnimator.java
  19. 56
      lib_base/src/main/java/com/android/base/app/fragment/DefaultScaleAnimator.java
  20. 31
      lib_base/src/main/java/com/android/base/app/fragment/DefaultVerticalAnimator.java
  21. 26
      lib_base/src/main/java/com/android/base/app/fragment/DelegateEx.kt
  22. 15
      lib_base/src/main/java/com/android/base/app/fragment/FragmentAnimator.java
  23. 4
      lib_base/src/main/java/com/android/base/app/fragment/FragmentDelegates.java
  24. 118
      lib_base/src/main/java/com/android/base/app/fragment/LazyDelegate.java
  25. 11
      lib_base/src/main/java/com/android/base/app/fragment/LoadingViewFactory.java
  26. 103
      lib_base/src/main/java/com/android/base/app/fragment/animator/FragmentAnimator.kt
  27. 8
      lib_base/src/main/java/com/android/base/app/fragment/animator/FragmentAnimatorHelper.java
  28. 2
      lib_base/src/main/java/com/android/base/app/fragment/delegates/FragmentDelegate.java
  29. 2
      lib_base/src/main/java/com/android/base/app/fragment/delegates/FragmentDelegateOwner.java
  30. 124
      lib_base/src/main/java/com/android/base/app/fragment/delegates/LazyDelegate.kt
  31. 29
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectableEx.kt
  32. 20
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectorBaseDialogFragment.kt
  33. 20
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectorBaseFragment.kt
  34. 20
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectorBaseListFragment.kt
  35. 20
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectorBaseListV2Fragment.kt
  36. 20
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectorBaseStateDialogFragment.kt
  37. 20
      lib_base/src/main/java/com/android/base/app/fragment/injectable/InjectorBaseStateFragment.kt
  38. 6
      lib_base/src/main/java/com/android/base/app/fragment/tools/FragmentConfig.java
  39. 2
      lib_base/src/main/java/com/android/base/app/fragment/tools/FragmentInfo.java
  40. 8
      lib_base/src/main/java/com/android/base/app/fragment/tools/Fragments.kt
  41. 5
      lib_base/src/main/java/com/android/base/app/fragment/tools/TabManager.java
  42. 4
      lib_base/src/main/java/com/android/base/app/mvp/PresenterBinder.kt
  43. 29
      lib_base/src/main/java/com/android/base/app/ui/LoadingView.java
  44. 22
      lib_base/src/main/java/com/android/base/app/ui/LoadingView.kt
  45. 9
      lib_base/src/main/java/com/android/base/app/ui/LoadingViewFactory.kt
  46. 1
      lib_base/src/main/java/com/android/base/app/ui/RefreshViewFactory.java
  47. 1
      lib_base/src/main/java/com/android/base/app/ui/SwipeRefreshView.java
  48. 25
      lib_base/src/main/java/com/android/base/data/ErrorHandler.kt

@ -0,0 +1,18 @@
package com.android.base.app
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-10-12 10:59
*/
open class InjectorBaseAppContext : BaseAppContext(), HasAndroidInjector {
@Inject lateinit var androidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector() = androidInjector
}

@ -6,9 +6,9 @@ import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import com.android.base.app.dagger.Injectable; import com.android.base.app.dagger.Injectable;
import com.android.base.app.fragment.FragmentAnimator; import com.android.base.app.fragment.animator.FragmentAnimator;
import com.android.base.app.fragment.FragmentConfig; import com.android.base.app.fragment.tools.FragmentConfig;
import com.android.base.app.fragment.LoadingViewFactory; import com.android.base.app.ui.LoadingViewFactory;
import com.android.base.app.ui.PageNumber; import com.android.base.app.ui.PageNumber;
import com.android.base.app.ui.RefreshLoadViewFactory; import com.android.base.app.ui.RefreshLoadViewFactory;
import com.android.base.app.ui.RefreshViewFactory; import com.android.base.app.ui.RefreshViewFactory;

@ -15,6 +15,6 @@ public interface ActivityDelegateOwner {
ActivityDelegate findDelegate(Predicate<ActivityDelegate> predicate); ActivityDelegate findDelegate(Predicate<ActivityDelegate> predicate);
ActivityStatus getStatus(); ActivityState getStatus();
} }

@ -1,6 +1,6 @@
package com.android.base.app.activity package com.android.base.app.activity
enum class ActivityStatus { enum class ActivityState {
INITIALIZED, INITIALIZED,
CREATE, CREATE,
START, START,

@ -13,6 +13,7 @@ import androidx.fragment.app.FragmentManager;
* 3.在Fragment中嵌套使用Fragment时请使用getSupportChildFragmentManager * 3.在Fragment中嵌套使用Fragment时请使用getSupportChildFragmentManager
* </pre> * </pre>
*/ */
@SuppressWarnings("WeakerAccess")
public class BackHandlerHelper { public class BackHandlerHelper {
/** /**

@ -1,224 +0,0 @@
package com.android.base.app.activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.android.base.utils.android.compat.AndroidVersion;
import com.github.dmstocking.optional.java.util.function.Predicate;
import org.jetbrains.annotations.NotNull;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import androidx.appcompat.app.AppCompatActivity;
import timber.log.Timber;
/**
* <pre>
* 1封装通用流程
* 2onBackPressed 事件分发优先交给 Fragment 处理
* 3提供 RxJava 的生命周期绑定
* </pre>
*
* @author Ztiany
* Date : 2016-05-04 15:40
* Email: 1169654504@qq.com
*/
public abstract class BaseActivity extends AppCompatActivity implements ActivityDelegateOwner {
private final ActivityDelegates mActivityDelegates = new ActivityDelegates(this);
private ActivityStatus mActivityStatus = ActivityStatus.INITIALIZED;
private String tag() {
return this.getClass().getSimpleName();
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Timber.tag(tag()).d("---->onCreate before call super");
initialize(savedInstanceState);
mActivityDelegates.callOnCreateBeforeSetContentView(savedInstanceState);
super.onCreate(savedInstanceState);
Timber.tag(tag()).d("---->onCreate after call super " + "bundle = " + savedInstanceState);
Object layout = layout();
if (layout instanceof View) {
setContentView((View) layout);
} else if (layout instanceof Integer) {
setContentView((Integer) layout);
} else if (layout == null) {
Timber.d("layout() return null layout");
} else {
throw new IllegalArgumentException("layout() return type no support, layout = " + layout);
}
mActivityStatus = ActivityStatus.CREATE;
mActivityDelegates.callOnCreateAfterSetContentView(savedInstanceState);
setupView(savedInstanceState);
}
@Override
protected void onRestart() {
Timber.tag(tag()).d("---->onRestart before call super");
super.onRestart();
Timber.tag(tag()).d("---->onRestart after call super ");
mActivityDelegates.callOnRestart();
}
@Override
protected void onStart() {
Timber.tag(tag()).d("---->onStart before call super");
super.onStart();
Timber.tag(tag()).d("---->onStart after call super");
mActivityStatus = ActivityStatus.START;
mActivityDelegates.callOnStart();
}
@Override
protected void onResume() {
Timber.tag(tag()).d("---->onResume before call super");
super.onResume();
Timber.tag(tag()).d("---->onResume after call super");
mActivityStatus = ActivityStatus.RESUME;
mActivityDelegates.callOnResume();
}
@Override
protected void onPause() {
Timber.tag(tag()).d("---->onPause before call super");
mActivityStatus = ActivityStatus.PAUSE;
mActivityDelegates.callOnPause();
super.onPause();
Timber.tag(tag()).d("---->onPause after call super ");
}
@Override
protected void onStop() {
Timber.tag(tag()).d("---->onStop before call super");
mActivityStatus = ActivityStatus.STOP;
mActivityDelegates.callOnStop();
super.onStop();
Timber.tag(tag()).d("---->onStop after call super");
}
@Override
protected void onDestroy() {
Timber.tag(tag()).d("---->onDestroy before call super");
mActivityStatus = ActivityStatus.DESTROY;
mActivityDelegates.callOnDestroy();
super.onDestroy();
Timber.tag(tag()).d("---->onDestroy after call super");
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mActivityDelegates.callOnPostCreate(savedInstanceState);
}
@Override
protected void onSaveInstanceState(@NotNull Bundle outState) {
super.onSaveInstanceState(outState);
mActivityDelegates.callOnSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mActivityDelegates.callOnRestoreInstanceState(savedInstanceState);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mActivityDelegates.callOnActivityResult(requestCode, resultCode, data);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
mActivityDelegates.callOnRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
mActivityDelegates.callOnResumeFragments();
}
///////////////////////////////////////////////////////////////////////////
// interface impl
///////////////////////////////////////////////////////////////////////////
@UiThread
@Override
public final void addDelegate(@NonNull ActivityDelegate activityDelegate) {
mActivityDelegates.addActivityDelegate(activityDelegate);
}
@SuppressWarnings("unused")
@UiThread
@Override
public final boolean removeDelegate(@NonNull ActivityDelegate activityDelegate) {
return mActivityDelegates.removeActivityDelegate(activityDelegate);
}
@Override
public ActivityDelegate findDelegate(Predicate<ActivityDelegate> predicate) {
return mActivityDelegates.findDelegate(predicate);
}
@Override
public ActivityStatus getStatus() {
return mActivityStatus;
}
/**
* Before call super.onCreate and setContentView
*
* @param savedInstanceState state
*/
protected void initialize(@Nullable Bundle savedInstanceState) {
}
/**
* provide a layoutId (int) or layout (View)
*
* @return layoutId
*/
@Nullable
protected abstract Object layout();
/**
* after setContentView
*/
protected abstract void setupView(@Nullable Bundle savedInstanceState);
@Override
public void onBackPressed() {
if (BackHandlerHelper.handleBackPress(this)) {
Timber.d("onBackPressed() called but child fragment handle it");
} else {
superOnBackPressed();
}
}
protected void superOnBackPressed() {
super.onBackPressed();
}
@Override
public boolean isDestroyed() {
if (AndroidVersion.atLeast(17)) {
return super.isDestroyed();
} else {
return getStatus() == ActivityStatus.DESTROY;
}
}
}

@ -0,0 +1,190 @@
package com.android.base.app.activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.android.base.rx.AutoDisposeLifecycleOwnerEx
import com.android.base.utils.android.compat.AndroidVersion
import com.github.dmstocking.optional.java.util.function.Predicate
import timber.log.Timber
/**
* 基础 BaseActivity 封装
*
* 1. 封装通用流程
* 2. [onBackPressed] 事件分发优先交给 [Fragment] 处理
* 3. 提供 RxJava 的生命周期绑定
*
* @author Ztiany
* Date : 2016-05-04 15:40
* Email: 1169654504@qq.com
*/
abstract class BaseActivity : AppCompatActivity(), ActivityDelegateOwner, AutoDisposeLifecycleOwnerEx {
@Suppress("LeakingThis")
private val activityDelegates = ActivityDelegates(this)
private var activityState = ActivityState.INITIALIZED
private fun tag() = this.javaClass.simpleName
override fun onCreate(savedInstanceState: Bundle?) {
Timber.tag(tag()).d("---->onCreate before call super")
initialize(savedInstanceState)
activityDelegates.callOnCreateBeforeSetContentView(savedInstanceState)
super.onCreate(savedInstanceState)
Timber.tag(tag()).d("---->onCreate after call super bundle = $savedInstanceState")
when (val layout = layout()) {
is View -> setContentView(layout)
is Int -> setContentView(layout)
null -> Timber.d("layout() return null layout")
else -> throw IllegalArgumentException("layout() return type no support, layout = $layout")
}
activityState = ActivityState.CREATE
activityDelegates.callOnCreateAfterSetContentView(savedInstanceState)
setupView(savedInstanceState)
}
override fun onRestart() {
Timber.tag(tag()).d("---->onRestart before call super")
super.onRestart()
Timber.tag(tag()).d("---->onRestart after call super ")
activityDelegates.callOnRestart()
}
override fun onStart() {
Timber.tag(tag()).d("---->onStart before call super")
super.onStart()
Timber.tag(tag()).d("---->onStart after call super")
activityState = ActivityState.START
activityDelegates.callOnStart()
}
override fun onResume() {
Timber.tag(tag()).d("---->onResume before call super")
super.onResume()
Timber.tag(tag()).d("---->onResume after call super")
activityState = ActivityState.RESUME
activityDelegates.callOnResume()
}
override fun onPause() {
Timber.tag(tag()).d("---->onPause before call super")
activityState = ActivityState.PAUSE
activityDelegates.callOnPause()
super.onPause()
Timber.tag(tag()).d("---->onPause after call super ")
}
override fun onStop() {
Timber.tag(tag()).d("---->onStop before call super")
activityState = ActivityState.STOP
activityDelegates.callOnStop()
super.onStop()
Timber.tag(tag()).d("---->onStop after call super")
}
override fun onDestroy() {
Timber.tag(tag()).d("---->onDestroy before call super")
activityState = ActivityState.DESTROY
activityDelegates.callOnDestroy()
super.onDestroy()
Timber.tag(tag()).d("---->onDestroy after call super")
}
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
activityDelegates.callOnPostCreate(savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
activityDelegates.callOnSaveInstanceState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
activityDelegates.callOnRestoreInstanceState(savedInstanceState)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
activityDelegates.callOnActivityResult(requestCode, resultCode, data)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
activityDelegates.callOnRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onResumeFragments() {
super.onResumeFragments()
activityDelegates.callOnResumeFragments()
}
///////////////////////////////////////////////////////////////////////////
// interface impl
///////////////////////////////////////////////////////////////////////////
@UiThread
override fun addDelegate(activityDelegate: ActivityDelegate<*>) {
activityDelegates.addActivityDelegate(activityDelegate)
}
@UiThread
override fun removeDelegate(activityDelegate: ActivityDelegate<*>): Boolean {
return activityDelegates.removeActivityDelegate(activityDelegate)
}
override fun findDelegate(predicate: Predicate<ActivityDelegate<*>?>?): ActivityDelegate<*>? {
return activityDelegates.findDelegate(predicate)
}
override fun getStatus(): ActivityState {
return activityState
}
/**
* Before call super.onCreate and setContentView
*
* @param savedInstanceState state
*/
protected open fun initialize(savedInstanceState: Bundle?) {}
/**
* provide a layoutId (int) or layout (View)
*
* @return layoutId
*/
protected abstract fun layout(): Any?
/**
* after setContentView
*/
protected abstract fun setupView(savedInstanceState: Bundle?)
override fun onBackPressed() {
if (BackHandlerHelper.handleBackPress(this)) {
Timber.d("onBackPressed() called but child fragment handle it")
} else {
superOnBackPressed()
}
}
protected open fun superOnBackPressed() {
super.onBackPressed()
}
override fun isDestroyed(): Boolean {
return if (AndroidVersion.atLeast(17)) {
super.isDestroyed()
} else {
status === ActivityState.DESTROY
}
}
}

@ -0,0 +1,26 @@
package com.android.base.app.activity;
import com.android.base.app.dagger.Injectable;
import javax.inject.Inject;
import dagger.android.AndroidInjector;
import dagger.android.DispatchingAndroidInjector;
import dagger.android.HasAndroidInjector;
/**
* @author Ztiany
* Email: 1169654504@qq.com
* Date : 2018-11-01
*/
public abstract class InjectorBaseActivity extends BaseActivity implements Injectable, HasAndroidInjector {
@Inject
DispatchingAndroidInjector<Object> androidInjector;
@Override
public AndroidInjector<Object> androidInjector() {
return androidInjector;
}
}

@ -1,280 +0,0 @@
package com.android.base.app.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.base.app.Sword;
import com.android.base.app.activity.BackHandlerHelper;
import com.android.base.app.activity.OnBackPressListener;
import com.android.base.app.ui.LoadingView;
import com.github.dmstocking.optional.java.util.function.Predicate;
import org.jetbrains.annotations.NotNull;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.UiThread;
import androidx.appcompat.app.AppCompatDialogFragment;
import timber.log.Timber;
/**
* 提供
* <pre>
* 1. RxJava 生命周期绑定
* 2. 返回键监听
* 3. 显示 LoadingDialog Message
* 4. 可以添加生命周期代理
* </pre>
*
* @author Ztiany
* date : 2016-03-19 23:09
* email: 1169654504@qq.com
*/
public class BaseDialogFragment extends AppCompatDialogFragment implements LoadingView, OnBackPressListener, FragmentDelegateOwner {
private LoadingView mLoadingViewImpl;
private View mLayoutView;
/* just for cache*/
private View mCachedView;
private final FragmentDelegates mFragmentDelegates = new FragmentDelegates(this);
private String tag() {
return this.getClass().getSimpleName();
}
@Override
public void onAttach(@NotNull Context context) {
super.onAttach(context);
Timber.tag(tag()).d("onAttach() called with: context = [" + context + "]");
mFragmentDelegates.onAttach(context);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Timber.tag(tag()).d("-->onCreate savedInstanceState = " + savedInstanceState);
mFragmentDelegates.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mCachedView == null) {
Object layout = provideLayout();
if (layout == null) {
return null;
}
if (layout instanceof Integer) {
return mCachedView = inflater.inflate((Integer) layout, container, false);
}
if (layout instanceof View) {
return mCachedView = (View) layout;
}
throw new IllegalArgumentException("Here you should provide a layout id or a View");
}
return mCachedView;
}
/**
* 使用此方法提供的布局将只会被缓存起来即此方法将只会被调用一次
*
* @return provide a layout id or a View
*/
@Nullable
@SuppressWarnings("unused")
protected Object provideLayout() {
return null;
}
@Override
public final void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Timber.tag(tag()).d("-->onViewCreated savedInstanceState = " + savedInstanceState);
if (mLayoutView != view) {
mLayoutView = view;
internalOnViewPrepared(view, savedInstanceState);
onViewPrepared(view, savedInstanceState);
}
mFragmentDelegates.onViewCreated(view, savedInstanceState);
}
void internalOnViewPrepared(@NonNull View view, @Nullable Bundle savedInstanceState) {
}
/**
* View is prepared, If {@link androidx.fragment.app.Fragment#onCreateView(LayoutInflater, ViewGroup, Bundle)} return same layout, it will be called once
*
* @param view view of fragment
*/
protected void onViewPrepared(@NonNull View view, @Nullable Bundle savedInstanceState) {
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Timber.tag(tag()).d("-->onActivityCreated savedInstanceState = " + savedInstanceState);
mFragmentDelegates.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
Timber.tag(tag()).d("-->onStart");
mFragmentDelegates.onStart();
}
@Override
public void onResume() {
super.onResume();
Timber.tag(tag()).d("-->onResume");
mFragmentDelegates.onResume();
}
@Override
public void onPause() {
Timber.tag(tag()).d("-->onPause");
mFragmentDelegates.onPause();
super.onPause();
}
@Override
public void onStop() {
Timber.tag(tag()).d("-->onStop");
mFragmentDelegates.onStop();
super.onStop();
}
@Override
public void onDestroyView() {
Timber.tag(tag()).d("-->onDestroyView");
mFragmentDelegates.onDestroyView();
super.onDestroyView();
}
@Override
public void onDestroy() {
Timber.tag(tag()).d("-->onDestroy");
mFragmentDelegates.onDestroy();
super.onDestroy();
dismissLoadingDialog();
}
@Override
public void onDetach() {
Timber.tag(tag()).d("-->onDetach");
mFragmentDelegates.onDetach();
super.onDetach();
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
mFragmentDelegates.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Timber.tag(tag()).d("-->setUserVisibleHint ==" + isVisibleToUser);
mFragmentDelegates.setUserVisibleHint(isVisibleToUser);
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
Timber.tag(tag()).d("-->onHiddenChanged = " + hidden);
mFragmentDelegates.onHiddenChanged(hidden);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
mFragmentDelegates.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mFragmentDelegates.onActivityResult(requestCode, resultCode, data);
}
@Override
@UiThread
public final void addDelegate(FragmentDelegate fragmentDelegate) {
mFragmentDelegates.addDelegate(fragmentDelegate);
}
@Override
@UiThread
public final boolean removeDelegate(FragmentDelegate fragmentDelegate) {
return mFragmentDelegates.removeDelegate(fragmentDelegate);
}
@Override
public FragmentDelegate findDelegate(Predicate<FragmentDelegate> predicate) {
return mFragmentDelegates.findDelegate(predicate);
}
@Override
public boolean onBackPressed() {
return handleBackPress() || BackHandlerHelper.handleBackPress(this);
}
/**
* Fragment需要自己处理BackPress事件如果不处理就交给子Fragment处理都不处理则由Activity处理
*/
protected boolean handleBackPress() {
return false;
}
private LoadingView getLoadingViewImpl() {
if (mLoadingViewImpl == null) {
mLoadingViewImpl = Sword.get().getLoadingViewFactory().createLoadingDelegate(getContext());
}
return mLoadingViewImpl;
}
@Override
public void showLoadingDialog() {
getLoadingViewImpl().showLoadingDialog(true);
}
@Override
public void showLoadingDialog(boolean cancelable) {
getLoadingViewImpl().showLoadingDialog(cancelable);
}
@Override
public void showLoadingDialog(CharSequence message, boolean cancelable) {
getLoadingViewImpl().showLoadingDialog(message, cancelable);
}
@Override
public void showLoadingDialog(@StringRes int messageId, boolean cancelable) {
getLoadingViewImpl().showLoadingDialog(messageId, cancelable);
}
@Override
public void dismissLoadingDialog() {
getLoadingViewImpl().dismissLoadingDialog();
}
@Override
public void showMessage(CharSequence message) {
getLoadingViewImpl().showMessage(message);
}
@Override
public void showMessage(@StringRes int messageId) {
getLoadingViewImpl().showMessage(messageId);
}
}

@ -0,0 +1,250 @@
package com.android.base.app.fragment
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.StringRes
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatDialogFragment
import com.android.base.app.Sword
import com.android.base.app.activity.BackHandlerHelper
import com.android.base.app.activity.OnBackPressListener
import com.android.base.app.fragment.delegates.FragmentDelegate
import com.android.base.app.fragment.delegates.FragmentDelegateOwner
import com.android.base.app.ui.LoadingView
import com.android.base.rx.AutoDisposeLifecycleOwnerEx
import com.github.dmstocking.optional.java.util.function.Predicate
import timber.log.Timber
/**
* @author Ztiany
* date : 2016-03-19 23:09
* email: 1169654504@qq.com
* @see [BaseFragment]
*/
open class BaseDialogFragment : AppCompatDialogFragment(), LoadingView, OnBackPressListener, FragmentDelegateOwner, AutoDisposeLifecycleOwnerEx {
private var loadingView: LoadingView? = null
private var layoutView: View? = null
/** just for cache*/
private var cachedView: View? = null
@Suppress("LeakingThis")
private val fragmentDelegates = FragmentDelegates(this)
private fun tag() = this.javaClass.simpleName
override fun onAttach(context: Context) {
super.onAttach(context)
Timber.tag(tag()).d("onAttach() called with: context = [$context]")
fragmentDelegates.onAttach(context)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Timber.tag(tag()).d("-->onCreate savedInstanceState = $savedInstanceState")
fragmentDelegates.onCreate(savedInstanceState)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
if (cachedView == null) {
val layout = provideLayout() ?: return null
if (layout is Int) {
return inflater.inflate(layout, container, false).also { cachedView = it }
}
if (layout is View) {
cachedView = layout
return layout
}
throw IllegalArgumentException("Here you should provide a layout id or a View")
}
Timber.tag(tag()).d("mCachedView.parent: " + cachedView?.parent)
cachedView?.run {
val viewParent = parent
if (viewParent != null && viewParent is ViewGroup) {
viewParent.removeView(this)
}
}
return cachedView
}
/**
* 使用此方法提供的布局将只会被缓存起来即此方法将只会被调用一次
*
* @return provide a layout id or a View
*/
protected open fun provideLayout(): Any? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Timber.tag(tag()).d("-->onViewCreated savedInstanceState = %s", savedInstanceState)
if (layoutView !== view) {
layoutView = view
internalOnViewPrepared(view, savedInstanceState)
onViewPrepared(view, savedInstanceState)
}
fragmentDelegates.onViewCreated(view, savedInstanceState)
}
internal open fun internalOnViewPrepared(view: View, savedInstanceState: Bundle?) {}
/**
* View is prepared, If [androidx.fragment.app.Fragment.onCreateView] return same layout, it will be called once
*
* @param view view of fragment
*/
protected open fun onViewPrepared(view: View, savedInstanceState: Bundle?) {}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
Timber.tag(tag()).d("-->onActivityCreated savedInstanceState = $savedInstanceState")
fragmentDelegates.onActivityCreated(savedInstanceState)
}
override fun onStart() {
super.onStart()
Timber.tag(tag()).d("-->onStart")
fragmentDelegates.onStart()
}
override fun onResume() {
super.onResume()
Timber.tag(tag()).d("-->onResume")
fragmentDelegates.onResume()
}
override fun onPause() {
Timber.tag(tag()).d("-->onPause")
fragmentDelegates.onPause()
super.onPause()
}
override fun onStop() {
Timber.tag(tag()).d("-->onStop")
fragmentDelegates.onStop()
super.onStop()
}
override fun onDestroyView() {
Timber.tag(tag()).d("-->onDestroyView")
fragmentDelegates.onDestroyView()
super.onDestroyView()
}
override fun onDestroy() {
Timber.tag(tag()).d("-->onDestroy")
fragmentDelegates.onDestroy()
super.onDestroy()
dismissLoadingDialog()
}
override fun onDetach() {
Timber.tag(tag()).d("-->onDetach")
fragmentDelegates.onDetach()
super.onDetach()
}
override fun onSaveInstanceState(outState: Bundle) {
fragmentDelegates.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
Timber.tag(tag()).d("-->setUserVisibleHint ==$isVisibleToUser")
fragmentDelegates.setUserVisibleHint(isVisibleToUser)
}
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
Timber.tag(tag()).d("-->onHiddenChanged = $hidden")
fragmentDelegates.onHiddenChanged(hidden)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
fragmentDelegates.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
fragmentDelegates.onActivityResult(requestCode, resultCode, data)
}
@UiThread
override fun addDelegate(fragmentDelegate: FragmentDelegate<*>?) {
fragmentDelegates.addDelegate(fragmentDelegate)
}
@UiThread
override fun removeDelegate(fragmentDelegate: FragmentDelegate<*>?): Boolean {
return fragmentDelegates.removeDelegate(fragmentDelegate)
}
override fun findDelegate(predicate: Predicate<FragmentDelegate<*>?>?): FragmentDelegate<*>? {
return fragmentDelegates.findDelegate(predicate)
}
final override fun onBackPressed(): Boolean {
return handleBackPress() || BackHandlerHelper.handleBackPress(this)
}
/**
* Fragment需要自己处理BackPress事件如果不处理就交给子Fragment处理都不处理则由Activity处理
*/
protected open fun handleBackPress(): Boolean {
return false
}
private fun loadingView(): LoadingView? {
val loadingViewImpl = loadingView
if (loadingViewImpl == null) {
loadingView = onCreateLoadingView()
}
if (loadingViewImpl == null) {
loadingView = Sword.get().loadingViewFactory.createLoadingDelegate(requireContext())
}
return loadingViewImpl
}
protected open fun onCreateLoadingView(): LoadingView? {
return null
}
override fun showLoadingDialog() {
loadingView()?.showLoadingDialog(true)
}
override fun showLoadingDialog(cancelable: Boolean) {
loadingView()?.showLoadingDialog(cancelable)
}
override fun showLoadingDialog(message: CharSequence, cancelable: Boolean) {
loadingView()?.showLoadingDialog(message, cancelable)
}
override fun showLoadingDialog(@StringRes messageId: Int, cancelable: Boolean) {
loadingView()?.showLoadingDialog(messageId, cancelable)
}
override fun dismissLoadingDialog() {
loadingView()?.dismissLoadingDialog()
}
override fun showMessage(message: CharSequence) {
loadingView()?.showMessage(message)
}
override fun showMessage(@StringRes messageId: Int) {
loadingView()?.showMessage(messageId)
}
}

@ -13,7 +13,12 @@ import androidx.fragment.app.Fragment
import com.android.base.app.Sword import com.android.base.app.Sword
import com.android.base.app.activity.BackHandlerHelper import com.android.base.app.activity.BackHandlerHelper
import com.android.base.app.activity.OnBackPressListener import com.android.base.app.activity.OnBackPressListener
import com.android.base.app.fragment.animator.FragmentAnimatorHelper
import com.android.base.app.fragment.delegates.FragmentDelegate
import com.android.base.app.fragment.delegates.FragmentDelegateOwner
import com.android.base.app.fragment.tools.FragmentConfig
import com.android.base.app.ui.LoadingView import com.android.base.app.ui.LoadingView
import com.android.base.rx.AutoDisposeLifecycleOwnerEx
import com.github.dmstocking.optional.java.util.function.Predicate import com.github.dmstocking.optional.java.util.function.Predicate
import timber.log.Timber import timber.log.Timber
@ -29,7 +34,7 @@ import timber.log.Timber
* date : 2016-03-19 23:09 * date : 2016-03-19 23:09
* email: 1169654504@qq.com * email: 1169654504@qq.com
*/ */
open class BaseFragment : Fragment(), LoadingView, OnBackPressListener, FragmentDelegateOwner { open class BaseFragment : Fragment(), LoadingView, OnBackPressListener, FragmentDelegateOwner, AutoDisposeLifecycleOwnerEx {
private var loadingView: LoadingView? = null private var loadingView: LoadingView? = null
@ -216,7 +221,7 @@ open class BaseFragment : Fragment(), LoadingView, OnBackPressListener, Fragment
loadingView = onCreateLoadingView() loadingView = onCreateLoadingView()
} }
if (loadingViewImpl == null) { if (loadingViewImpl == null) {
loadingView = Sword.get().loadingViewFactory.createLoadingDelegate(context) loadingView = Sword.get().loadingViewFactory.createLoadingDelegate(requireContext())
} }
return loadingViewImpl return loadingViewImpl
} }
@ -255,9 +260,9 @@ open class BaseFragment : Fragment(), LoadingView, OnBackPressListener, Fragment
override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
if (fragmentAnimatorHelper == null) { if (fragmentAnimatorHelper == null) {
fragmentAnimatorHelper = FragmentAnimatorHelper(context, FragmentConfig.defaultFragmentAnimator()) fragmentAnimatorHelper = FragmentAnimatorHelper(requireContext(), FragmentConfig.defaultFragmentAnimator())
} }
return fragmentAnimatorHelper!!.onCreateAnimation(transit, enter) return fragmentAnimatorHelper?.onCreateAnimation(transit, enter)
} }
} }

@ -0,0 +1,89 @@
package com.android.base.app.fragment
import android.os.Bundle
import androidx.recyclerview.widget.RecyclerView.Adapter
import com.android.base.adapter.DataManager
import com.android.base.app.ui.AutoPageNumber
import com.android.base.app.ui.PageNumber
import com.android.base.app.ui.RefreshListLayout
import com.ztiany.loadmore.adapter.ILoadMore
import com.ztiany.loadmore.adapter.OnLoadMoreListener
import com.ztiany.loadmore.adapter.WrapperAdapter
/**
* @author Ztiany
* date : 2016-03-19 23:09
* email: 1169654504@qq.com
* @see [BaseListFragment]
*/
abstract class BaseListDialogFragment<T> : BaseStateDialogFragment(), RefreshListLayout<T> {
/**加载更多*/
private var loadMore: ILoadMore? = null
/**列表数据管理*/
private lateinit var dataManager: DataManager<T>
/**分页页码*/
private var pageNumber: PageNumber? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
if (!::dataManager.isInitialized) {
throw NullPointerException("you need set DataManager")
}
}
protected fun setDataManager(dataManager: DataManager<T>) {
this.dataManager = dataManager
}
protected fun setupLoadMore(recyclerAdapter: Adapter<*>, pageNumber: PageNumber = AutoPageNumber(this, dataManager)): Adapter<*> {
this.pageNumber = pageNumber
return WrapperAdapter.wrap(recyclerAdapter).apply {
setOnLoadMoreListener(object : OnLoadMoreListener {
override fun onLoadMore() {
this@BaseListDialogFragment.onLoadMore()
}
override fun canLoadMore(): Boolean {
return !isRefreshing
}
})
loadMore = this
}
}
/**call by [.onRefresh] or [.onLoadMore], you can get current loading type from [.isRefreshing] or [.isLoadingMore].*/
protected open fun onStartLoad() {}
override fun onRefresh() = onStartLoad()
protected fun onLoadMore() = onStartLoad()
override fun canRefresh() = !isLoadingMore
override fun replaceData(data: List<T>) = dataManager.replaceAll(data)
override fun addData(data: List<T>) = dataManager.addItems(data)
override fun isEmpty(): Boolean = dataManager.isEmpty
override fun isLoadingMore(): Boolean = loadMore != null && loadMore?.isLoadingMore ?: false
override fun getPager(): PageNumber = pageNumber
?: throw NullPointerException("you need to call setupLoadMore to init pageNumber")
fun loadMoreController(): ILoadMore = loadMore
?: throw NullPointerException("you need to call setupLoadMore to init loadMoreController")
override fun loadMoreCompleted(hasMore: Boolean) {
loadMore?.loadCompleted(hasMore)
}
override fun loadMoreFailed() {
loadMore?.loadFail()
}
}

@ -0,0 +1,119 @@
package com.android.base.app.fragment
import android.os.Bundle
import android.view.View
import com.android.base.adapter.DataManager
import com.android.base.app.ui.AutoPageNumber
import com.android.base.app.ui.RefreshListLayout
import com.android.base.app.ui.StateLayoutConfig
/**
* 区别于 [BaseListFragment] 只能支持 RecyclerView[BaseListFragment] 采用包装 [androidx.recyclerview.widget.RecyclerView.Adapter] 的方式
* 在底部添加 load more view item来实现加载更多[BaseListV2DialogFragment] 没有采用此种方式所以你使用的 RefreshView 应该是支持这下来刷新和加载更多功能的
*
* 在调用 [BaseListV2DialogFragment] [onActivityCreated] 之前你应该设置好 [dataManager]
*
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-03-26 15:06
*/
abstract class BaseListV2DialogFragment<T> : BaseFragment(), RefreshListLayout<T> {
private lateinit var stateLayout: RefreshLoadMoreStateLayoutImpl
protected open lateinit var dataManager: DataManager<T>
override fun internalOnViewPrepared(view: View, savedInstanceState: Bundle?) {
stateLayout = RefreshLoadMoreStateLayoutImpl.init(view)
stateLayout.refreshView.setRefreshHandler {
onRefresh()
}
stateLayout.refreshView.setLoadMoreHandler {
onLoadMore()
}
stateLayout.setStateRetryListener(this::onRetry)
}
protected open fun onRetry(state: Int) {
if (!isRefreshing) {
autoRefresh()
}
}
protected open fun onRefresh() = onStartLoad()
protected open fun onLoadMore() = onStartLoad()
/** call by [onRefresh] or [onLoadMore], you can get current loading type from [isRefreshing] or [isLoadingMore]. */
protected open fun onStartLoad() {}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
if (!::dataManager.isInitialized) {
throw NullPointerException("you need set DataManager")
}
}
override fun onDestroyView() {
super.onDestroyView()
refreshCompleted()
}
override fun replaceData(data: MutableList<T>?) {
dataManager.replaceAll(data)
}
override fun addData(data: MutableList<T>?) {
dataManager.addItems(data)
}
fun setRefreshEnable(enable: Boolean) = stateLayout.refreshView.setRefreshEnable(enable)
fun setLoadMoreEnable(enable: Boolean) = stateLayout.refreshView.setLoadMoreEnable(enable)
override fun getPager() = AutoPageNumber(this, dataManager)
override fun isEmpty() = dataManager.isEmpty
override fun loadMoreCompleted(hasMore: Boolean) = stateLayout.refreshView.loadMoreCompleted(hasMore)
override fun loadMoreFailed() = stateLayout.refreshView.loadMoreFailed()
override fun isRefreshing() = stateLayout.refreshView.isRefreshing
override fun showContentLayout() = stateLayout.showContentLayout()
override fun showLoadingLayout() = stateLayout.showLoadingLayout()
override fun refreshCompleted() = stateLayout.refreshView.refreshCompleted()
override fun showEmptyLayout() = stateLayout.showEmptyLayout()
override fun showErrorLayout() = stateLayout.showErrorLayout()
override fun showRequesting() = stateLayout.showRequesting()
override fun showBlank() = stateLayout.showBlank()
override fun getStateLayoutConfig() = stateLayout.stateLayoutConfig
override fun autoRefresh() = stateLayout.refreshView.autoRefresh()
override fun showNetErrorLayout() = stateLayout.showNetErrorLayout()
override fun showServerErrorLayout() = stateLayout.showServerErrorLayout()
override fun isLoadingMore() = stateLayout.refreshView.isLoadingMore
override fun currentStatus() = stateLayout.currentStatus()
companion object {
const val CONTENT = StateLayoutConfig.CONTENT
const val LOADING = StateLayoutConfig.LOADING
const val ERROR = StateLayoutConfig.ERROR
const val EMPTY = StateLayoutConfig.EMPTY
const val NET_ERROR = StateLayoutConfig.NET_ERROR
const val SERVER_ERROR = StateLayoutConfig.SERVER_ERROR
}
}

@ -8,16 +8,12 @@ import com.android.base.app.ui.RefreshListLayout
import com.android.base.app.ui.StateLayoutConfig import com.android.base.app.ui.StateLayoutConfig
/** /**
* 区别于 [BaseListFragment] 只能支持 RecyclerView[BaseListFragment] 采用包装 [androidx.recyclerview.widget.RecyclerView.Adapter] 的方式
* 在底部添加 load more view item来实现加载更多BaseListV2Fragment 没有采用此种方式所以你使用的刷新视图应该是支持这下来刷新和加载更多功能的
*
* 在调用BaseListV2Fragment [onActivityCreated] 之前你应该设置好 [dataManager]
*
*@author Ztiany *@author Ztiany
* Email: ztiany3@gmail.com * Email: ztiany3@gmail.com
* Date : 2019-03-26 15:06 * Date : 2019-03-26 15:06
*@see [BaseListV2Fragment]
*/ */
abstract class BaseListV2Fragment<T> : BaseFragment(), RefreshListLayout<T> { abstract class BaseListV2Fragment<T> : BaseDialogFragment(), RefreshListLayout<T> {
private lateinit var stateLayout: RefreshLoadMoreStateLayoutImpl private lateinit var stateLayout: RefreshLoadMoreStateLayoutImpl
@ -49,7 +45,7 @@ abstract class BaseListV2Fragment<T> : BaseFragment(), RefreshListLayout<T> {
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
if (::dataManager.isInitialized) { if (!::dataManager.isInitialized) {
throw NullPointerException("you need set DataManager") throw NullPointerException("you need set DataManager")
} }
} }
@ -72,22 +68,39 @@ abstract class BaseListV2Fragment<T> : BaseFragment(), RefreshListLayout<T> {
fun setLoadMoreEnable(enable: Boolean) = stateLayout.refreshView.setLoadMoreEnable(enable) fun setLoadMoreEnable(enable: Boolean) = stateLayout.refreshView.setLoadMoreEnable(enable)
override fun getPager() = AutoPageNumber(this, dataManager) override fun getPager() = AutoPageNumber(this, dataManager)
override fun isEmpty() = dataManager.isEmpty override fun isEmpty() = dataManager.isEmpty
override fun loadMoreCompleted(hasMore: Boolean) = stateLayout.refreshView.loadMoreCompleted(hasMore) override fun loadMoreCompleted(hasMore: Boolean) = stateLayout.refreshView.loadMoreCompleted(hasMore)
override fun loadMoreFailed() = stateLayout.refreshView.loadMoreFailed() override fun loadMoreFailed() = stateLayout.refreshView.loadMoreFailed()
override fun isRefreshing() = stateLayout.refreshView.isRefreshing override fun isRefreshing() = stateLayout.refreshView.isRefreshing
override fun showContentLayout() = stateLayout.showContentLayout() override fun showContentLayout() = stateLayout.showContentLayout()
override fun showLoadingLayout() = stateLayout.showLoadingLayout() override fun showLoadingLayout() = stateLayout.showLoadingLayout()
override fun refreshCompleted() = stateLayout.refreshView.refreshCompleted() override fun refreshCompleted() = stateLayout.refreshView.refreshCompleted()
override fun showEmptyLayout() = stateLayout.showEmptyLayout() override fun showEmptyLayout() = stateLayout.showEmptyLayout()
override fun showErrorLayout() = stateLayout.showErrorLayout() override fun showErrorLayout() = stateLayout.showErrorLayout()
override fun showRequesting() = stateLayout.showRequesting() override fun showRequesting() = stateLayout.showRequesting()
override fun showBlank() = stateLayout.showBlank() override fun showBlank() = stateLayout.showBlank()
override fun getStateLayoutConfig() = stateLayout.stateLayoutConfig override fun getStateLayoutConfig() = stateLayout.stateLayoutConfig
override fun autoRefresh() = stateLayout.refreshView.autoRefresh() override fun autoRefresh() = stateLayout.refreshView.autoRefresh()
override fun showNetErrorLayout() = stateLayout.showNetErrorLayout() override fun showNetErrorLayout() = stateLayout.showNetErrorLayout()
override fun showServerErrorLayout() = stateLayout.showServerErrorLayout() override fun showServerErrorLayout() = stateLayout.showServerErrorLayout()
override fun isLoadingMore() = stateLayout.refreshView.isLoadingMore override fun isLoadingMore() = stateLayout.refreshView.isLoadingMore
override fun currentStatus() = stateLayout.currentStatus() override fun currentStatus() = stateLayout.currentStatus()
companion object { companion object {

@ -1,151 +0,0 @@
package com.android.base.app.fragment;
import android.os.Bundle;
import android.view.View;
import com.android.base.app.ui.RefreshStateLayout;
import com.android.base.app.ui.RefreshView;
import com.android.base.app.ui.StateLayoutConfig;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* @author Ztiany
* date : 2016-03-19 23:09
* email: 1169654504@qq.com
* @see BaseStateFragment
*/
@SuppressWarnings("unused")
public abstract class BaseStateDialogFragment extends BaseDialogFragment implements RefreshStateLayout {
private RefreshableStateLayoutImpl mStateLayout;
protected static final int CONTENT = StateLayoutConfig.CONTENT;
protected static final int LOADING = StateLayoutConfig.LOADING;
protected static final int ERROR = StateLayoutConfig.ERROR;
protected static final int EMPTY = StateLayoutConfig.EMPTY;
protected static final int NET_ERROR = StateLayoutConfig.NET_ERROR;
protected static final int SERVER_ERROR = StateLayoutConfig.SERVER_ERROR;
@Override
void internalOnViewPrepared(@NonNull View view, @Nullable Bundle savedInstanceState) {
mStateLayout = RefreshableStateLayoutImpl.init(view);
mStateLayout.setRefreshHandler(new RefreshView.RefreshHandler() {
@Override
public void onRefresh() {
BaseStateDialogFragment.this.onRefresh();
}
@Override
public boolean canRefresh() {
return BaseStateDialogFragment.this.canRefresh();
}
});
mStateLayout.setStateRetryListenerUnchecked(this::onRetry);
}
@Override
public void onDestroyView() {
super.onDestroyView();
refreshCompleted();
}
boolean canRefresh() {
return true;
}
final RefreshView getRefreshView() {
return mStateLayout.getRefreshView();
}
protected void onRetry(@StateLayoutConfig.RetryableState int state) {
if (getRefreshView() != null) {
if (!getRefreshView().isRefreshing()) {
autoRefresh();
}
} else {
onRefresh();
}
}
public final void setRefreshEnable(boolean enable) {
if (getRefreshView() != null) {
getRefreshView().setRefreshEnable(enable);
}
}
protected void onRefresh() {
}
@Override
public final StateLayoutConfig getStateLayoutConfig() {
return mStateLayout.getStateLayoutConfig();
}
private RefreshStateLayout getStateLayout() {
return mStateLayout;
}
@Override
public final boolean isRefreshing() {
return mStateLayout.isRefreshing();
}
@Override
public void refreshCompleted() {
getStateLayout().refreshCompleted();
}
@Override
public void autoRefresh() {
getStateLayout().autoRefresh();
}
@Override
public void showContentLayout() {
getStateLayout().showContentLayout();
}
@Override
public void showLoadingLayout() {
getStateLayout().showLoadingLayout();
}
@Override
public void showEmptyLayout() {
getStateLayout().showEmptyLayout();
}
@Override
public void showErrorLayout() {
getStateLayout().showErrorLayout();
}
@Override
public void showRequesting() {
getStateLayout().showRequesting();
}
@Override
public void showBlank() {
getStateLayout().showBlank();
}
@Override
public void showNetErrorLayout() {
getStateLayout().showNetErrorLayout();
}
@Override
public void showServerErrorLayout() {
getStateLayout().showServerErrorLayout();
}
@Override
public int currentStatus() {
return mStateLayout.currentStatus();
}
}

@ -0,0 +1,94 @@
package com.android.base.app.fragment
import android.os.Bundle
import android.view.View
import com.android.base.app.ui.RefreshStateLayout
import com.android.base.app.ui.RefreshView
import com.android.base.app.ui.StateLayoutConfig
import com.android.base.utils.common.ifNonNull
import com.android.base.utils.common.otherwise
/**
* @author Ztiany
* date : 2016-03-19 23:09
* email: 1169654504@qq.com
* @see BaseStateFragment
*/
abstract class BaseStateDialogFragment : BaseDialogFragment(), RefreshStateLayout {
private lateinit var stateLayout: RefreshableStateLayoutImpl
override fun internalOnViewPrepared(view: View, savedInstanceState: Bundle?) {
stateLayout = RefreshableStateLayoutImpl.init(view)
stateLayout.setRefreshHandler(object : RefreshView.RefreshHandler() {
override fun onRefresh() {
this@BaseStateDialogFragment.onRefresh()
}
override fun canRefresh(): Boolean {
return this@BaseStateDialogFragment.canRefresh()
}
})
stateLayout.setStateRetryListenerUnchecked { state -> onRetry(state) }
}
override fun onDestroyView() {
super.onDestroyView()
refreshCompleted()
}
internal open fun canRefresh() = true
private val refreshView: RefreshView?
get() = stateLayout.refreshView
protected open fun onRetry(@StateLayoutConfig.RetryableState state: Int) {
refreshView.ifNonNull {
if (this.isRefreshing) {
autoRefresh()
}
} otherwise {
onRefresh()
}
}
protected open fun onRefresh() {}
fun setRefreshEnable(enable: Boolean) = refreshView?.setRefreshEnable(enable)
override fun getStateLayoutConfig(): StateLayoutConfig = stateLayout.stateLayoutConfig
override fun isRefreshing() = stateLayout.isRefreshing
override fun refreshCompleted() = stateLayout.refreshCompleted()
override fun autoRefresh() = stateLayout.autoRefresh()
override fun showContentLayout() = stateLayout.showContentLayout()
override fun showLoadingLayout() = stateLayout.showLoadingLayout()
override fun showEmptyLayout() = stateLayout.showEmptyLayout()
override fun showErrorLayout() = stateLayout.showErrorLayout()
override fun showRequesting() = stateLayout.showRequesting()
override fun showBlank() = stateLayout.showBlank()
override fun showNetErrorLayout() = stateLayout.showNetErrorLayout()
override fun showServerErrorLayout() = stateLayout.showServerErrorLayout()
override fun currentStatus() = stateLayout.currentStatus()
companion object {
const val CONTENT = StateLayoutConfig.CONTENT
const val LOADING = StateLayoutConfig.LOADING
const val ERROR = StateLayoutConfig.ERROR
const val EMPTY = StateLayoutConfig.EMPTY
const val NET_ERROR = StateLayoutConfig.NET_ERROR
const val SERVER_ERROR = StateLayoutConfig.SERVER_ERROR
}
}

@ -1,32 +0,0 @@
package com.android.base.app.fragment;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import com.android.base.R;
import com.android.base.utils.BaseUtils;
public class DefaultHorizontalAnimator implements FragmentAnimator {
@Override
public Animation makeOpenEnter() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_open_enter);
}
@Override
public Animation makeOpenExit() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_open_exit);
}
@Override
public Animation makeCloseEnter() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_close_enter);
}
@Override
public Animation makeCloseExit() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_close_exit);
}
}

@ -1,32 +0,0 @@
package com.android.base.app.fragment;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import com.android.base.R;
import com.android.base.utils.BaseUtils;
public class DefaultNoAnimator implements FragmentAnimator {
@Override
public Animation makeOpenEnter() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim);
}
@Override
public Animation makeOpenExit() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim);
}
@Override
public Animation makeCloseEnter() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim);
}
@Override
public Animation makeCloseExit() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim);
}
}

@ -1,56 +0,0 @@
package com.android.base.app.fragment;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.ScaleAnimation;
public class DefaultScaleAnimator implements FragmentAnimator {
private static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f);
private static final Interpolator DECELERATE_CUBIC = new DecelerateInterpolator(1.5f);
private static final int ANIM_DUR = 220;
@Override
public Animation makeOpenEnter() {
return makeOpenCloseAnimation(1.125f, 1.0f, 0, 1);
}
@Override
public Animation makeOpenExit() {
return makeOpenCloseAnimation(1.0f, .975f, 1, 0);
}
@Override
public Animation makeCloseEnter() {
return makeOpenCloseAnimation(.975f, 1.0f, 0, 1);
}
@Override
public Animation makeCloseExit() {
return makeOpenCloseAnimation(1.0f, 1.075f, 1, 0);
}
private static Animation makeOpenCloseAnimation(float startScale, float endScale, float startAlpha, float endAlpha) {
AnimationSet set = new AnimationSet(false);
ScaleAnimation scale = new ScaleAnimation(startScale, endScale, startScale, endScale,
Animation.RELATIVE_TO_SELF, .5f, Animation.RELATIVE_TO_SELF, .5f);
scale.setInterpolator(DECELERATE_QUINT);
scale.setDuration(ANIM_DUR);
set.addAnimation(scale);
AlphaAnimation alpha = new AlphaAnimation(startAlpha, endAlpha);
alpha.setInterpolator(DECELERATE_CUBIC);
alpha.setDuration(ANIM_DUR);
set.addAnimation(alpha);
return set;
}
}

@ -1,31 +0,0 @@
package com.android.base.app.fragment;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import com.android.base.R;
import com.android.base.utils.BaseUtils;
public class DefaultVerticalAnimator implements FragmentAnimator {
@Override
public Animation makeOpenEnter() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_open_enter);
}
@Override
public Animation makeOpenExit() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_open_exit);
}
@Override
public Animation makeCloseEnter() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_close_enter);
}
@Override
public Animation makeCloseExit() {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_close_exit);
}
}

@ -1,26 +0,0 @@
package com.android.base.app.fragment
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
/**
* 懒加载代理
*
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-03-08 12:50
*/
class LazyLoad(private val onPrepared: (() -> Unit)) : ReadOnlyProperty<BaseFragment, LazyDelegate> {
private lateinit var lazyDelegate: LazyDelegate
override fun getValue(thisRef: BaseFragment, property: KProperty<*>): LazyDelegate {
if (!::lazyDelegate.isInitialized) {
lazyDelegate = LazyDelegate.attach(thisRef) {
onPrepared.invoke()
}
}
return lazyDelegate
}
}

@ -1,15 +0,0 @@
package com.android.base.app.fragment;
import android.view.animation.Animation;
public interface FragmentAnimator {
Animation makeOpenEnter();
Animation makeOpenExit();
Animation makeCloseEnter();
Animation makeCloseExit();
}

@ -5,6 +5,8 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import com.android.base.app.fragment.delegates.FragmentDelegate;
import com.android.base.app.fragment.delegates.FragmentDelegateOwner;
import com.github.dmstocking.optional.java.util.function.Predicate; import com.github.dmstocking.optional.java.util.function.Predicate;
import java.util.ArrayList; import java.util.ArrayList;
@ -164,4 +166,4 @@ final class FragmentDelegates implements FragmentDelegate<Fragment>, FragmentDel
return null; return null;
} }
} }

@ -1,118 +0,0 @@
package com.android.base.app.fragment;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
/**
* <pre>
* 在ViewPager中实现懒加载的Fragment
* changed--1: Android Support 24 把setUserVisibleHint方法放到了Attach之前调用了,所以请在在构造代码块中设置LazyDelegate
* </pre>
*
* @author Ztiany
* Date : Date : 2016-05-06 15:02
* Email: 1169654504@qq.com
*/
public class LazyDelegate implements FragmentDelegate<Fragment> {
/**
* View是否准备好如果不需要绑定view数据只是加载网络数据那么该字段可以去掉
*/
private boolean mIsViewPrepared;
/**
* 滑动过来后View是否可见
*/
private boolean mIsViewVisible;
private onPreparedListener mOnPreparedListener;
private LazyDelegate() {
}
public static LazyDelegate attach(FragmentDelegateOwner delegateFragment, final onPreparedListener onPreparedListener) {
LazyDelegate delegate = new LazyDelegate();
delegate.mOnPreparedListener = onPreparedListener;
delegateFragment.addDelegate(delegate);
return delegate;
}
/**
* 在这里实现Fragment数据的缓加载.
*
* @param isVisibleToUser true表用户可见false表不可见
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if (isVisibleToUser) {
mIsViewVisible = true;
onVisible();
} else {
mIsViewVisible = false;
onInvisible();
}
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
mIsViewPrepared = true;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
lazyLoad();
}
/**
* 滑动过来后界面可见时执行
*/
@SuppressWarnings("all")
protected void onVisible() {
lazyLoad();
}
/**
* 滑动过来后界面不可见时执行
*/
@SuppressWarnings("all")
protected void onInvisible() {
}
private void lazyLoad() {
if (mIsViewPrepared && mIsViewVisible) {
notifyLazyLoad();
}
}
/**
* 懒加载数据并在此绑定View数据
*/
private void notifyLazyLoad() {
if (mOnPreparedListener != null) {
mOnPreparedListener.onPrepared();
}
}
public interface onPreparedListener {
void onPrepared();
}
public static abstract class SimpleLazyLoadListener implements onPreparedListener {
private boolean mIsCalled;
@Override
public final void onPrepared() {
if (!mIsCalled) {
onFirstLoad();
mIsCalled = true;
}
}
protected abstract void onFirstLoad();
}
}

@ -1,11 +0,0 @@
package com.android.base.app.fragment;
import android.content.Context;
import com.android.base.app.ui.LoadingView;
public interface LoadingViewFactory {
LoadingView createLoadingDelegate(Context context);
}

@ -0,0 +1,103 @@
package com.android.base.app.fragment.animator
import android.view.animation.*
import com.android.base.R
import com.android.base.utils.BaseUtils
interface FragmentAnimator {
fun makeOpenEnter(): Animation?
fun makeOpenExit(): Animation?
fun makeCloseEnter(): Animation?
fun makeCloseExit(): Animation?
}
class DefaultVerticalAnimator : FragmentAnimator {
override fun makeOpenEnter(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_open_enter)
}
override fun makeOpenExit(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_open_exit)
}
override fun makeCloseEnter(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_close_enter)
}
override fun makeCloseExit(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_close_exit)
}
}
class DefaultHorizontalAnimator : FragmentAnimator {
override fun makeOpenEnter(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_open_enter)
}
override fun makeOpenExit(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_open_exit)
}
override fun makeCloseEnter(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_close_enter)
}
override fun makeCloseExit(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_close_exit)
}
}
class DefaultNoAnimator : FragmentAnimator {
override fun makeOpenEnter(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim)
}
override fun makeOpenExit(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim)
}
override fun makeCloseEnter(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim)
}
override fun makeCloseExit(): Animation? {
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim)
}
}
class DefaultScaleAnimator : FragmentAnimator {
override fun makeOpenEnter(): Animation? {
return makeOpenCloseAnimation(1.125f, 1.0f, 0f, 1f)
}
override fun makeOpenExit(): Animation? {
return makeOpenCloseAnimation(1.0f, .975f, 1f, 0f)
}
override fun makeCloseEnter(): Animation? {
return makeOpenCloseAnimation(.975f, 1.0f, 0f, 1f)
}
override fun makeCloseExit(): Animation? {
return makeOpenCloseAnimation(1.0f, 1.075f, 1f, 0f)
}
companion object {
private val DECELERATE_QUINT: Interpolator = DecelerateInterpolator(2.5f)
private val DECELERATE_CUBIC: Interpolator = DecelerateInterpolator(1.5f)
private const val ANIM_DUR = 220
private fun makeOpenCloseAnimation(startScale: Float, endScale: Float, startAlpha: Float, endAlpha: Float): Animation {
val set = AnimationSet(false)
val scale = ScaleAnimation(startScale, endScale, startScale, endScale, Animation.RELATIVE_TO_SELF, .5f, Animation.RELATIVE_TO_SELF, .5f)
scale.interpolator = DECELERATE_QUINT
scale.duration = ANIM_DUR.toLong()
set.addAnimation(scale)
val alpha = AlphaAnimation(startAlpha, endAlpha)
alpha.interpolator = DECELERATE_CUBIC
alpha.duration = ANIM_DUR.toLong()
set.addAnimation(alpha)
return set
}
}
}

@ -1,4 +1,4 @@
package com.android.base.app.fragment; package com.android.base.app.fragment.animator;
import android.content.Context; import android.content.Context;
import android.view.animation.Animation; import android.view.animation.Animation;
@ -7,15 +7,17 @@ import android.view.animation.AnimationUtils;
import com.android.base.R; import com.android.base.R;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import timber.log.Timber;
public final class FragmentAnimatorHelper { public final class FragmentAnimatorHelper {
private Context context; private Context context;
private FragmentAnimator fragmentAnimator; private FragmentAnimator fragmentAnimator;
FragmentAnimatorHelper(Context context, FragmentAnimator fragmentAnimator) { public FragmentAnimatorHelper(Context context, FragmentAnimator fragmentAnimator) {
this.context = context; this.context = context;
this.fragmentAnimator = fragmentAnimator; this.fragmentAnimator = fragmentAnimator;
Timber.d("context %s, animator %s", context.toString(), fragmentAnimator.toString());
} }
public void changeAnimation(FragmentAnimator fragmentAnimator) { public void changeAnimation(FragmentAnimator fragmentAnimator) {
@ -83,7 +85,7 @@ public final class FragmentAnimatorHelper {
} }
} }
Animation onCreateAnimation(int transit, boolean enter) { public Animation onCreateAnimation(int transit, boolean enter) {
if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) { if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) {
if (enter) { if (enter) {
return initEnterAnim(); return initEnterAnim();

@ -1,4 +1,4 @@
package com.android.base.app.fragment; package com.android.base.app.fragment.delegates;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;

@ -1,4 +1,4 @@
package com.android.base.app.fragment; package com.android.base.app.fragment.delegates;
import com.github.dmstocking.optional.java.util.function.Predicate; import com.github.dmstocking.optional.java.util.function.Predicate;

@ -0,0 +1,124 @@
package com.android.base.app.fragment.delegates
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.android.base.app.fragment.BaseFragment
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
/**
* 用于在ViewPager中实现懒加载的Fragment
*
* - changed-1: Android Support 24 setUserVisibleHint 方法放到了Attach 之前调用了所以请在在构造代码块中设置 LazyDelegate
*
* @author Ztiany
* Date : Date : 2016-05-06 15:02
* Email: 1169654504@qq.com
*/
open class LazyDelegate private constructor() : FragmentDelegate<Fragment?> {
/** View是否准备好,如果不需要绑定view数据,只是加载网络数据,那么该字段可以去掉 */
private var mIsViewPrepared = false
/** 滑动过来后,View是否可见 */
private var mIsViewVisible = false
private var mOnPreparedListener: (() -> Unit)? = null
/**
* 在这里实现Fragment数据的缓加载.
*
* @param isVisibleToUser true 表用户可见false 表不可见
*/
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
if (isVisibleToUser) {
mIsViewVisible = true
onVisible()
} else {
mIsViewVisible = false
onInvisible()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle) {
mIsViewPrepared = true
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
lazyLoad()
}
/**
* 滑动过来后界面可见时执行
*/
protected fun onVisible() {
lazyLoad()
}
/**
* 滑动过来后界面不可见时执行
*/
protected fun onInvisible() {}
private fun lazyLoad() {
if (mIsViewPrepared && mIsViewVisible) {
notifyLazyLoad()
}
}
/**
* 懒加载数据并在此绑定View数据
*/
private fun notifyLazyLoad() {
mOnPreparedListener?.invoke()
}
companion object {
fun attach(delegateFragment: FragmentDelegateOwner, onPreparedListener: () -> Unit): LazyDelegate {
val delegate = LazyDelegate()
delegate.mOnPreparedListener = onPreparedListener
delegateFragment.addDelegate(delegate)
return delegate
}
}
}
class SimpleLazyLoadListener(private val onFirstLoad: () -> Unit) : (() -> Unit) {
private var mIsCalled = false
override fun invoke() {
if (!mIsCalled) {
onFirstLoad()
mIsCalled = true
}
}
}
/**
* 懒加载代理
*
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-03-08 12:50
*/
class LazyLoad(private val once: Boolean = true, private val onPrepared: (() -> Unit)) : ReadOnlyProperty<BaseFragment, LazyDelegate> {
private lateinit var lazyDelegate: LazyDelegate
override fun getValue(thisRef: BaseFragment, property: KProperty<*>): LazyDelegate {
if (!::lazyDelegate.isInitialized) {
lazyDelegate = if (once) {
LazyDelegate.attach(thisRef, SimpleLazyLoadListener(onPrepared))
} else {
LazyDelegate.attach(thisRef, onPrepared)
}
}
return lazyDelegate
}
}

@ -0,0 +1,29 @@
package com.android.base.app.fragment.injectable
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.android.base.data.ErrorHandler
interface InjectableEx {
val viewModelFactory: ViewModelProvider.Factory
val errorHandler: ErrorHandler
}
inline fun <reified VM : ViewModel> InjectableEx.injectViewModel(fragment: Fragment): Lazy<VM> {
return fragment.viewModels { viewModelFactory }
}
inline fun <reified VM : ViewModel> InjectableEx.injectActivityViewModel(fragment: Fragment): Lazy<VM> {
return fragment.viewModels(
ownerProducer = {
fragment.requireActivity()
}
) { viewModelFactory }
}

@ -0,0 +1,20 @@
package com.android.base.app.fragment.injectable
import androidx.lifecycle.ViewModelProvider
import com.android.base.app.dagger.Injectable
import com.android.base.app.fragment.BaseDialogFragment
import com.android.base.data.ErrorHandler
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-01-15 12:57
*/
open class InjectorBaseDialogFragment : BaseDialogFragment(), Injectable, InjectableEx {
@Inject override lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject override lateinit var errorHandler: ErrorHandler
}

@ -0,0 +1,20 @@
package com.android.base.app.fragment.injectable
import androidx.lifecycle.ViewModelProvider
import com.android.base.app.dagger.Injectable
import com.android.base.app.fragment.BaseFragment
import com.android.base.data.ErrorHandler
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-01-15 12:57
*/
open class InjectorBaseFragment : BaseFragment(), Injectable, InjectableEx {
@Inject override lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject override lateinit var errorHandler: ErrorHandler
}

@ -0,0 +1,20 @@
package com.android.base.app.fragment.injectable
import androidx.lifecycle.ViewModelProvider
import com.android.base.app.dagger.Injectable
import com.android.base.app.fragment.BaseListFragment
import com.android.base.data.ErrorHandler
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-01-15 12:57
*/
open class InjectorBaseListFragment<T> : BaseListFragment<T>(), Injectable, InjectableEx {
@Inject override lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject override lateinit var errorHandler: ErrorHandler
}

@ -0,0 +1,20 @@
package com.android.base.app.fragment.injectable
import androidx.lifecycle.ViewModelProvider
import com.android.base.app.dagger.Injectable
import com.android.base.app.fragment.BaseListV2Fragment
import com.android.base.data.ErrorHandler
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-01-15 12:57
*/
open class InjectorBaseListV2Fragment<T> : BaseListV2Fragment<T>(), Injectable, InjectableEx {
@Inject override lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject override lateinit var errorHandler: ErrorHandler
}

@ -0,0 +1,20 @@
package com.android.base.app.fragment.injectable
import androidx.lifecycle.ViewModelProvider
import com.android.base.app.dagger.Injectable
import com.android.base.app.fragment.BaseStateDialogFragment
import com.android.base.data.ErrorHandler
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-01-15 12:57
*/
open class InjectorBaseStateDialogFragment : BaseStateDialogFragment(), Injectable, InjectableEx {
@Inject override lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject override lateinit var errorHandler: ErrorHandler
}

@ -0,0 +1,20 @@
package com.android.base.app.fragment.injectable
import androidx.lifecycle.ViewModelProvider
import com.android.base.app.dagger.Injectable
import com.android.base.app.fragment.BaseStateFragment
import com.android.base.data.ErrorHandler
import javax.inject.Inject
/**
*@author Ztiany
* Email: ztiany3@gmail.com
* Date : 2019-01-15 12:57
*/
open class InjectorBaseStateFragment : BaseStateFragment(), Injectable, InjectableEx {
@Inject override lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject override lateinit var errorHandler: ErrorHandler
}

@ -1,4 +1,6 @@
package com.android.base.app.fragment; package com.android.base.app.fragment.tools;
import com.android.base.app.fragment.animator.FragmentAnimator;
/** /**
* @author Ztiany * @author Ztiany
@ -26,7 +28,7 @@ public class FragmentConfig {
sFragmentAnimator = animator; sFragmentAnimator = animator;
} }
static FragmentAnimator defaultFragmentAnimator() { public static FragmentAnimator defaultFragmentAnimator() {
return sFragmentAnimator; return sFragmentAnimator;
} }

@ -1,4 +1,4 @@
package com.android.base.app.fragment; package com.android.base.app.fragment.tools;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;

@ -1,6 +1,6 @@
@file:JvmName("Fragments") @file:JvmName("Fragments")
package com.android.base.app.fragment package com.android.base.app.fragment.tools
import android.view.View import android.view.View
@ -11,7 +11,9 @@ import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
import com.android.base.app.activity.ActivityDelegate import com.android.base.app.activity.ActivityDelegate
import com.android.base.app.activity.ActivityDelegateOwner import com.android.base.app.activity.ActivityDelegateOwner
import com.android.base.app.activity.ActivityStatus import com.android.base.app.activity.ActivityState
import com.android.base.app.fragment.delegates.FragmentDelegate
import com.android.base.app.fragment.delegates.FragmentDelegateOwner
import com.android.base.utils.common.javaClassName import com.android.base.utils.common.javaClassName
import kotlin.reflect.KClass import kotlin.reflect.KClass
@ -219,7 +221,7 @@ private class SafelyFragmentTransactionActivityDelegate : ActivityDelegate<Fragm
fun safeCommit(@NonNull activityDelegateOwner: ActivityDelegateOwner, @NonNull transaction: FragmentTransaction): Boolean { fun safeCommit(@NonNull activityDelegateOwner: ActivityDelegateOwner, @NonNull transaction: FragmentTransaction): Boolean {
val status = activityDelegateOwner.status val status = activityDelegateOwner.status
val isCommitterResumed = (status == ActivityStatus.CREATE || status == ActivityStatus.START || status == ActivityStatus.RESUME) val isCommitterResumed = (status == ActivityState.CREATE || status == ActivityState.START || status == ActivityState.RESUME)
return if (isCommitterResumed) { return if (isCommitterResumed) {
transaction.commit() transaction.commit()

@ -1,4 +1,4 @@
package com.android.base.app.fragment; package com.android.base.app.fragment.tools;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
@ -35,7 +35,6 @@ public abstract class TabManager {
/** /**
* @param operationType {@link #ATTACH_DETACH} or {@link #SHOW_HIDE} * @param operationType {@link #ATTACH_DETACH} or {@link #SHOW_HIDE}
*/ */
@SuppressWarnings("WeakerAccess")
public TabManager(Context context, FragmentManager fragmentManager, Tabs tabs, int containerId, int operationType) { public TabManager(Context context, FragmentManager fragmentManager, Tabs tabs, int containerId, int operationType) {
if (operationType != ATTACH_DETACH && operationType != SHOW_HIDE) { if (operationType != ATTACH_DETACH && operationType != SHOW_HIDE) {
throw new IllegalArgumentException("the operationType must be ATTACH_DETACH or SHOW_HIDE"); throw new IllegalArgumentException("the operationType must be ATTACH_DETACH or SHOW_HIDE");
@ -205,4 +204,4 @@ public abstract class TabManager {
} }
} }
} }

@ -3,8 +3,8 @@ package com.android.base.app.mvp
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.View import android.view.View
import com.android.base.app.fragment.FragmentDelegate import com.android.base.app.fragment.delegates.FragmentDelegate
import com.android.base.app.fragment.FragmentDelegateOwner import com.android.base.app.fragment.delegates.FragmentDelegateOwner
class PresenterBinder constructor(private val lifecycle: Lifecycle) : FragmentDelegate<Fragment> { class PresenterBinder constructor(private val lifecycle: Lifecycle) : FragmentDelegate<Fragment> {

@ -1,29 +0,0 @@
package com.android.base.app.ui;
import androidx.annotation.StringRes;
/**
* 显示通用的 LoadingDialog Message
*
* @author Ztiany
* Email: 1169654504@qq.com
* Date : 2016-12-02 15:12
*/
public interface LoadingView {
void showLoadingDialog();
void showLoadingDialog(boolean cancelable);
void showLoadingDialog(CharSequence message, boolean cancelable);
void showLoadingDialog(@StringRes int messageId, boolean cancelable);
void dismissLoadingDialog();
void showMessage(CharSequence message);
void showMessage(@StringRes int messageId);
}

@ -0,0 +1,22 @@
package com.android.base.app.ui
import androidx.annotation.StringRes
/**
* 显示通用的 LoadingDialog Message
*
* @author Ztiany
* Email: 1169654504@qq.com
* Date : 2016-12-02 15:12
*/
interface LoadingView {
fun showLoadingDialog()
fun showLoadingDialog(cancelable: Boolean)
fun showLoadingDialog(message: CharSequence, cancelable: Boolean)
fun showLoadingDialog(@StringRes messageId: Int, cancelable: Boolean)
fun dismissLoadingDialog()
fun showMessage(message: CharSequence)
fun showMessage(@StringRes messageId: Int)
}

@ -0,0 +1,9 @@
package com.android.base.app.ui
import android.content.Context
interface LoadingViewFactory {
fun createLoadingDelegate(context: Context): LoadingView
}

@ -16,7 +16,6 @@ public class RefreshViewFactory {
private static Factory sFactory; private static Factory sFactory;
public static RefreshView createRefreshView(View view) { public static RefreshView createRefreshView(View view) {
if (sFactory != null) { if (sFactory != null) {
return sFactory.createRefreshView(view); return sFactory.createRefreshView(view);
} }

@ -49,4 +49,5 @@ class SwipeRefreshView implements RefreshView {
public void setRefreshEnable(boolean enable) { public void setRefreshEnable(boolean enable) {
mSwipeRefreshLayout.setEnabled(enable); mSwipeRefreshLayout.setEnabled(enable);
} }
} }

@ -0,0 +1,25 @@
package com.android.base.data
/**
* 异常处理器
*
* @author Ztiany
* Email: ztiany3@gmail.com
* Date : 2018-11-08 16:02
*/
interface ErrorHandler {
/** 根据异常,生成一个合理的错误提示 */
fun createMessage(throwable: Throwable): CharSequence
/** 直接处理异常,比如根据 [createMessage] 方法生成的消息弹出一个 toast。 */
fun handleError(throwable: Throwable)
/** 直接处理异常,自定义消息处理*/
fun handleError(throwable: Throwable, processor: ((CharSequence) -> Unit))
/**处理全局异常,此方法仅由数据层调用,用于统一处理全局异常*/
fun handleGlobalError(throwable: Throwable)
}
Loading…
Cancel
Save