diff --git a/data/src/main/java/one/nem/kidshift/data/UserSettings.java b/data/src/main/java/one/nem/kidshift/data/UserSettings.java index a4fbdc5..517306f 100644 --- a/data/src/main/java/one/nem/kidshift/data/UserSettings.java +++ b/data/src/main/java/one/nem/kidshift/data/UserSettings.java @@ -2,8 +2,19 @@ package one.nem.kidshift.data; public interface UserSettings { - interface Task { + ApiSetting getApiSetting(); + TaskSetting getTaskSetting(); + + interface ApiSetting { + String getApiBaseUrl(); + void setApiBaseUrl(String url); + } + + interface TaskSetting { int getDefaultIconColor(); + void setDefaultIconColor(int color); String getDefaultIconEmoji(); + void setDefaultIconEmoji(String emoji); + } } diff --git a/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsDummyImpl.java b/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsDummyImpl.java index faa8f88..2386b07 100644 --- a/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsDummyImpl.java +++ b/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsDummyImpl.java @@ -2,19 +2,58 @@ package one.nem.kidshift.data.impl; import android.graphics.Color; +import javax.inject.Inject; + +import dagger.Binds; import one.nem.kidshift.data.UserSettings; public class UserSettingsDummyImpl implements UserSettings { - class Task implements UserSettings.Task { + @Inject + public UserSettingsDummyImpl() { + } + + @Override + public UserSettings.TaskSetting getTaskSetting() { + return new TaskSettingImpl(); + } + + @Override + public UserSettings.ApiSetting getApiSetting() { + return new ApiSettingImpl(); + } + + public class ApiSettingImpl implements UserSettings.ApiSetting { + @Override + public String getApiBaseUrl() { + return "https://kidshift-beta.nem.one/"; + } + + @Override + public void setApiBaseUrl(String url) { + + } + } + + public class TaskSettingImpl implements UserSettings.TaskSetting { @Override public int getDefaultIconColor() { return Color.parseColor("#FF0000"); } + @Override + public void setDefaultIconColor(int color) { + + } + @Override public String getDefaultIconEmoji() { return "🤔"; } + + @Override + public void setDefaultIconEmoji(String emoji) { + + } } } diff --git a/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsImpl.java b/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsImpl.java new file mode 100644 index 0000000..a3c6726 --- /dev/null +++ b/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsImpl.java @@ -0,0 +1,114 @@ +package one.nem.kidshift.data.impl; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Objects; + +import javax.inject.Inject; + +import one.nem.kidshift.data.UserSettings; +import one.nem.kidshift.utils.SharedPrefUtils; +import one.nem.kidshift.utils.factory.SharedPrefUtilsFactory; + +public class UserSettingsImpl implements UserSettings { + + SharedPrefUtilsFactory sharedPrefUtilsFactory; + + @Inject + public UserSettingsImpl(SharedPrefUtilsFactory sharedPrefUtilsFactory) { + this.sharedPrefUtilsFactory = sharedPrefUtilsFactory; + } + + @Override + public ApiSetting getApiSetting() { + return new ApiSettingImpl(); + } + + @Override + public TaskSetting getTaskSetting() { + return new TaskSettingImpl(); + } + + public class ApiSettingImpl implements UserSettings.ApiSetting { + + transient + SharedPrefUtils sharedPrefUtils; + + String apiBaseUrl; + + ApiSettingImpl() { + sharedPrefUtils = sharedPrefUtilsFactory.create("user_settings"); + ApiSettingImpl apiSetting = sharedPrefUtils.getObject("api_setting", ApiSettingImpl.class); + // TODO: リフレクションつかって一括でやる?(プロパティ数があまりにも増えるなら?), 三項演算子やめる?, デフォルト値の設定方法を改善する + if (apiSetting != null) { + apiBaseUrl = apiSetting.apiBaseUrl.isEmpty() ? "https://kidshift-beta.nem.one/" : apiSetting.apiBaseUrl; + } else { + apiBaseUrl = "https://kidshift-beta.nem.one/"; + } + } + + private void save() { + sharedPrefUtils.saveObject("api_setting", this); + } + + @Override + public String getApiBaseUrl() { + return apiBaseUrl; + } + + @Override + public void setApiBaseUrl(String url) { + apiBaseUrl = url; + save(); + } + } + + public class TaskSettingImpl implements UserSettings.TaskSetting { + + transient + SharedPrefUtils sharedPrefUtils; + + int defaultIconColor; + + String defaultIconEmoji; + + TaskSettingImpl() { + sharedPrefUtils = sharedPrefUtilsFactory.create("user_settings"); + TaskSettingImpl taskSetting = sharedPrefUtils.getObject("task_setting", TaskSettingImpl.class); + if (taskSetting != null) { + defaultIconColor = taskSetting.getDefaultIconColor() == 0 ? 0 : taskSetting.getDefaultIconColor(); + defaultIconEmoji = taskSetting.getDefaultIconEmoji().isEmpty() ? "" : taskSetting.getDefaultIconEmoji(); + } else { + defaultIconColor = 0; + defaultIconEmoji = ""; + } + } + + private void save() { + sharedPrefUtils.saveObject("task_setting", this); + } + + @Override + public int getDefaultIconColor() { + return defaultIconColor; + } + + @Override + public void setDefaultIconColor(int color) { + defaultIconColor = color; + save(); + } + + @Override + public String getDefaultIconEmoji() { + return defaultIconEmoji; + } + + @Override + public void setDefaultIconEmoji(String emoji) { + defaultIconEmoji = emoji; + save(); + } + } +} diff --git a/data/src/main/java/one/nem/kidshift/data/modules/UserSettingsDummyModule.java b/data/src/main/java/one/nem/kidshift/data/modules/UserSettingsDummyModule.java index 037555f..79b9674 100644 --- a/data/src/main/java/one/nem/kidshift/data/modules/UserSettingsDummyModule.java +++ b/data/src/main/java/one/nem/kidshift/data/modules/UserSettingsDummyModule.java @@ -4,13 +4,18 @@ import dagger.Binds; import dagger.Module; import dagger.hilt.InstallIn; import dagger.hilt.android.components.FragmentComponent; +import dagger.hilt.components.SingletonComponent; import one.nem.kidshift.data.UserSettings; import one.nem.kidshift.data.impl.UserSettingsDummyImpl; +import one.nem.kidshift.data.impl.UserSettingsImpl; @Module -@InstallIn(FragmentComponent.class) +@InstallIn(SingletonComponent.class) abstract public class UserSettingsDummyModule { +// @Binds +// abstract UserSettings bindUserSettings(UserSettingsDummyImpl userSettingsDummyImpl); + @Binds - abstract UserSettings bindUserSettings(UserSettingsDummyImpl userSettingsDummyImpl); + public abstract UserSettings bindUserSettings(UserSettingsImpl userSettingsImpl); } diff --git a/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugCommandProcessor.java b/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugCommandProcessor.java index d34b5f2..51990e8 100644 --- a/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugCommandProcessor.java +++ b/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugCommandProcessor.java @@ -1,5 +1,7 @@ package one.nem.kidshift.feature.debug; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -10,6 +12,7 @@ import dagger.hilt.EntryPoint; import dagger.hilt.InstallIn; import dagger.hilt.android.AndroidEntryPoint; import dagger.hilt.android.components.FragmentComponent; +import one.nem.kidshift.data.UserSettings; import one.nem.kidshift.utils.FeatureFlag; import one.nem.kidshift.utils.KSLogger; import one.nem.kidshift.utils.models.LogModel; @@ -20,12 +23,16 @@ public class DebugCommandProcessor { KSLogger ksLogger; FeatureFlag featureFlag; + UserSettings userSettings; + public DebugCommandProcessor( KSLogger ksLogger, - FeatureFlag featureFlag + FeatureFlag featureFlag, + UserSettings userSettings ) { this.ksLogger = ksLogger; this.featureFlag = featureFlag; + this.userSettings = userSettings; } public String execute(String command) { @@ -52,11 +59,64 @@ public class DebugCommandProcessor { return executeLog(commandArray); case "flag": return executeFlag(commandArray); + case "setting": + return executeSetting(commandArray); default: throw new InvalidCommandException(); } } + // TODO: リフレクション処理切り出し, 複数の引数に対応, String以外の引数に対応 + private String executeSetting(String[] commandArray) { + commandArray = shiftArray(commandArray); + Class settingClazz; + switch (commandArray[0]) { + case "get": + commandArray = shiftArray(commandArray); + // リフレクションで取得 + try { + // userSettingsのgetterでsettingクラスを取得 + Method method = userSettings.getClass().getMethod("get" + commandArray[0]); + Object setting = method.invoke(userSettings); + + //settingクラスのgetterで値を取得 + Method settingMethod = setting.getClass().getMethod("get" + commandArray[1]); + return settingMethod.invoke(setting).toString(); + } catch (NoSuchMethodException e) { + return "Method" + commandArray[0] + " not found \n" + e.getMessage(); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + return "Method" + commandArray[0] + " not accessible \n" + e.getMessage(); + } catch (Exception e) { + return "Something went wrong! \n" + e.getMessage(); + } + case "set": + commandArray = shiftArray(commandArray); + // リフレクションで取得 + try { + // userSettingsのgetterでsettingクラスを取得 + Method method = userSettings.getClass().getMethod("get" + commandArray[0]); + Object setting = method.invoke(userSettings); + + //settingクラスのsetterで値を設定 + Method settingMethod = setting.getClass().getMethod("set" + commandArray[1], String.class); // TODO: String以外の型に対応 + settingMethod.invoke(setting, commandArray[2]); + return "Setting set!"; + } catch (NoSuchMethodException e) { + return "Method" + commandArray[0] + " not found \n" + e.getMessage(); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + return "Method" + commandArray[0] + " not accessible \n" + e.getMessage(); + } catch (Exception e) { + return "Something went wrong! \n" + e.getMessage(); + } + default: + return "TODO"; + } + } + private String executeLog(String[] commandArray) { commandArray = shiftArray(commandArray); switch (commandArray[0]) { diff --git a/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugDebugConsoleFragment.java b/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugDebugConsoleFragment.java index 76e58d1..1c6ccd9 100644 --- a/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugDebugConsoleFragment.java +++ b/feature/debug/src/main/java/one/nem/kidshift/feature/debug/DebugDebugConsoleFragment.java @@ -16,6 +16,7 @@ import java.util.List; import javax.inject.Inject; import dagger.hilt.android.AndroidEntryPoint; +import one.nem.kidshift.data.UserSettings; import one.nem.kidshift.feature.debug.adapter.DebugCommandListItemAdapter; import one.nem.kidshift.feature.debug.model.DebugCommandItemModel; import one.nem.kidshift.utils.FeatureFlag; @@ -29,6 +30,9 @@ public class DebugDebugConsoleFragment extends Fragment { @Inject FeatureFlag featureFlag; + @Inject + UserSettings userSettings; + private final List debugCommandItemModels = new ArrayList<>(); DebugCommandListItemAdapter debugCommandItemAdapter; @@ -59,7 +63,7 @@ public class DebugDebugConsoleFragment extends Fragment { TextView debugCommandInput = view.findViewById(R.id.debugCommandEditText); view.findViewById(R.id.debugCommandExecuteButton).setOnClickListener(v -> { DebugCommandProcessor debugCommandProcessor = new DebugCommandProcessor( - ksLogger, featureFlag); + ksLogger, featureFlag, userSettings); debugCommandItemModels.add( new DebugCommandItemModel( debugCommandInput.getText().toString(),