// Path: library/src/main/java/com/yarolegovich/mp/io/MaterialPreferences.java
// public class MaterialPreferences {
// 
//     private static final MaterialPreferences instance = new MaterialPreferences();
// 
//     public static MaterialPreferences instance() {
//         return instance;
//     }
// 
//     public static UserInputModule getUserInputModule(Context context) {
//         return instance.userInputModuleFactory.create(context);
//     }
// 
//     public static StorageModule getStorageModule(Context context) {
//         return instance.storageModuleFactory.create(context);
//     }
// 
//     private UserInputModule.Factory userInputModuleFactory;
//     private StorageModule.Factory storageModuleFactory;
// 
//     private MaterialPreferences() {
//         userInputModuleFactory = new StandardUserInputFactory();
//         storageModuleFactory = new SharedPrefsStorageFactory(null);
//     }
// 
//     public MaterialPreferences setUserInputModule(UserInputModule.Factory factory) {
//         userInputModuleFactory = factory;
//         return this;
//     }
// 
//     public MaterialPreferences setStorageModule(StorageModule.Factory factory) {
//         storageModuleFactory = factory;
//         return this;
//     }
// 
//     public void setDefault() {
//         userInputModuleFactory = new StandardUserInputFactory();
//         storageModuleFactory = new SharedPrefsStorageFactory(null);
//     }
// 
// 
//     private static class StandardUserInputFactory implements UserInputModule.Factory {
//         @Override
//         public UserInputModule create(Context context) {
//             return new StandardUserInputModule(context);
//         }
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/io/StorageModule.java
// public interface StorageModule {
// 
//     void saveBoolean(String key, boolean value);
// 
//     void saveString(String key, String value);
// 
//     void saveInt(String key, int value);
// 
//     void saveStringSet(String key, Set<String> value);
// 
//     boolean getBoolean(String key, boolean defaultVal);
// 
//     String getString(String key, String defaultVal);
// 
//     int getInt(String key, int defaultVal);
// 
//     Set<String> getStringSet(String key, Set<String> defaultVal);
// 
//     void onSaveInstanceState(Bundle outState);
// 
//     void onRestoreInstanceState(Bundle savedState);
// 
//     interface Factory {
//         StorageModule create(Context context);
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/io/UserInputModule.java
// public interface UserInputModule {
// 
//     void showEditTextInput(
//             String key,
//             CharSequence title,
//             CharSequence defaultValue,
//             Listener<String> listener);
// 
//     void showSingleChoiceInput(
//             String key,
//             CharSequence title,
//             CharSequence[] displayItems,
//             CharSequence[] values,
//             int selected,
//             Listener<String> listener);
// 
//     void showMultiChoiceInput(
//             String key,
//             CharSequence title,
//             CharSequence[] displayItems,
//             CharSequence[] values,
//             boolean[] defaultSelection,
//             Listener<Set<String>> listener);
// 
//     void showColorSelectionInput(
//             String key,
//             CharSequence title,
//             int defaultColor,
//             Listener<Integer> color);
// 
//     interface Factory {
//         UserInputModule create(Context context);
//     }
// 
//     interface Listener<T> {
//         void onInput(T value);
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/util/CompositeClickListener.java
// public class CompositeClickListener implements View.OnClickListener {
// 
//     private List<View.OnClickListener> listeners;
// 
//     public CompositeClickListener() {
//         listeners = new ArrayList<>();
//     }
// 
//     @Override
//     public void onClick(View v) {
//         for (int i = listeners.size() - 1; i >= 0; i--) {
//             listeners.get(i).onClick(v);
//         }
//     }
// 
//     public int addListener(View.OnClickListener listener) {
//         listeners.add(listener);
//         return listeners.size() - 1;
//     }
// 
//     public void removeListener(View.OnClickListener listener) {
//         listeners.remove(listener);
//     }
// 
//     public void removeListener(int index) {
//         listeners.remove(index);
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/util/Utils.java
// public class Utils {
// 
//     private Utils() {}
// 
//     public static int dpToPixels(Context context, int dp) {
//         Resources resources = context.getResources();
//         DisplayMetrics metrics = resources.getDisplayMetrics();
//         return Math.round(dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
//     }
// 
//     public static int clickableBackground(Context context) {
//         TypedValue outValue = new TypedValue();
//         context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
//         return outValue.resourceId;
//     }
// }


import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import com.yarolegovich.mp.io.MaterialPreferences;
import com.yarolegovich.mp.io.StorageModule;
import com.yarolegovich.mp.io.UserInputModule;
import com.yarolegovich.mp.util.CompositeClickListener;
import com.yarolegovich.mp.util.Utils;
package com.yarolegovich.mp;




/**
 * Created by yarolegovich on 01.05.2016.
 */
@SuppressWarnings("ResourceType")
abstract class AbsMaterialPreference<T> extends LinearLayout {

    private TextView title;
    private TextView summary;
    private ImageView icon;

    protected String defaultValue;
    protected String key;

    protected UserInputModule userInputModule;
// Path: library/src/main/java/com/yarolegovich/mp/io/MaterialPreferences.java
// public class MaterialPreferences {
// 
//     private static final MaterialPreferences instance = new MaterialPreferences();
// 
//     public static MaterialPreferences instance() {
//         return instance;
//     }
// 
//     public static UserInputModule getUserInputModule(Context context) {
//         return instance.userInputModuleFactory.create(context);
//     }
// 
//     public static StorageModule getStorageModule(Context context) {
//         return instance.storageModuleFactory.create(context);
//     }
// 
//     private UserInputModule.Factory userInputModuleFactory;
//     private StorageModule.Factory storageModuleFactory;
// 
//     private MaterialPreferences() {
//         userInputModuleFactory = new StandardUserInputFactory();
//         storageModuleFactory = new SharedPrefsStorageFactory(null);
//     }
// 
//     public MaterialPreferences setUserInputModule(UserInputModule.Factory factory) {
//         userInputModuleFactory = factory;
//         return this;
//     }
// 
//     public MaterialPreferences setStorageModule(StorageModule.Factory factory) {
//         storageModuleFactory = factory;
//         return this;
//     }
// 
//     public void setDefault() {
//         userInputModuleFactory = new StandardUserInputFactory();
//         storageModuleFactory = new SharedPrefsStorageFactory(null);
//     }
// 
// 
//     private static class StandardUserInputFactory implements UserInputModule.Factory {
//         @Override
//         public UserInputModule create(Context context) {
//             return new StandardUserInputModule(context);
//         }
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/io/StorageModule.java
// public interface StorageModule {
// 
//     void saveBoolean(String key, boolean value);
// 
//     void saveString(String key, String value);
// 
//     void saveInt(String key, int value);
// 
//     void saveStringSet(String key, Set<String> value);
// 
//     boolean getBoolean(String key, boolean defaultVal);
// 
//     String getString(String key, String defaultVal);
// 
//     int getInt(String key, int defaultVal);
// 
//     Set<String> getStringSet(String key, Set<String> defaultVal);
// 
//     void onSaveInstanceState(Bundle outState);
// 
//     void onRestoreInstanceState(Bundle savedState);
// 
//     interface Factory {
//         StorageModule create(Context context);
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/io/UserInputModule.java
// public interface UserInputModule {
// 
//     void showEditTextInput(
//             String key,
//             CharSequence title,
//             CharSequence defaultValue,
//             Listener<String> listener);
// 
//     void showSingleChoiceInput(
//             String key,
//             CharSequence title,
//             CharSequence[] displayItems,
//             CharSequence[] values,
//             int selected,
//             Listener<String> listener);
// 
//     void showMultiChoiceInput(
//             String key,
//             CharSequence title,
//             CharSequence[] displayItems,
//             CharSequence[] values,
//             boolean[] defaultSelection,
//             Listener<Set<String>> listener);
// 
//     void showColorSelectionInput(
//             String key,
//             CharSequence title,
//             int defaultColor,
//             Listener<Integer> color);
// 
//     interface Factory {
//         UserInputModule create(Context context);
//     }
// 
//     interface Listener<T> {
//         void onInput(T value);
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/util/CompositeClickListener.java
// public class CompositeClickListener implements View.OnClickListener {
// 
//     private List<View.OnClickListener> listeners;
// 
//     public CompositeClickListener() {
//         listeners = new ArrayList<>();
//     }
// 
//     @Override
//     public void onClick(View v) {
//         for (int i = listeners.size() - 1; i >= 0; i--) {
//             listeners.get(i).onClick(v);
//         }
//     }
// 
//     public int addListener(View.OnClickListener listener) {
//         listeners.add(listener);
//         return listeners.size() - 1;
//     }
// 
//     public void removeListener(View.OnClickListener listener) {
//         listeners.remove(listener);
//     }
// 
//     public void removeListener(int index) {
//         listeners.remove(index);
//     }
// }
// 
// Path: library/src/main/java/com/yarolegovich/mp/util/Utils.java
// public class Utils {
// 
//     private Utils() {}
// 
//     public static int dpToPixels(Context context, int dp) {
//         Resources resources = context.getResources();
//         DisplayMetrics metrics = resources.getDisplayMetrics();
//         return Math.round(dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
//     }
// 
//     public static int clickableBackground(Context context) {
//         TypedValue outValue = new TypedValue();
//         context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
//         return outValue.resourceId;
//     }
// }


// Path: library/src/main/java/com/yarolegovich/mp/AbsMaterialPreference.java
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import com.yarolegovich.mp.io.MaterialPreferences;
import com.yarolegovich.mp.io.StorageModule;
import com.yarolegovich.mp.io.UserInputModule;
import com.yarolegovich.mp.util.CompositeClickListener;
import com.yarolegovich.mp.util.Utils;

package com.yarolegovich.mp;




/**
 * Created by yarolegovich on 01.05.2016.
 */
@SuppressWarnings("ResourceType")
abstract class AbsMaterialPreference<T> extends LinearLayout {

    private TextView title;
    private TextView summary;
    private ImageView icon;

    protected String defaultValue;
    protected String key;

    protected UserInputModule userInputModule;
    protected StorageModule storageModule;