Merge pull request 'API接続準備(baseUrlをDebugConsoleから設定出来るように)' (#78) from feature/add-api-configure into main

Reviewed-on: #78
This commit is contained in:
Fujimatsu 2024-06-21 03:18:26 +00:00
commit f882eb9f67
6 changed files with 239 additions and 6 deletions

View File

@ -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);
}
}

View File

@ -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) {
}
}
}

View File

@ -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();
}
}
}

View File

@ -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);
}

View File

@ -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]) {

View File

@ -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<DebugCommandItemModel> 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(),