diff --git a/build.gradle b/build.gradle index e265a05..c27196d 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'me.tatarka.retrolambda' android { - compileSdkVersion 24 + compileSdkVersion 25 buildToolsVersion '25.0.2' compileOptions { @@ -12,15 +12,15 @@ android { defaultConfig { minSdkVersion 9 - targetSdkVersion 24 + targetSdkVersion 25 } } dependencies { compile project(':libraries:core') - provided 'com.android.support:appcompat-v7:24.2.1' - provided 'com.android.support:recyclerview-v7:24.2.1' + provided 'com.android.support:appcompat-v7:25.2.0' + provided 'com.android.support:recyclerview-v7:25.2.0' provided 'io.reactivex:rxandroid:1.2.1' } diff --git a/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewFragment.java b/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewFragment.java index 2561c59..8613a49 100644 --- a/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewFragment.java +++ b/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewFragment.java @@ -134,6 +134,8 @@ public abstract class ViewFragment extends * @param activity Activity which fragment attached to. */ @CallSuper + @SuppressWarnings("RestrictedApi") + //RestrictedApi: we need isMenuVisible() to check analytics rightly! protected void onStart(@NonNull final View view, @NonNull final TActivity activity) { if (getParentFragment() instanceof OnFragmentStartedListener) { ((OnFragmentStartedListener) getParentFragment()).onFragmentStarted(this); diff --git a/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceStore.java b/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceStore.java index 1c3286f..38fddad 100644 --- a/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceStore.java +++ b/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceStore.java @@ -23,8 +23,12 @@ import android.content.SharedPreferences; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.lang.reflect.Type; + import ru.touchin.roboswag.core.log.Lc; -import ru.touchin.roboswag.core.observables.storable.SafeStore; +import ru.touchin.roboswag.core.observables.storable.Store; +import rx.Completable; +import rx.Single; /** @@ -33,7 +37,23 @@ import ru.touchin.roboswag.core.observables.storable.SafeStore; * * @param Type of storable. Could be Boolean, Integer, Long, Float or String. */ -public class PreferenceStore implements SafeStore { +public class PreferenceStore implements Store { + + private static boolean isTypeBoolean(@NonNull final Type type) { + return type.equals(Boolean.class) || type.equals(boolean.class); + } + + private static boolean isTypeInteger(@NonNull final Type type) { + return type.equals(Integer.class) || type.equals(int.class); + } + + private static boolean isTypeFloat(@NonNull final Type type) { + return type.equals(Float.class) || type.equals(float.class); + } + + private static boolean isTypeLong(@NonNull final Type type) { + return type.equals(Long.class) || type.equals(long.class); + } @NonNull private final SharedPreferences preferences; @@ -42,54 +62,61 @@ public class PreferenceStore implements SafeStore { this.preferences = preferences; } + @NonNull @Override - public boolean contains(@NonNull final String key) { - return preferences.contains(key); + public Single contains(@NonNull final String key) { + return Single.fromCallable(() -> preferences.contains(key)); } + @NonNull @Override - public void storeObject(@NonNull final Class storeObjectClass, @NonNull final String key, @Nullable final T storeObject) { - if (storeObject == null) { - preferences.edit().remove(key).apply(); - return; - } + public Completable storeObject(@NonNull final Type storeObjectType, @NonNull final String key, @Nullable final T storeObject) { + return Completable.fromAction(() -> { + if (storeObject == null) { + preferences.edit().remove(key).apply(); + return; + } - if (storeObjectClass.equals(Boolean.class)) { - preferences.edit().putBoolean(key, (Boolean) storeObject).apply(); - } else if (storeObjectClass.equals(String.class)) { - preferences.edit().putString(key, (String) storeObject).apply(); - } else if (storeObjectClass.equals(Integer.class)) { - preferences.edit().putInt(key, (Integer) storeObject).apply(); - } else if (storeObjectClass.equals(Long.class)) { - preferences.edit().putLong(key, (Long) storeObject).apply(); - } else if (storeObjectClass.equals(Float.class)) { - preferences.edit().putFloat(key, (Float) storeObject).apply(); - } else { - Lc.assertion("Unsupported type of object " + storeObjectClass); - } + if (isTypeBoolean(storeObjectType)) { + preferences.edit().putBoolean(key, (Boolean) storeObject).apply(); + } else if (storeObjectType.equals(String.class)) { + preferences.edit().putString(key, (String) storeObject).apply(); + } else if (isTypeInteger(storeObjectType)) { + preferences.edit().putInt(key, (Integer) storeObject).apply(); + } else if (isTypeLong(storeObjectType)) { + preferences.edit().putLong(key, (Long) storeObject).apply(); + } else if (isTypeFloat(storeObjectType)) { + preferences.edit().putFloat(key, (Float) storeObject).apply(); + } else { + Lc.assertion("Unsupported type of object " + storeObjectType); + } + }); } - @Nullable + @NonNull @Override @SuppressWarnings("unchecked") - public T loadObject(@NonNull final Class storeObjectClass, @NonNull final String key) { - if (!contains(key)) { - return null; - } + //unchecked: we checked class in if-else statements + public Single loadObject(@NonNull final Type storeObjectType, @NonNull final String key) { + return Single.fromCallable(() -> { + if (!preferences.contains(key)) { + return null; + } - if (storeObjectClass.equals(Boolean.class)) { - return (T) ((Boolean) preferences.getBoolean(key, false)); - } else if (storeObjectClass.equals(String.class)) { - return (T) (preferences.getString(key, null)); - } else if (storeObjectClass.equals(Integer.class)) { - return (T) ((Integer) preferences.getInt(key, 0)); - } else if (storeObjectClass.equals(Long.class)) { - return (T) ((Long) preferences.getLong(key, 0L)); - } else if (storeObjectClass.equals(Float.class)) { - return (T) ((Float) preferences.getFloat(key, 0f)); - } - Lc.assertion("Unsupported type of object " + storeObjectClass); - return null; + if (isTypeBoolean(storeObjectType)) { + return (T) ((Boolean) preferences.getBoolean(key, false)); + } else if (storeObjectType.equals(String.class)) { + return (T) (preferences.getString(key, null)); + } else if (isTypeInteger(storeObjectType)) { + return (T) ((Integer) preferences.getInt(key, 0)); + } else if (isTypeLong(storeObjectType)) { + return (T) ((Long) preferences.getLong(key, 0L)); + } else if (isTypeFloat(storeObjectType)) { + return (T) ((Float) preferences.getFloat(key, 0f)); + } + Lc.assertion("Unsupported type of object " + storeObjectType); + return null; + }); } } diff --git a/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceUtils.java b/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceUtils.java index 7b53117..6d710b5 100644 --- a/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceUtils.java +++ b/src/main/java/ru/touchin/roboswag/components/utils/storables/PreferenceUtils.java @@ -23,11 +23,12 @@ import android.content.SharedPreferences; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import ru.touchin.roboswag.core.observables.storable.SafeConverter; +import java.lang.reflect.Type; + +import ru.touchin.roboswag.core.observables.storable.Converter; import ru.touchin.roboswag.core.observables.storable.SameTypesConverter; import ru.touchin.roboswag.core.observables.storable.Storable; -import ru.touchin.roboswag.core.observables.storable.concrete.NonNullSafeStorable; -import ru.touchin.roboswag.core.observables.storable.concrete.SafeStorable; +import ru.touchin.roboswag.core.observables.storable.concrete.NonNullStorable; /** * Created by Gavriil Sitnikov on 01/09/2016. @@ -36,21 +37,21 @@ import ru.touchin.roboswag.core.observables.storable.concrete.SafeStorable; public final class PreferenceUtils { /** - * Creates {@link SafeStorable} that stores string into {@link SharedPreferences}. + * Creates {@link Storable} that stores string into {@link SharedPreferences}. * * @param name Name of preference; * @param preferences Preferences to store value; * @return {@link Storable} for string. */ @NonNull - public static SafeStorable stringStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { - return new Storable.Builder(name, String.class) - .setSafeStore(String.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static Storable stringStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { + return new Storable.Builder(name, String.class, + String.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .build(); } /** - * Creates {@link NonNullSafeStorable} that stores string into {@link SharedPreferences} with default value. + * Creates {@link NonNullStorable} that stores string into {@link SharedPreferences} with default value. * * @param name Name of preference; * @param preferences Preferences to store value; @@ -58,31 +59,31 @@ public final class PreferenceUtils { * @return {@link Storable} for string. */ @NonNull - public static NonNullSafeStorable stringStorable(@NonNull final String name, - @NonNull final SharedPreferences preferences, - @NonNull final String defaultValue) { - return new Storable.Builder(name, String.class) - .setSafeStore(String.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static NonNullStorable stringStorable(@NonNull final String name, + @NonNull final SharedPreferences preferences, + @NonNull final String defaultValue) { + return new Storable.Builder(name, String.class, + String.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .setDefaultValue(defaultValue) .build(); } /** - * Creates {@link SafeStorable} that stores long into {@link SharedPreferences}. + * Creates {@link Storable} that stores long into {@link SharedPreferences}. * * @param name Name of preference; * @param preferences Preferences to store value; * @return {@link Storable} for long. */ @NonNull - public static SafeStorable longStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { - return new Storable.Builder(name, Long.class) - .setSafeStore(Long.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static Storable longStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { + return new Storable.Builder(name, Long.class, + Long.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .build(); } /** - * Creates {@link NonNullSafeStorable} that stores long into {@link SharedPreferences} with default value. + * Creates {@link NonNullStorable} that stores long into {@link SharedPreferences} with default value. * * @param name Name of preference; * @param preferences Preferences to store value; @@ -90,31 +91,31 @@ public final class PreferenceUtils { * @return {@link Storable} for long. */ @NonNull - public static NonNullSafeStorable longStorable(@NonNull final String name, - @NonNull final SharedPreferences preferences, - final long defaultValue) { - return new Storable.Builder(name, Long.class) - .setSafeStore(Long.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static NonNullStorable longStorable(@NonNull final String name, + @NonNull final SharedPreferences preferences, + final long defaultValue) { + return new Storable.Builder(name, Long.class, + Long.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .setDefaultValue(defaultValue) .build(); } /** - * Creates {@link SafeStorable} that stores boolean into {@link SharedPreferences}. + * Creates {@link Storable} that stores boolean into {@link SharedPreferences}. * * @param name Name of preference; * @param preferences Preferences to store value; * @return {@link Storable} for boolean. */ @NonNull - public static SafeStorable booleanStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { - return new Storable.Builder(name, Boolean.class) - .setSafeStore(Boolean.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static Storable booleanStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { + return new Storable.Builder(name, Boolean.class, + Boolean.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .build(); } /** - * Creates {@link NonNullSafeStorable} that stores boolean into {@link SharedPreferences} with default value. + * Creates {@link NonNullStorable} that stores boolean into {@link SharedPreferences} with default value. * * @param name Name of preference; * @param preferences Preferences to store value; @@ -122,31 +123,31 @@ public final class PreferenceUtils { * @return {@link Storable} for boolean. */ @NonNull - public static NonNullSafeStorable booleanStorable(@NonNull final String name, - @NonNull final SharedPreferences preferences, - final boolean defaultValue) { - return new Storable.Builder(name, Boolean.class) - .setSafeStore(Boolean.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static NonNullStorable booleanStorable(@NonNull final String name, + @NonNull final SharedPreferences preferences, + final boolean defaultValue) { + return new Storable.Builder(name, Boolean.class, + Boolean.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .setDefaultValue(defaultValue) .build(); } /** - * Creates {@link SafeStorable} that stores integer into {@link SharedPreferences}. + * Creates {@link Storable} that stores integer into {@link SharedPreferences}. * * @param name Name of preference; * @param preferences Preferences to store value; * @return {@link Storable} for integer. */ @NonNull - public static SafeStorable integerStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { - return new Storable.Builder(name, Integer.class) - .setSafeStore(Integer.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static Storable integerStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { + return new Storable.Builder(name, Integer.class, + Integer.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .build(); } /** - * Creates {@link NonNullSafeStorable} that stores integer into {@link SharedPreferences} with default value. + * Creates {@link NonNullStorable} that stores integer into {@link SharedPreferences} with default value. * * @param name Name of preference; * @param preferences Preferences to store value; @@ -154,31 +155,31 @@ public final class PreferenceUtils { * @return {@link Storable} for integer. */ @NonNull - public static NonNullSafeStorable integerStorable(@NonNull final String name, - @NonNull final SharedPreferences preferences, - final int defaultValue) { - return new Storable.Builder(name, Integer.class) - .setSafeStore(Integer.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static NonNullStorable integerStorable(@NonNull final String name, + @NonNull final SharedPreferences preferences, + final int defaultValue) { + return new Storable.Builder(name, Integer.class, + Integer.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .setDefaultValue(defaultValue) .build(); } /** - * Creates {@link SafeStorable} that stores float into {@link SharedPreferences}. + * Creates {@link Storable} that stores float into {@link SharedPreferences}. * * @param name Name of preference; * @param preferences Preferences to store value; * @return {@link Storable} for float. */ @NonNull - public static SafeStorable floatStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { - return new Storable.Builder(name, Float.class) - .setSafeStore(Float.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static Storable floatStorable(@NonNull final String name, @NonNull final SharedPreferences preferences) { + return new Storable.Builder(name, Float.class, + Float.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .build(); } /** - * Creates {@link NonNullSafeStorable} that stores float into {@link SharedPreferences} with default value. + * Creates {@link NonNullStorable} that stores float into {@link SharedPreferences} with default value. * * @param name Name of preference; * @param preferences Preferences to store value; @@ -186,33 +187,33 @@ public final class PreferenceUtils { * @return {@link Storable} for float. */ @NonNull - public static NonNullSafeStorable floatStorable(@NonNull final String name, - @NonNull final SharedPreferences preferences, - final float defaultValue) { - return new Storable.Builder(name, Float.class) - .setSafeStore(Float.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) + public static NonNullStorable floatStorable(@NonNull final String name, + @NonNull final SharedPreferences preferences, + final float defaultValue) { + return new Storable.Builder(name, Float.class, + Float.class, new PreferenceStore<>(preferences), new SameTypesConverter<>()) .setDefaultValue(defaultValue) .build(); } /** - * Creates {@link SafeStorable} that stores enum into {@link SharedPreferences}. + * Creates {@link Storable} that stores enum into {@link SharedPreferences}. * * @param name Name of preference; * @param preferences Preferences to store value; * @return {@link Storable} for enum. */ @NonNull - public static > SafeStorable enumStorable(@NonNull final String name, - @NonNull final Class enumClass, - @NonNull final SharedPreferences preferences) { - return new Storable.Builder(name, enumClass) - .setSafeStore(String.class, new PreferenceStore<>(preferences), new EnumToStringConverter<>()) + public static > Storable enumStorable(@NonNull final String name, + @NonNull final Class enumClass, + @NonNull final SharedPreferences preferences) { + return new Storable.Builder(name, enumClass, + String.class, new PreferenceStore<>(preferences), new EnumToStringConverter<>()) .build(); } /** - * Creates {@link NonNullSafeStorable} that stores enum into {@link SharedPreferences} with default value. + * Creates {@link NonNullStorable} that stores enum into {@link SharedPreferences} with default value. * * @param name Name of preference; * @param preferences Preferences to store value; @@ -220,12 +221,12 @@ public final class PreferenceUtils { * @return {@link Storable} for enum. */ @NonNull - public static > NonNullSafeStorable enumStorable(@NonNull final String name, - @NonNull final Class enumClass, - @NonNull final SharedPreferences preferences, - @NonNull final T defaultValue) { - return new Storable.Builder(name, enumClass) - .setSafeStore(String.class, new PreferenceStore<>(preferences), new EnumToStringConverter<>()) + public static > NonNullStorable enumStorable(@NonNull final String name, + @NonNull final Class enumClass, + @NonNull final SharedPreferences preferences, + @NonNull final T defaultValue) { + return new Storable.Builder(name, enumClass, + String.class, new PreferenceStore<>(preferences), new EnumToStringConverter<>()) .setDefaultValue(defaultValue) .build(); } @@ -233,18 +234,25 @@ public final class PreferenceUtils { private PreferenceUtils() { } - private static class EnumToStringConverter> implements SafeConverter { + private static class EnumToStringConverter> implements Converter { @Nullable @Override - public String toStoreObject(@NonNull final Class objectClass, @NonNull final Class stringClass, @Nullable final T object) { + public String toStoreObject(@NonNull final Type objectType, @NonNull final Type storeObjectType, @Nullable final T object) + throws ConversionException { return object != null ? object.name() : null; } @Nullable @Override - public T toObject(@NonNull final Class objectClass, @NonNull final Class stringClass, @Nullable final String stringObject) { - return stringObject != null ? Enum.valueOf(objectClass, stringObject) : null; + @SuppressWarnings("unchecked") + //unchecked: we checked it before cast + public T toObject(@NonNull final Type objectType, @NonNull final Type storeObjectType, @Nullable final String stringObject) + throws ConversionException { + if (!(objectType instanceof Class) || !((Class) objectType).isEnum()) { + throw new ConversionException(String.format("Type %s is not enum class", objectType)); + } + return stringObject != null ? Enum.valueOf((Class) objectType, stringObject) : null; } } diff --git a/src/main/java/ru/touchin/roboswag/components/views/MaterialLoadingBar.java b/src/main/java/ru/touchin/roboswag/components/views/MaterialLoadingBar.java index 726e08d..a951203 100644 --- a/src/main/java/ru/touchin/roboswag/components/views/MaterialLoadingBar.java +++ b/src/main/java/ru/touchin/roboswag/components/views/MaterialLoadingBar.java @@ -24,9 +24,9 @@ import android.content.res.TypedArray; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.util.TypedValue; -import android.widget.ImageView; import ru.touchin.roboswag.components.R; import ru.touchin.roboswag.components.utils.UiUtils; @@ -52,7 +52,7 @@ import ru.touchin.roboswag.components.utils.UiUtils; * @style/MyAppLoadingBar * */ -public class MaterialLoadingBar extends ImageView { +public class MaterialLoadingBar extends AppCompatImageView { private static int getPrimaryColor(@NonNull final Context context) { final int colorAttr;