From 0a62838b07e36fad048e35311916b2957b92ed3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:10:11 +0900 Subject: [PATCH 01/10] =?UTF-8?q?FeatureFlag=E5=AE=9F=E8=A3=85=20WIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kidshift/utils/impl/FeatureFlagImpl.java | 137 ++++++++++++++++++ .../models/feature/FeatureFlagItemModel.java | 57 ++++++++ .../kidshift/utils/modules/FeatureFlag.java | 18 +++ 3 files changed, 212 insertions(+) create mode 100644 utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java create mode 100644 utils/src/main/java/one/nem/kidshift/utils/models/feature/FeatureFlagItemModel.java create mode 100644 utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java new file mode 100644 index 0000000..eebd66f --- /dev/null +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -0,0 +1,137 @@ +package one.nem.kidshift.utils.impl; + +import android.content.Context; +import android.content.SharedPreferences; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import javax.inject.Inject; + +import dagger.hilt.android.qualifiers.ApplicationContext; +import one.nem.kidshift.utils.models.feature.FeatureFlagItemModel; +import one.nem.kidshift.utils.modules.FeatureFlag; + +public class FeatureFlagImpl implements FeatureFlag { + + private final Context applicationContext; + + private final SharedPreferences sharedPreferences; + + // ここを書き換えてプロファイルを書き換え + private final Profile currentProfile = Profile.DEVELOP; + + enum Profile { + DEVELOP("develop"), + BETA("beta"), + PRODUCTION("production"); + + private final String name; + + Profile(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + @Inject + public FeatureFlagImpl(@ApplicationContext Context applicationContext) { + this.applicationContext = applicationContext; + this.sharedPreferences = applicationContext.getSharedPreferences("feat_flg", Context.MODE_PRIVATE); + + initBase(); + switch (currentProfile) { + case DEVELOP: + initDevelop(); + break; + case BETA: + initBeta(); + break; + case PRODUCTION: + break; + } + } + + private HashMap featureFlagMap = new HashMap<>(); + + // init + private void initBase() { // ベース, (= Production) + setFlag("isBaseEnabled", true, false); + setFlag("isBetaEnabled", false, false); + setFlag("isDevelopEnabled", false, false); + } + + private void initBeta() { // 上書き + setFlag("isBaseEnabled", false, true); + setFlag("isBetaEnabled", true, true); + setFlag("isDevelopEnabled", false, true); + } + + private void initDevelop() { // 上書き + setFlag("isBaseEnabled", false, true); + setFlag("isBetaEnabled", false, true); + setFlag("isDevelopEnabled", true, true); + } + + // utils + private void setFlag(String key, boolean defaultValue, boolean isOverrideAllowed) { + featureFlagMap.put(key, new FeatureFlagItemModel(key, defaultValue, isOverrideAllowed)); + } + + // Restore override from shared preferences + private void restoreOverride() { + // 前回起動時からプロファイルが変わっている場合は、オーバーライドをリセット + if (sharedPreferences.contains("last_profile") && !sharedPreferences.getString("last_profile", "").equals(currentProfile.getName())) { + sharedPreferences.edit().clear().apply(); + sharedPreferences.edit().putString("last_profile", currentProfile.getName()).apply(); + return; + } + sharedPreferences.edit().putString("last_profile", currentProfile.getName()).apply(); + for (String key : featureFlagMap.keySet()) { + Objects.requireNonNull(featureFlagMap.get(key)) + .setValue(sharedPreferences.getBoolean(key, Objects.requireNonNull(featureFlagMap.get(key)).getValue())); + } + } + + @Override + public Map getFeatureFlagMap() { + return null; + } + + @Override + public boolean isEnabled(String key) { + return Objects.requireNonNull(featureFlagMap.get(key)).state(); + } + + @Override + public void setOverride(String key, boolean value) throws IllegalArgumentException { + // 存在するか, オーバーライド可能か + if (!featureFlagMap.containsKey(key) || !Objects.requireNonNull(featureFlagMap.get(key)).getIsOverrideAllowed()) { + throw new IllegalArgumentException("Invalid key or not allowed to override"); + } + Objects.requireNonNull(featureFlagMap.get(key)).setValue(value); + sharedPreferences.edit().putBoolean(key, value).apply(); + } + + @Override + public void resetOverride(String key) throws IllegalArgumentException { + // 存在するか, オーバーライド可能か + if (!featureFlagMap.containsKey(key) || !Objects.requireNonNull(featureFlagMap.get(key)).getIsOverrideAllowed()) { + throw new IllegalArgumentException("Invalid key or not allowed to override"); + } + Objects.requireNonNull(featureFlagMap.get(key)).setValue(Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()); + sharedPreferences.edit().putBoolean(key, Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()).apply(); + } + + @Override + public void resetAllOverrides() { + for (String key : featureFlagMap.keySet()) { + Objects.requireNonNull(featureFlagMap.get(key)).setValue(Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()); + sharedPreferences.edit().putBoolean(key, Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()).apply(); + } + } +} diff --git a/utils/src/main/java/one/nem/kidshift/utils/models/feature/FeatureFlagItemModel.java b/utils/src/main/java/one/nem/kidshift/utils/models/feature/FeatureFlagItemModel.java new file mode 100644 index 0000000..40f7191 --- /dev/null +++ b/utils/src/main/java/one/nem/kidshift/utils/models/feature/FeatureFlagItemModel.java @@ -0,0 +1,57 @@ +package one.nem.kidshift.utils.models.feature; + +public class FeatureFlagItemModel { + private String key; + private boolean value; + private boolean defaultValue; + private boolean isOverrideAllowed; + + public FeatureFlagItemModel(String key, boolean value, boolean defaultValue, boolean isOverrideAllowed) { + this.key = key; + this.value = value; + this.defaultValue = defaultValue; + this.isOverrideAllowed = isOverrideAllowed; + } + + public FeatureFlagItemModel(String key, boolean defaultValue, boolean isOverrideAllowed) { + this.key = key; + this.defaultValue = defaultValue; + this.isOverrideAllowed = isOverrideAllowed; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public boolean getValue() { + return value; + } + + public void setValue(boolean value) { + this.value = value; + } + + public boolean getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(boolean defaultValue) { + this.defaultValue = defaultValue; + } + + public boolean getIsOverrideAllowed() { + return isOverrideAllowed; + } + + public void setIsOverrideAllowed(boolean isOverrideAllowed) { + this.isOverrideAllowed = isOverrideAllowed; + } + + public boolean state() { + return isOverrideAllowed ? value : defaultValue; + } +} diff --git a/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java b/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java new file mode 100644 index 0000000..d52b3f1 --- /dev/null +++ b/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java @@ -0,0 +1,18 @@ +package one.nem.kidshift.utils.modules; + +import java.util.Map; + +import one.nem.kidshift.utils.models.feature.FeatureFlagItemModel; + +public interface FeatureFlag { + + public boolean isEnabled(String key); + + public void setOverride(String key, boolean value) throws IllegalArgumentException; + + public void resetOverride(String key) throws IllegalArgumentException; + + public void resetAllOverrides(); + + public Map getFeatureFlagMap(); +} From 578c156d2e22bcef2fb36941fed6655fe741b59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:11:25 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=E5=88=87=E3=82=8A=E5=87=BA=E3=81=97?= =?UTF-8?q?=EF=BC=8C=E5=85=A8=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/nem/kidshift/utils/impl/FeatureFlagImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java index eebd66f..4d70cc5 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -42,7 +42,10 @@ public class FeatureFlagImpl implements FeatureFlag { public FeatureFlagImpl(@ApplicationContext Context applicationContext) { this.applicationContext = applicationContext; this.sharedPreferences = applicationContext.getSharedPreferences("feat_flg", Context.MODE_PRIVATE); + init(); + } + private void init() { initBase(); switch (currentProfile) { case DEVELOP: @@ -54,6 +57,7 @@ public class FeatureFlagImpl implements FeatureFlag { case PRODUCTION: break; } + restoreOverride(); } private HashMap featureFlagMap = new HashMap<>(); @@ -129,9 +133,7 @@ public class FeatureFlagImpl implements FeatureFlag { @Override public void resetAllOverrides() { - for (String key : featureFlagMap.keySet()) { - Objects.requireNonNull(featureFlagMap.get(key)).setValue(Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()); - sharedPreferences.edit().putBoolean(key, Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()).apply(); - } + sharedPreferences.edit().clear().apply(); + init(); } } From 649448d36d59e781e981374f99a80283ee90a5e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:13:20 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=E3=83=91=E3=82=B9=E3=83=9F=E3=82=B9?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/one/nem/kidshift/utils/{modules => }/FeatureFlag.java | 2 +- .../main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename utils/src/main/java/one/nem/kidshift/utils/{modules => }/FeatureFlag.java (91%) diff --git a/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java b/utils/src/main/java/one/nem/kidshift/utils/FeatureFlag.java similarity index 91% rename from utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java rename to utils/src/main/java/one/nem/kidshift/utils/FeatureFlag.java index d52b3f1..6afb6e5 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlag.java +++ b/utils/src/main/java/one/nem/kidshift/utils/FeatureFlag.java @@ -1,4 +1,4 @@ -package one.nem.kidshift.utils.modules; +package one.nem.kidshift.utils; import java.util.Map; diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java index 4d70cc5..26748fa 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -11,7 +11,7 @@ import javax.inject.Inject; import dagger.hilt.android.qualifiers.ApplicationContext; import one.nem.kidshift.utils.models.feature.FeatureFlagItemModel; -import one.nem.kidshift.utils.modules.FeatureFlag; +import one.nem.kidshift.utils.FeatureFlag; public class FeatureFlagImpl implements FeatureFlag { From 23b16a0fb7bde132ef10366650393592e4a93719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:14:33 +0900 Subject: [PATCH 04/10] =?UTF-8?q?Bind=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/modules/FeatureFlagModule.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlagModule.java diff --git a/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlagModule.java b/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlagModule.java new file mode 100644 index 0000000..9e27393 --- /dev/null +++ b/utils/src/main/java/one/nem/kidshift/utils/modules/FeatureFlagModule.java @@ -0,0 +1,16 @@ +package one.nem.kidshift.utils.modules; + +import dagger.Binds; +import dagger.Module; +import dagger.hilt.InstallIn; +import dagger.hilt.components.SingletonComponent; +import one.nem.kidshift.utils.FeatureFlag; +import one.nem.kidshift.utils.impl.FeatureFlagImpl; + +@Module +@InstallIn(SingletonComponent.class) +abstract public class FeatureFlagModule { + + @Binds + public abstract FeatureFlag bindFeatureFlag(FeatureFlagImpl featureFlagImpl); +} From c4ecead6552e40d9061cf8620781f10f1d6beaf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:31:34 +0900 Subject: [PATCH 05/10] WIP --- .../feature/debug/DebugCommandProcessor.java | 67 ++++++++++++++++++- .../debug/DebugDebugConsoleFragment.java | 6 +- .../kidshift/utils/impl/FeatureFlagImpl.java | 1 + 3 files changed, 72 insertions(+), 2 deletions(-) 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 759aad6..e997a98 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 @@ -9,17 +9,22 @@ import dagger.hilt.EntryPoint; import dagger.hilt.InstallIn; import dagger.hilt.android.AndroidEntryPoint; import dagger.hilt.android.components.FragmentComponent; +import one.nem.kidshift.utils.FeatureFlag; import one.nem.kidshift.utils.KSLogger; import one.nem.kidshift.utils.models.LogModel; +import one.nem.kidshift.utils.models.feature.FeatureFlagItemModel; public class DebugCommandProcessor { KSLogger ksLogger; + FeatureFlag featureFlag; public DebugCommandProcessor( - KSLogger ksLogger + KSLogger ksLogger, + FeatureFlag featureFlag ) { this.ksLogger = ksLogger; + this.featureFlag = featureFlag; } public String execute(String command) { @@ -44,6 +49,8 @@ public class DebugCommandProcessor { return executeEcho(commandArray); case "log": return executeLog(commandArray); + case "flag": + return executeFlag(commandArray); default: throw new InvalidCommandException(); } @@ -93,6 +100,64 @@ public class DebugCommandProcessor { } } + private String executeFlag(String[] commandArray) { + switch (commandArray[1]) { + case "get": + if (commandArray.length == 3) { + FeatureFlagItemModel featureFlagItemModel = featureFlag.getFeatureFlagMap().get(commandArray[2]); + return makeFeatureFlagResponse(featureFlagItemModel); + } else { + if (commandArray[2].equals("all")) { + StringBuilder featureFlagString = new StringBuilder(); + for (FeatureFlagItemModel featureFlagItemModel : featureFlag.getFeatureFlagMap().values()) { + featureFlagString.append(makeFeatureFlagResponse(featureFlagItemModel)); + featureFlagString.append("\n"); + } + return featureFlagString.toString(); + } else { + return "TODO"; + } + } + case "set": + if (commandArray.length == 5) { + try { + boolean value = Boolean.parseBoolean(commandArray[4]); + featureFlag.getFeatureFlagMap().get(commandArray[2]).setValue(value); + } catch (IllegalArgumentException e) { + return e.getMessage(); + } catch (NullPointerException e) { + return "Feature Flag not found"; + } catch (Exception e) { + return "Something went wrong! \n" + e.getMessage(); + } + return "Success"; + } else { + return "TODO"; + } + case "reset": + if (commandArray.length == 3) { + featureFlag.getFeatureFlagMap().get(commandArray[2]).setValue(featureFlag.getFeatureFlagMap().get(commandArray[2]).getDefaultValue()); + return "Success"; + } else { + return "TODO"; + } + default: + // debug + if (this.featureFlag == null) { + return "Feature Flag is null"; + } else { + return "Feature Flag is not null"; + } + } + } + + private String makeFeatureFlagResponse(FeatureFlagItemModel featureFlagItemModel) { + return "Key: " + featureFlagItemModel.getKey() + "\n" + + "\tValue: " + featureFlagItemModel.getValue() + "\n" + + "\tDefault Value: " + featureFlagItemModel.getDefaultValue() + "\n" + + "\tIs Override Allowed: " + featureFlagItemModel.getIsOverrideAllowed(); + } + private String executeEcho(String[] commandArray) { String[] echoArray = Arrays.copyOfRange(commandArray, 1, commandArray.length); return String.join(" ", echoArray); 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 6b076a3..446a48c 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 @@ -19,6 +19,7 @@ import dagger.hilt.android.AndroidEntryPoint; import one.nem.kidshift.feature.debug.adapter.DebugCommandListItemAdapter; import one.nem.kidshift.feature.debug.adapter.DebugMenuListItemAdapter; import one.nem.kidshift.feature.debug.model.DebugCommandItemModel; +import one.nem.kidshift.utils.FeatureFlag; import one.nem.kidshift.utils.KSLogger; /** @@ -32,6 +33,9 @@ public class DebugDebugConsoleFragment extends Fragment { @Inject KSLogger ksLogger; + @Inject + FeatureFlag featureFlag; + private final List debugCommandItemModels = new ArrayList<>(); DebugCommandListItemAdapter debugCommandItemAdapter; @@ -98,7 +102,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); + ksLogger, featureFlag); debugCommandItemModels.add( new DebugCommandItemModel( debugCommandInput.getText().toString(), diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java index 26748fa..3dd1eb4 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -67,6 +67,7 @@ public class FeatureFlagImpl implements FeatureFlag { setFlag("isBaseEnabled", true, false); setFlag("isBetaEnabled", false, false); setFlag("isDevelopEnabled", false, false); + setFlag("overrideTest", false, true); } private void initBeta() { // 上書き From 48c33a13e01a51c77aa58f1574ce2906b07f7e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:31:42 +0900 Subject: [PATCH 06/10] fix --- .../main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java index 3dd1eb4..5b6a4fa 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -104,7 +104,7 @@ public class FeatureFlagImpl implements FeatureFlag { @Override public Map getFeatureFlagMap() { - return null; + return featureFlagMap; } @Override From db91136a0677bc794c1ae139402c65512a48147c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:54:13 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=BB=E3=83=83?= =?UTF-8?q?=E3=82=B5=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/debug/DebugCommandProcessor.java | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) 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 e997a98..0fb1cea 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 @@ -2,6 +2,7 @@ package one.nem.kidshift.feature.debug; import java.util.Arrays; import java.util.List; +import java.util.Objects; import javax.inject.Inject; @@ -101,45 +102,38 @@ public class DebugCommandProcessor { } private String executeFlag(String[] commandArray) { - switch (commandArray[1]) { + commandArray = shiftArray(commandArray); + switch (commandArray[0]) { case "get": - if (commandArray.length == 3) { - FeatureFlagItemModel featureFlagItemModel = featureFlag.getFeatureFlagMap().get(commandArray[2]); - return makeFeatureFlagResponse(featureFlagItemModel); - } else { - if (commandArray[2].equals("all")) { - StringBuilder featureFlagString = new StringBuilder(); - for (FeatureFlagItemModel featureFlagItemModel : featureFlag.getFeatureFlagMap().values()) { - featureFlagString.append(makeFeatureFlagResponse(featureFlagItemModel)); - featureFlagString.append("\n"); - } - return featureFlagString.toString(); - } else { - return "TODO"; + commandArray = shiftArray(commandArray); + if (Objects.equals(commandArray[0], "all")) { + StringBuilder flagString = new StringBuilder(); + for (FeatureFlagItemModel featureFlagItemModel : featureFlag.getFeatureFlagMap().values()) { + flagString.append(makeFeatureFlagResponse(featureFlagItemModel)); + flagString.append("\n"); } + return flagString.toString(); } + FeatureFlagItemModel featureFlagItemModel = featureFlag.getFeatureFlagMap().get(commandArray[0]); + return makeFeatureFlagResponse(featureFlagItemModel); case "set": - if (commandArray.length == 5) { - try { - boolean value = Boolean.parseBoolean(commandArray[4]); - featureFlag.getFeatureFlagMap().get(commandArray[2]).setValue(value); - } catch (IllegalArgumentException e) { - return e.getMessage(); - } catch (NullPointerException e) { - return "Feature Flag not found"; - } catch (Exception e) { - return "Something went wrong! \n" + e.getMessage(); - } - return "Success"; - } else { - return "TODO"; + commandArray = shiftArray(commandArray); + try { + featureFlag.setOverride(commandArray[0], Boolean.parseBoolean(commandArray[1])); + return "Flag set!"; + } catch (IllegalArgumentException e) { + return e.getMessage(); + } catch (Exception e) { + return "Something went wrong! \n" + e.getMessage(); } case "reset": - if (commandArray.length == 3) { - featureFlag.getFeatureFlagMap().get(commandArray[2]).setValue(featureFlag.getFeatureFlagMap().get(commandArray[2]).getDefaultValue()); - return "Success"; - } else { - return "TODO"; + commandArray = shiftArray(commandArray); + try { + featureFlag.resetOverride(commandArray[0]); + } catch (IllegalArgumentException e) { + return e.getMessage(); + } catch (Exception e) { + return "Something went wrong! \n" + e.getMessage(); } default: // debug @@ -151,6 +145,14 @@ public class DebugCommandProcessor { } } + private String[] shiftArray(String[] array, int shift) { + return Arrays.copyOfRange(array, shift, array.length); + } + + private String[] shiftArray(String[] array) { + return shiftArray(array, 1); + } + private String makeFeatureFlagResponse(FeatureFlagItemModel featureFlagItemModel) { return "Key: " + featureFlagItemModel.getKey() + "\n" + "\tValue: " + featureFlagItemModel.getValue() + "\n" + From 554b5cb3fe46fde6412e9f14750bb275da9e44c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:54:21 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=83=86=E3=82=B9=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/nem/kidshift/utils/impl/FeatureFlagImpl.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java index 5b6a4fa..2c16679 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -114,9 +114,12 @@ public class FeatureFlagImpl implements FeatureFlag { @Override public void setOverride(String key, boolean value) throws IllegalArgumentException { - // 存在するか, オーバーライド可能か - if (!featureFlagMap.containsKey(key) || !Objects.requireNonNull(featureFlagMap.get(key)).getIsOverrideAllowed()) { - throw new IllegalArgumentException("Invalid key or not allowed to override"); + // 存在しないキーなら例外 + if (!featureFlagMap.containsKey(key)) { + throw new IllegalArgumentException("Invalid key"); + } + if (!Objects.requireNonNull(featureFlagMap.get(key)).getIsOverrideAllowed()) { + throw new IllegalArgumentException("Not allowed to override"); } Objects.requireNonNull(featureFlagMap.get(key)).setValue(value); sharedPreferences.edit().putBoolean(key, value).apply(); From b344416945d1643aeb9b5dca3ba635e0ab76fcfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:54:40 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E6=AF=94?= =?UTF-8?q?=E8=BC=83=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java index 2c16679..7b7f68b 100644 --- a/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java +++ b/utils/src/main/java/one/nem/kidshift/utils/impl/FeatureFlagImpl.java @@ -127,10 +127,6 @@ public class FeatureFlagImpl implements FeatureFlag { @Override public void resetOverride(String key) throws IllegalArgumentException { - // 存在するか, オーバーライド可能か - if (!featureFlagMap.containsKey(key) || !Objects.requireNonNull(featureFlagMap.get(key)).getIsOverrideAllowed()) { - throw new IllegalArgumentException("Invalid key or not allowed to override"); - } Objects.requireNonNull(featureFlagMap.get(key)).setValue(Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()); sharedPreferences.edit().putBoolean(key, Objects.requireNonNull(featureFlagMap.get(key)).getDefaultValue()).apply(); } From bc05a6d0a0ae61f9c22c8e297e84cc3a28e613f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Thu, 13 Jun 2024 15:56:10 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=E5=85=A8=E3=83=AA=E3=82=BB=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nem/kidshift/feature/debug/DebugCommandProcessor.java | 5 +++++ 1 file changed, 5 insertions(+) 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 0fb1cea..7535d89 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 @@ -128,8 +128,13 @@ public class DebugCommandProcessor { } case "reset": commandArray = shiftArray(commandArray); + if (Objects.equals(commandArray[0], "all")) { + featureFlag.resetAllOverrides(); + return "All flags reset!"; + } try { featureFlag.resetOverride(commandArray[0]); + return "Flag reset!"; } catch (IllegalArgumentException e) { return e.getMessage(); } catch (Exception e) {