fix warnings and add some type safety for preferences

This commit is contained in:
dkanada 2021-05-22 12:27:52 +09:00
commit 37eb40e79a
11 changed files with 86 additions and 44 deletions

View file

@ -181,7 +181,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
case PreferenceUtil.ACCENT_COLOR: case PreferenceUtil.ACCENT_COLOR:
case PreferenceUtil.GENERAL_THEME: case PreferenceUtil.GENERAL_THEME:
// apply theme before reloading shortcuts to apply the new icon colors // apply theme before reloading shortcuts to apply the new icon colors
requireActivity().setTheme(PreferenceUtil.getThemeResource(key)); requireActivity().setTheme(PreferenceUtil.getInstance(getContext()).getTheme().style);
new DynamicShortcutManager(requireContext()).updateDynamicShortcuts(); new DynamicShortcutManager(requireContext()).updateDynamicShortcuts();
ThemeStore.markChanged(requireContext()); ThemeStore.markChanged(requireContext());

View file

@ -18,8 +18,9 @@ import com.dkanada.gramophone.util.Util;
public abstract class AbsThemeActivity extends ATHToolbarActivity { public abstract class AbsThemeActivity extends ATHToolbarActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
setTheme(PreferenceUtil.getInstance(this).getTheme());
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setTheme(PreferenceUtil.getInstance(this).getTheme().style);
MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this); MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this);
if (!ThemeStore.coloredNavigationBar(this)) { if (!ThemeStore.coloredNavigationBar(this)) {

View file

@ -0,0 +1,15 @@
package com.dkanada.gramophone.interfaces.base;
import android.content.SharedPreferences;
public abstract class PreferenceMigration {
public final int startVersion;
public final int endVersion;
public PreferenceMigration(int startVersion, int endVersion) {
this.startVersion = startVersion;
this.endVersion = endVersion;
}
public abstract void migrate(SharedPreferences preferences);
}

View file

@ -3,6 +3,8 @@ package com.dkanada.gramophone.model;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.StringRes;
import com.dkanada.gramophone.R; import com.dkanada.gramophone.R;
public class CategoryInfo implements Parcelable { public class CategoryInfo implements Parcelable {
@ -47,6 +49,7 @@ public class CategoryInfo implements Parcelable {
PLAYLISTS(R.string.playlists), PLAYLISTS(R.string.playlists),
FAVORITES(R.string.favorites); FAVORITES(R.string.favorites);
@StringRes
public final int stringRes; public final int stringRes;
Category(int stringRes) { Category(int stringRes) {

View file

@ -0,0 +1,18 @@
package com.dkanada.gramophone.model;
import androidx.annotation.StyleRes;
import com.dkanada.gramophone.R;
public enum Theme {
LIGHT(R.style.Theme_Phonograph_Light),
DARK(R.style.Theme_Phonograph),
BLACK(R.style.Theme_Phonograph_Black);
@StyleRes
public final int style;
Theme(int style) {
this.style = style;
}
}

View file

@ -1,29 +1,34 @@
package com.dkanada.gramophone.util; package com.dkanada.gramophone.util;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Build; import android.os.Build;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import androidx.annotation.StyleRes;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.dkanada.gramophone.model.Theme;
import com.dkanada.gramophone.R; import com.dkanada.gramophone.R;
import com.dkanada.gramophone.helper.sort.SortMethod; import com.dkanada.gramophone.helper.sort.SortMethod;
import com.dkanada.gramophone.helper.sort.SortOrder; import com.dkanada.gramophone.helper.sort.SortOrder;
import com.dkanada.gramophone.model.CategoryInfo; import com.dkanada.gramophone.model.CategoryInfo;
import com.dkanada.gramophone.model.DirectPlayCodec; import com.dkanada.gramophone.model.DirectPlayCodec;
import com.dkanada.gramophone.interfaces.base.PreferenceMigration;
import com.dkanada.gramophone.fragments.player.NowPlayingScreen; import com.dkanada.gramophone.fragments.player.NowPlayingScreen;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@SuppressLint("ApplySharedPref")
public final class PreferenceUtil { public final class PreferenceUtil {
public static final String VERSION = "version";
public static final String SERVER = "server"; public static final String SERVER = "server";
public static final String USER = "user"; public static final String USER = "user";
@ -86,6 +91,22 @@ public final class PreferenceUtil {
public static final String IMAGE_CACHE_SIZE = "image_cache_size"; public static final String IMAGE_CACHE_SIZE = "image_cache_size";
public static final String MEDIA_CACHE_SIZE = "media_cache_size"; public static final String MEDIA_CACHE_SIZE = "media_cache_size";
@SuppressWarnings("ConstantConditions")
private static final PreferenceMigration Migration1 = new PreferenceMigration(0, 1) {
@Override
public void migrate(SharedPreferences preferences) {
String theme = preferences.getString(GENERAL_THEME, "DARK");
String imageSize = preferences.getString(IMAGE_CACHE_SIZE, "400");
String mediaSize = preferences.getString(MEDIA_CACHE_SIZE, "400");
preferences.edit().putString(GENERAL_THEME, Theme.valueOf(theme.toUpperCase()).toString()).commit();
preferences.edit().putString(IMAGE_CACHE_SIZE, imageSize.substring(0, imageSize.length() - 6)).commit();
preferences.edit().putString(MEDIA_CACHE_SIZE, mediaSize.substring(0, imageSize.length() - 6)).commit();
}
};
private static final List<PreferenceMigration> migrations = Collections.singletonList(Migration1);
private static PreferenceUtil instance; private static PreferenceUtil instance;
private final SharedPreferences mPreferences; private final SharedPreferences mPreferences;
@ -94,6 +115,13 @@ public final class PreferenceUtil {
private PreferenceUtil(final Context context) { private PreferenceUtil(final Context context) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(context); mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mContext = context; mContext = context;
for (PreferenceMigration migration : migrations) {
if (mPreferences.getInt(VERSION, 0) == migration.startVersion) {
migration.migrate(mPreferences);
mPreferences.edit().putInt(VERSION, migration.endVersion).commit();
}
}
} }
public static PreferenceUtil getInstance(final Context context) { public static PreferenceUtil getInstance(final Context context) {
@ -112,22 +140,8 @@ public final class PreferenceUtil {
mPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); mPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
} }
@StyleRes public Theme getTheme() {
public int getTheme() { return Theme.valueOf(mPreferences.getString(GENERAL_THEME, Theme.DARK.toString()));
return getThemeResource(mPreferences.getString(GENERAL_THEME, "dark"));
}
@StyleRes
public static int getThemeResource(String themePrefValue) {
switch (themePrefValue) {
case "light":
return R.style.Theme_Phonograph_Light;
case "black":
return R.style.Theme_Phonograph_Black;
case "dark":
default:
return R.style.Theme_Phonograph;
}
} }
public void setPrimaryColor(int color) { public void setPrimaryColor(int color) {
@ -138,6 +152,7 @@ public final class PreferenceUtil {
mPreferences.edit().putInt(ACCENT_COLOR, color).apply(); mPreferences.edit().putInt(ACCENT_COLOR, color).apply();
} }
@SuppressWarnings("ConstantConditions")
public final int getPageSize() { public final int getPageSize() {
return Integer.parseInt(mPreferences.getString(PAGE_SIZE, "100")); return Integer.parseInt(mPreferences.getString(PAGE_SIZE, "100"));
} }
@ -389,12 +404,14 @@ public final class PreferenceUtil {
return mPreferences.getString(LOCATION_CACHE, mContext.getCacheDir().toString()); return mPreferences.getString(LOCATION_CACHE, mContext.getCacheDir().toString());
} }
@SuppressWarnings("ConstantConditions")
public final long getImageCacheSize() { public final long getImageCacheSize() {
return Long.parseLong(mPreferences.getString(IMAGE_CACHE_SIZE, "400000000")); return Long.parseLong(mPreferences.getString(IMAGE_CACHE_SIZE, "400")) * 100000;
} }
@SuppressWarnings("ConstantConditions")
public final long getMediaCacheSize() { public final long getMediaCacheSize() {
return Long.parseLong(mPreferences.getString(MEDIA_CACHE_SIZE, "400000000")); return Long.parseLong(mPreferences.getString(MEDIA_CACHE_SIZE, "400")) * 100000;
} }
public List<CategoryInfo> getCategories() { public List<CategoryInfo> getCategories() {

View file

@ -1,10 +1,7 @@
package com.dkanada.gramophone.views.widgets; package com.dkanada.gramophone.views.widgets;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Point; import android.graphics.Point;
@ -25,7 +22,6 @@ import com.dkanada.gramophone.R;
import com.dkanada.gramophone.glide.CustomGlideRequest; import com.dkanada.gramophone.glide.CustomGlideRequest;
import com.dkanada.gramophone.model.Song; import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.service.MusicService; import com.dkanada.gramophone.service.MusicService;
import com.dkanada.gramophone.activities.MainActivity;
import com.dkanada.gramophone.util.ImageUtil; import com.dkanada.gramophone.util.ImageUtil;
import com.dkanada.gramophone.util.Util; import com.dkanada.gramophone.util.Util;

View file

@ -1,10 +1,7 @@
package com.dkanada.gramophone.views.widgets; package com.dkanada.gramophone.views.widgets;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -26,7 +23,6 @@ import com.dkanada.gramophone.glide.CustomGlideRequest;
import com.dkanada.gramophone.glide.palette.BitmapPaletteWrapper; import com.dkanada.gramophone.glide.palette.BitmapPaletteWrapper;
import com.dkanada.gramophone.model.Song; import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.service.MusicService; import com.dkanada.gramophone.service.MusicService;
import com.dkanada.gramophone.activities.MainActivity;
import com.dkanada.gramophone.util.ImageUtil; import com.dkanada.gramophone.util.ImageUtil;
public class AppWidgetCard extends BaseAppWidget { public class AppWidgetCard extends BaseAppWidget {

View file

@ -1,10 +1,7 @@
package com.dkanada.gramophone.views.widgets; package com.dkanada.gramophone.views.widgets;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -26,7 +23,6 @@ import com.dkanada.gramophone.glide.CustomGlideRequest;
import com.dkanada.gramophone.glide.palette.BitmapPaletteWrapper; import com.dkanada.gramophone.glide.palette.BitmapPaletteWrapper;
import com.dkanada.gramophone.model.Song; import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.service.MusicService; import com.dkanada.gramophone.service.MusicService;
import com.dkanada.gramophone.activities.MainActivity;
import com.dkanada.gramophone.util.ImageUtil; import com.dkanada.gramophone.util.ImageUtil;
public class AppWidgetClassic extends BaseAppWidget { public class AppWidgetClassic extends BaseAppWidget {

View file

@ -7,9 +7,9 @@
</string-array> </string-array>
<string-array name="pref_theme_values"> <string-array name="pref_theme_values">
<item>light</item> <item>LIGHT</item>
<item>dark</item> <item>DARK</item>
<item>black</item> <item>BLACK</item>
</string-array> </string-array>
<string-array name="pref_transcode_codec_titles"> <string-array name="pref_transcode_codec_titles">
@ -61,11 +61,11 @@
</string-array> </string-array>
<string-array name="pref_cache_size_values"> <string-array name="pref_cache_size_values">
<item>10000000000</item> <item>10000</item>
<item>2000000000</item> <item>2000</item>
<item>1000000000</item> <item>1000</item>
<item>400000000</item> <item>400</item>
<item>200000000</item> <item>200</item>
</string-array> </string-array>
</resources> </resources>

View file

@ -6,7 +6,7 @@
<com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEListPreference <com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEListPreference
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
android:defaultValue="400000000" android:defaultValue="400"
android:entries="@array/pref_cache_size_titles" android:entries="@array/pref_cache_size_titles"
android:entryValues="@array/pref_cache_size_values" android:entryValues="@array/pref_cache_size_values"
android:key="image_cache_size" android:key="image_cache_size"
@ -16,7 +16,7 @@
<com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEListPreference <com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEListPreference
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
android:defaultValue="400000000" android:defaultValue="400"
android:entries="@array/pref_cache_size_titles" android:entries="@array/pref_cache_size_titles"
android:entryValues="@array/pref_cache_size_values" android:entryValues="@array/pref_cache_size_values"
android:key="media_cache_size" android:key="media_cache_size"