package com.uiuios.aios.base; import android.os.Bundle; import android.view.View; import androidx.annotation.CallSuper; import androidx.annotation.CheckResult; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.trello.rxlifecycle4.LifecycleProvider; import com.trello.rxlifecycle4.LifecycleTransformer; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.FragmentEvent; import com.trello.rxlifecycle4.android.RxLifecycleAndroid; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.subjects.BehaviorSubject; public abstract class BaseFragment extends Fragment implements LifecycleProvider { public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); protected boolean isViewInitiated; protected boolean isVisibleToUser; protected boolean isDataInitiated; @Override @NonNull @CheckResult public final Observable lifecycle() { return lifecycleSubject.hide(); } @Override @NonNull @CheckResult public final LifecycleTransformer bindUntilEvent(@NonNull FragmentEvent event) { return RxLifecycle.bindUntilEvent(lifecycleSubject, event); } @Override @NonNull @CheckResult public final LifecycleTransformer bindToLifecycle() { return RxLifecycleAndroid.bindFragment(lifecycleSubject); } @Override @CallSuper public void onAttach(android.app.Activity activity) { super.onAttach(activity); lifecycleSubject.onNext(FragmentEvent.ATTACH); } @Override @CallSuper public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); lifecycleSubject.onNext(FragmentEvent.CREATE); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isViewInitiated = true; prepareFetchData(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.isVisibleToUser = isVisibleToUser; prepareFetchData(); } public abstract void fetchData(); public boolean prepareFetchData() { return prepareFetchData(false); } public boolean prepareFetchData(boolean forceUpdate) { if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) { fetchData(); isDataInitiated = true; return true; } return false; } @Override @CallSuper public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW); } @Override @CallSuper public void onStart() { super.onStart(); lifecycleSubject.onNext(FragmentEvent.START); } @Override @CallSuper public void onResume() { super.onResume(); lifecycleSubject.onNext(FragmentEvent.RESUME); } @Override @CallSuper public void onPause() { lifecycleSubject.onNext(FragmentEvent.PAUSE); super.onPause(); } @Override @CallSuper public void onStop() { lifecycleSubject.onNext(FragmentEvent.STOP); super.onStop(); } @Override @CallSuper public void onDestroyView() { lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW); super.onDestroyView(); } @Override @CallSuper public void onDestroy() { lifecycleSubject.onNext(FragmentEvent.DESTROY); super.onDestroy(); } @Override @CallSuper public void onDetach() { lifecycleSubject.onNext(FragmentEvent.DETACH); super.onDetach(); } }