148 lines
3.8 KiB
Java
148 lines
3.8 KiB
Java
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<FragmentEvent> {
|
|
public final BehaviorSubject<FragmentEvent> lifecycleSubject = BehaviorSubject.create();
|
|
|
|
protected boolean isViewInitiated;
|
|
protected boolean isVisibleToUser;
|
|
protected boolean isDataInitiated;
|
|
|
|
@Override
|
|
@NonNull
|
|
@CheckResult
|
|
public final Observable<FragmentEvent> lifecycle() {
|
|
return lifecycleSubject.hide();
|
|
}
|
|
|
|
@Override
|
|
@NonNull
|
|
@CheckResult
|
|
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull FragmentEvent event) {
|
|
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
|
|
}
|
|
|
|
@Override
|
|
@NonNull
|
|
@CheckResult
|
|
public final <T> LifecycleTransformer<T> 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();
|
|
}
|
|
}
|