// Path: library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java
// public abstract class ViewModelBaseFragment<T extends IView, R extends AbstractViewModel<T>> extends Fragment implements IView {
// 
//     @NonNull
//     private final ViewModelHelper<T, R> mViewModelHelper = new ViewModelHelper<>();
// 
//     @CallSuper
//     @Override
//     public void onCreate(@Nullable final Bundle savedInstanceState) {
//         super.onCreate(savedInstanceState);
// 
//         Class<? extends AbstractViewModel<T>> viewModelClass = getViewModelClass();
//         // try to extract the ViewModel class from the implementation
//         if (viewModelClass == null) {
//             //noinspection unchecked
//             viewModelClass = (Class<? extends AbstractViewModel<T>>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class);
//         }
//         getViewModelHelper().onCreate(requireActivity(), savedInstanceState, viewModelClass, getArguments());
//     }
// 
//     @CallSuper
//     @Override
//     public void onSaveInstanceState(@NonNull final Bundle outState) {
//         super.onSaveInstanceState(outState);
//         getViewModelHelper().onSaveInstanceState(outState);
//     }
// 
//     @CallSuper
//     @Override
//     public void onStart() {
//         super.onStart();
//         getViewModelHelper().onStart();
//     }
// 
//     @CallSuper
//     @Override
//     public void onStop() {
//         super.onStop();
//         getViewModelHelper().onStop();
//     }
// 
//     @CallSuper
//     @Override
//     public void onDestroyView() {
//         getViewModelHelper().onDestroyView(this);
//         super.onDestroyView();
//     }
// 
//     @CallSuper
//     @Override
//     public void onDestroy() {
//         getViewModelHelper().onDestroy(this);
//         super.onDestroy();
//     }
// 
//     @Nullable
//     public Class<R> getViewModelClass() {
//         return null;
//     }
// 
//     /**
//      * @see ViewModelHelper#getViewModel()
//      */
//     @NonNull
//     @SuppressWarnings("unused")
//     public R getViewModel() {
//         return getViewModelHelper().getViewModel();
//     }
// 
//     @Nullable
//     @Override
//     public ViewModelBindingConfig getViewModelBindingConfig() {
//         return null;
//     }
// 
//     @NonNull
//     public ViewModelHelper<T, R> getViewModelHelper() {
//         return mViewModelHelper;
//     }
// 
//     @Override
//     public void removeViewModel() {
//         mViewModelHelper.removeViewModel(requireActivity());
//     }
// 
//     /**
//      * Call this after your view is ready - usually on the end of {@link
//      * Fragment#onViewCreated(View, Bundle)}
//      *
//      * @param view view
//      */
//     protected void setModelView(@NonNull final T view) {
//         getViewModelHelper().setView(view);
//     }
// }
// 
// Path: sample/src/main/java/eu/inloop/viewmodel/sample/SampleApplication.java
// public class SampleApplication extends Application {
// 
//     private RefWatcher refWatcher;
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         refWatcher = LeakCanary.install(this);
//     }
// 
//     public static RefWatcher getRefWatcher(Context context) {
//         SampleApplication application = (SampleApplication) context.getApplicationContext();
//         return application.refWatcher;
//     }
// 
// }
// 
// Path: sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/PageModel.java
// public class PageModel extends AbstractViewModel<IPageView> {
// 
//     @Override
//     public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) {
//         super.onCreate(arguments, savedInstanceState);
//     }
// }
// 
// Path: sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/view/IPageView.java
// public interface IPageView extends IView {
//     ViewModelBindingConfig getViewModelBindingConfig();
// }


import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.squareup.leakcanary.RefWatcher;
import eu.inloop.viewmodel.base.ViewModelBaseFragment;
import eu.inloop.viewmodel.sample.R;
import eu.inloop.viewmodel.sample.SampleApplication;
import eu.inloop.viewmodel.sample.viewmodel.PageModel;
import eu.inloop.viewmodel.sample.viewmodel.view.IPageView;
package eu.inloop.viewmodel.sample.fragment;




public class PagerFragment extends ViewModelBaseFragment<IPageView, PageModel> implements IPageView {

    public static PagerFragment newInstance(int position) {
        final Bundle bundle = new Bundle();
        bundle.putInt("position", position);
        final PagerFragment fragment = new PagerFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_pager, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ((TextView)view.findViewById(R.id.text)).setText(Integer.toString(getArguments().getInt("position")));
        setModelView(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // watch for memory leaks
// Path: library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java
// public abstract class ViewModelBaseFragment<T extends IView, R extends AbstractViewModel<T>> extends Fragment implements IView {
// 
//     @NonNull
//     private final ViewModelHelper<T, R> mViewModelHelper = new ViewModelHelper<>();
// 
//     @CallSuper
//     @Override
//     public void onCreate(@Nullable final Bundle savedInstanceState) {
//         super.onCreate(savedInstanceState);
// 
//         Class<? extends AbstractViewModel<T>> viewModelClass = getViewModelClass();
//         // try to extract the ViewModel class from the implementation
//         if (viewModelClass == null) {
//             //noinspection unchecked
//             viewModelClass = (Class<? extends AbstractViewModel<T>>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class);
//         }
//         getViewModelHelper().onCreate(requireActivity(), savedInstanceState, viewModelClass, getArguments());
//     }
// 
//     @CallSuper
//     @Override
//     public void onSaveInstanceState(@NonNull final Bundle outState) {
//         super.onSaveInstanceState(outState);
//         getViewModelHelper().onSaveInstanceState(outState);
//     }
// 
//     @CallSuper
//     @Override
//     public void onStart() {
//         super.onStart();
//         getViewModelHelper().onStart();
//     }
// 
//     @CallSuper
//     @Override
//     public void onStop() {
//         super.onStop();
//         getViewModelHelper().onStop();
//     }
// 
//     @CallSuper
//     @Override
//     public void onDestroyView() {
//         getViewModelHelper().onDestroyView(this);
//         super.onDestroyView();
//     }
// 
//     @CallSuper
//     @Override
//     public void onDestroy() {
//         getViewModelHelper().onDestroy(this);
//         super.onDestroy();
//     }
// 
//     @Nullable
//     public Class<R> getViewModelClass() {
//         return null;
//     }
// 
//     /**
//      * @see ViewModelHelper#getViewModel()
//      */
//     @NonNull
//     @SuppressWarnings("unused")
//     public R getViewModel() {
//         return getViewModelHelper().getViewModel();
//     }
// 
//     @Nullable
//     @Override
//     public ViewModelBindingConfig getViewModelBindingConfig() {
//         return null;
//     }
// 
//     @NonNull
//     public ViewModelHelper<T, R> getViewModelHelper() {
//         return mViewModelHelper;
//     }
// 
//     @Override
//     public void removeViewModel() {
//         mViewModelHelper.removeViewModel(requireActivity());
//     }
// 
//     /**
//      * Call this after your view is ready - usually on the end of {@link
//      * Fragment#onViewCreated(View, Bundle)}
//      *
//      * @param view view
//      */
//     protected void setModelView(@NonNull final T view) {
//         getViewModelHelper().setView(view);
//     }
// }
// 
// Path: sample/src/main/java/eu/inloop/viewmodel/sample/SampleApplication.java
// public class SampleApplication extends Application {
// 
//     private RefWatcher refWatcher;
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         refWatcher = LeakCanary.install(this);
//     }
// 
//     public static RefWatcher getRefWatcher(Context context) {
//         SampleApplication application = (SampleApplication) context.getApplicationContext();
//         return application.refWatcher;
//     }
// 
// }
// 
// Path: sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/PageModel.java
// public class PageModel extends AbstractViewModel<IPageView> {
// 
//     @Override
//     public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) {
//         super.onCreate(arguments, savedInstanceState);
//     }
// }
// 
// Path: sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/view/IPageView.java
// public interface IPageView extends IView {
//     ViewModelBindingConfig getViewModelBindingConfig();
// }


// Path: sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.squareup.leakcanary.RefWatcher;
import eu.inloop.viewmodel.base.ViewModelBaseFragment;
import eu.inloop.viewmodel.sample.R;
import eu.inloop.viewmodel.sample.SampleApplication;
import eu.inloop.viewmodel.sample.viewmodel.PageModel;
import eu.inloop.viewmodel.sample.viewmodel.view.IPageView;

package eu.inloop.viewmodel.sample.fragment;




public class PagerFragment extends ViewModelBaseFragment<IPageView, PageModel> implements IPageView {

    public static PagerFragment newInstance(int position) {
        final Bundle bundle = new Bundle();
        bundle.putInt("position", position);
        final PagerFragment fragment = new PagerFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_pager, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ((TextView)view.findViewById(R.id.text)).setText(Integer.toString(getArguments().getInt("position")));
        setModelView(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // watch for memory leaks
        RefWatcher refWatcher = SampleApplication.getRefWatcher(requireActivity());