// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/animation/CustomAnimationBody.java
// public class CustomAnimationBody extends AnimationBody implements Serializable {
// 
//     private transient Map<FieldName, PropertyMethodsHolder<Long>> longProperties;
//     private transient Map<FieldName, PropertyMethodsHolder<Float>> floatProperties;
//     private transient Map<Class<?>, Map<FieldName, ? extends PropertyMethodsHolder<?>>> typesMap;
// 
//     public CustomAnimationBody() {
//         init();
//     }
// 
//     public void init() {
//         longProperties = new HashMap<>();
//         floatProperties = new HashMap<>();
//         typesMap = new HashMap<>();
// 
//         longProperties.put(FieldName.DURATION, PropertyMethodsHolder.fields(this::getDuration, this::setDuration));
//         longProperties.put(FieldName.DELAY, PropertyMethodsHolder.fields(this::getDelay, this::setDelay));
// 
//         floatProperties.put(FieldName.FORCE, PropertyMethodsHolder.fields(this::getForce, this::setForce));
//         floatProperties.put(FieldName.VELOCITY, PropertyMethodsHolder.fields(this::getVelocity, this::setVelocity));
//         floatProperties.put(FieldName.DAMPING, PropertyMethodsHolder.fields(this::getDamping, this::setDamping));
//         floatProperties.put(FieldName.SCALE, PropertyMethodsHolder.fields(
//                 this::getEndScaleX,
//                 (scale) -> {
//                     setEndScaleX(scale);
//                     setEndScaleY(scale);
//                 }));
// 
//         typesMap.put(Long.class, longProperties);
//         typesMap.put(Float.class, floatProperties);
//     }
// 
//     public void setProperty(FieldName name, long value) {
//         final PropertyMethodsHolder<Long> methodsHolder = longProperties.get(name);
//         final PropertyMethodsHolder.Setter<Long> setter = methodsHolder.setter();
// 
//         setter.set(value);
//     }
// 
//     public void setProperty(FieldName name, float value) {
//         final PropertyMethodsHolder<Float> methodsHolder = floatProperties.get(name);
//         final PropertyMethodsHolder.Setter<Float> setter = methodsHolder.setter();
// 
//         setter.set(value);
//     }
// 
//     public <T extends Number> T getPropertyValue(FieldName name, Class<?> numberClass) {
//         if (!typesMap.containsKey(numberClass)) {
//             throw new IllegalArgumentException("There is no property of type: " + numberClass);
//         }
// 
//         final Map<FieldName, ? extends PropertyMethodsHolder<?>> propertiesMap = typesMap.get(numberClass);
//         final PropertyMethodsHolder<?> holder = propertiesMap.get(name);
//         final PropertyMethodsHolder.Getter<?> getter = holder.getter();
// 
//         return (T) getter.get();
//     }
// 
//     public Map<FieldName, PropertyMethodsHolder<Long>> getLongProperties() {
//         return longProperties;
//     }
// 
//     public Map<FieldName, PropertyMethodsHolder<Float>> getFloatProperties() {
//         return floatProperties;
//     }
// 
//     public enum FieldName {
//         DURATION(R.string.duration),
//         DELAY(R.string.delay),
//         FORCE(R.string.force),
//         VELOCITY(R.string.velocity),
//         DAMPING(R.string.damping),
//         SCALE(R.string.scale);
// 
//         private static final Map<Integer, FieldName> idNamesMap;
// 
//         static {
//             idNamesMap =
//                     Stream.of(FieldName.values())
//                             .collect(Collectors.toMap((name -> name.stringId), (name -> name)));
//         }
// 
//         private final int stringId;
// 
//         FieldName(int stringId) {
//             this.stringId = stringId;
//         }
// 
//         @Nullable
//         public static FieldName forStringId(int stringId) {
//             return idNamesMap.get(stringId);
//         }
// 
//         public int getStringId() {
//             return stringId;
//         }
//     }
// }
// 
// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/editor/AnimationBodyHolder.java
// public interface AnimationBodyHolder {
//     void setAnimationBody(CustomAnimationBody animationBody);
// }
// 
// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/editor/pager/BaseFragment.java
// public abstract class BaseFragment<AdapterT extends RecyclerView.Adapter> extends Fragment {
// 
//     private PagerFragmentBinding binding;
//     private AdapterT adapter;
// 
//     @Nullable
//     @Override
//     public View onCreateView(
//             LayoutInflater inflater,
//             @Nullable ViewGroup container,
//             @Nullable Bundle savedInstanceState) {
// 
//         binding = DataBindingUtil.inflate(inflater, R.layout.fragment_editor_page, container, false);
// 
//         return binding.getRoot();
//     }
// 
//     @Override
//     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
//         super.onViewCreated(view, savedInstanceState);
// 
//         binding.recyclerView.setHasFixedSize(true);
//         binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
//         adapter = getAdapterInstance();
//         binding.recyclerView.setAdapter(adapter);
//     }
// 
//     protected abstract AdapterT getAdapterInstance();
// 
//     public AdapterT getAdapter() {
//         return adapter;
//     }
// }


import android.os.Bundle;
import androidx.annotation.Nullable;
import android.view.View;
import com.appolica.sample.ui.animation.CustomAnimationBody;
import com.appolica.sample.ui.editor.AnimationBodyHolder;
import com.appolica.sample.ui.editor.pager.BaseFragment;
package com.appolica.sample.ui.editor.pager.settings;



public class SettingsFragment
        extends BaseFragment<SettingsRVAdapter>
        implements SettingsRVAdapter.OnModelChangedCallback,
// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/animation/CustomAnimationBody.java
// public class CustomAnimationBody extends AnimationBody implements Serializable {
// 
//     private transient Map<FieldName, PropertyMethodsHolder<Long>> longProperties;
//     private transient Map<FieldName, PropertyMethodsHolder<Float>> floatProperties;
//     private transient Map<Class<?>, Map<FieldName, ? extends PropertyMethodsHolder<?>>> typesMap;
// 
//     public CustomAnimationBody() {
//         init();
//     }
// 
//     public void init() {
//         longProperties = new HashMap<>();
//         floatProperties = new HashMap<>();
//         typesMap = new HashMap<>();
// 
//         longProperties.put(FieldName.DURATION, PropertyMethodsHolder.fields(this::getDuration, this::setDuration));
//         longProperties.put(FieldName.DELAY, PropertyMethodsHolder.fields(this::getDelay, this::setDelay));
// 
//         floatProperties.put(FieldName.FORCE, PropertyMethodsHolder.fields(this::getForce, this::setForce));
//         floatProperties.put(FieldName.VELOCITY, PropertyMethodsHolder.fields(this::getVelocity, this::setVelocity));
//         floatProperties.put(FieldName.DAMPING, PropertyMethodsHolder.fields(this::getDamping, this::setDamping));
//         floatProperties.put(FieldName.SCALE, PropertyMethodsHolder.fields(
//                 this::getEndScaleX,
//                 (scale) -> {
//                     setEndScaleX(scale);
//                     setEndScaleY(scale);
//                 }));
// 
//         typesMap.put(Long.class, longProperties);
//         typesMap.put(Float.class, floatProperties);
//     }
// 
//     public void setProperty(FieldName name, long value) {
//         final PropertyMethodsHolder<Long> methodsHolder = longProperties.get(name);
//         final PropertyMethodsHolder.Setter<Long> setter = methodsHolder.setter();
// 
//         setter.set(value);
//     }
// 
//     public void setProperty(FieldName name, float value) {
//         final PropertyMethodsHolder<Float> methodsHolder = floatProperties.get(name);
//         final PropertyMethodsHolder.Setter<Float> setter = methodsHolder.setter();
// 
//         setter.set(value);
//     }
// 
//     public <T extends Number> T getPropertyValue(FieldName name, Class<?> numberClass) {
//         if (!typesMap.containsKey(numberClass)) {
//             throw new IllegalArgumentException("There is no property of type: " + numberClass);
//         }
// 
//         final Map<FieldName, ? extends PropertyMethodsHolder<?>> propertiesMap = typesMap.get(numberClass);
//         final PropertyMethodsHolder<?> holder = propertiesMap.get(name);
//         final PropertyMethodsHolder.Getter<?> getter = holder.getter();
// 
//         return (T) getter.get();
//     }
// 
//     public Map<FieldName, PropertyMethodsHolder<Long>> getLongProperties() {
//         return longProperties;
//     }
// 
//     public Map<FieldName, PropertyMethodsHolder<Float>> getFloatProperties() {
//         return floatProperties;
//     }
// 
//     public enum FieldName {
//         DURATION(R.string.duration),
//         DELAY(R.string.delay),
//         FORCE(R.string.force),
//         VELOCITY(R.string.velocity),
//         DAMPING(R.string.damping),
//         SCALE(R.string.scale);
// 
//         private static final Map<Integer, FieldName> idNamesMap;
// 
//         static {
//             idNamesMap =
//                     Stream.of(FieldName.values())
//                             .collect(Collectors.toMap((name -> name.stringId), (name -> name)));
//         }
// 
//         private final int stringId;
// 
//         FieldName(int stringId) {
//             this.stringId = stringId;
//         }
// 
//         @Nullable
//         public static FieldName forStringId(int stringId) {
//             return idNamesMap.get(stringId);
//         }
// 
//         public int getStringId() {
//             return stringId;
//         }
//     }
// }
// 
// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/editor/AnimationBodyHolder.java
// public interface AnimationBodyHolder {
//     void setAnimationBody(CustomAnimationBody animationBody);
// }
// 
// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/editor/pager/BaseFragment.java
// public abstract class BaseFragment<AdapterT extends RecyclerView.Adapter> extends Fragment {
// 
//     private PagerFragmentBinding binding;
//     private AdapterT adapter;
// 
//     @Nullable
//     @Override
//     public View onCreateView(
//             LayoutInflater inflater,
//             @Nullable ViewGroup container,
//             @Nullable Bundle savedInstanceState) {
// 
//         binding = DataBindingUtil.inflate(inflater, R.layout.fragment_editor_page, container, false);
// 
//         return binding.getRoot();
//     }
// 
//     @Override
//     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
//         super.onViewCreated(view, savedInstanceState);
// 
//         binding.recyclerView.setHasFixedSize(true);
//         binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
//         adapter = getAdapterInstance();
//         binding.recyclerView.setAdapter(adapter);
//     }
// 
//     protected abstract AdapterT getAdapterInstance();
// 
//     public AdapterT getAdapter() {
//         return adapter;
//     }
// }


// Path: Flubber/demo/src/main/java/com/appolica/sample/ui/editor/pager/settings/SettingsFragment.java
import android.os.Bundle;
import androidx.annotation.Nullable;
import android.view.View;
import com.appolica.sample.ui.animation.CustomAnimationBody;
import com.appolica.sample.ui.editor.AnimationBodyHolder;
import com.appolica.sample.ui.editor.pager.BaseFragment;

package com.appolica.sample.ui.editor.pager.settings;



public class SettingsFragment
        extends BaseFragment<SettingsRVAdapter>
        implements SettingsRVAdapter.OnModelChangedCallback,
        AnimationBodyHolder {