From 030ddd6f461f35bab11c96de7f81a01a695f89c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 10:38:44 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E7=94=A8=E3=82=A4=E3=83=B3=E3=82=BF=E3=83=95=E3=82=A7?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/main/java/one/nem/kidshift/data/UserSettings.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 ea4ed71..cd9f093 100644 --- a/data/src/main/java/one/nem/kidshift/data/UserSettings.java +++ b/data/src/main/java/one/nem/kidshift/data/UserSettings.java @@ -7,6 +7,7 @@ public interface UserSettings { ApiSetting getApiSetting(); TaskSetting getTaskSetting(); AppCommonSetting getAppCommonSetting(); + SharedPrefCache getCache(); interface AppCommonSetting { boolean isLoggedIn(); @@ -19,6 +20,11 @@ public interface UserSettings { void setChildMode(boolean childMode); } + interface SharedPrefCache { + ParentModel getParent(); + void setParent(ParentModel parent); + } + interface ApiSetting { String getApiBaseUrl(); void setApiBaseUrl(String url); From 7382a7a36abc9e840bcb84932cbb85e3703f8d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 10:40:16 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kidshift/data/impl/UserSettingsImpl.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) 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 index 4686f15..40d341c 100644 --- a/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsImpl.java +++ b/data/src/main/java/one/nem/kidshift/data/impl/UserSettingsImpl.java @@ -8,6 +8,7 @@ import java.util.Objects; import javax.inject.Inject; import one.nem.kidshift.data.UserSettings; +import one.nem.kidshift.model.ParentModel; import one.nem.kidshift.utils.SharedPrefUtils; import one.nem.kidshift.utils.factory.SharedPrefUtilsFactory; @@ -35,6 +36,44 @@ public class UserSettingsImpl implements UserSettings { return new AppCommonSettingImpl(); } + @Override + public SharedPrefCache getCache() { + return new SharedPrefCacheImpl(); + } + + public class SharedPrefCacheImpl implements UserSettings.SharedPrefCache { + + transient + SharedPrefUtils sharedPrefUtils; + + ParentModel parent; + + SharedPrefCacheImpl() { + sharedPrefUtils = sharedPrefUtilsFactory.create("user_settings"); + SharedPrefCacheImpl sharedPrefCache = sharedPrefUtils.getObject("shared_pref_cache", SharedPrefCacheImpl.class); + if (sharedPrefCache != null) { + parent = sharedPrefCache.getParent(); + } else { + parent = null; + } + } + + private void save() { + sharedPrefUtils.saveObject("shared_pref_cache", this); + } + + @Override + public ParentModel getParent() { + return parent; + } + + @Override + public void setParent(ParentModel parent) { + this.parent = parent; + save(); + } + } + public class AppCommonSettingImpl implements UserSettings.AppCommonSetting { transient From 66ba9121709f0de35c58dc98d6193c704cac7a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 10:52:12 +0900 Subject: [PATCH 3/9] =?UTF-8?q?syncParent=E6=88=BB=E3=82=8A=E5=80=A4?= =?UTF-8?q?=E5=9E=8B=E5=A4=89=E6=9B=B4,=20=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/one/nem/kidshift/data/KSActions.java | 6 ++- .../nem/kidshift/data/impl/KSActionsImpl.java | 45 +++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/data/src/main/java/one/nem/kidshift/data/KSActions.java b/data/src/main/java/one/nem/kidshift/data/KSActions.java index d4161ee..732d810 100644 --- a/data/src/main/java/one/nem/kidshift/data/KSActions.java +++ b/data/src/main/java/one/nem/kidshift/data/KSActions.java @@ -1,5 +1,9 @@ package one.nem.kidshift.data; +import java.util.concurrent.CompletableFuture; + +import one.nem.kidshift.model.ParentModel; + /** * データの同期など, ユーザーからの操作に基づかない処理を行う */ @@ -12,6 +16,6 @@ public interface KSActions { /** * 親ユーザー情報同期 */ - void syncParent(); + CompletableFuture syncParent(); } diff --git a/data/src/main/java/one/nem/kidshift/data/impl/KSActionsImpl.java b/data/src/main/java/one/nem/kidshift/data/impl/KSActionsImpl.java index b6dbc2a..9cf9f7c 100644 --- a/data/src/main/java/one/nem/kidshift/data/impl/KSActionsImpl.java +++ b/data/src/main/java/one/nem/kidshift/data/impl/KSActionsImpl.java @@ -1,17 +1,30 @@ package one.nem.kidshift.data.impl; +import java.util.concurrent.CompletableFuture; + import javax.inject.Inject; import one.nem.kidshift.data.KSActions; import one.nem.kidshift.data.UserSettings; +import one.nem.kidshift.data.retrofit.KidShiftApiService; +import one.nem.kidshift.data.retrofit.model.parent.ParentInfoResponse; +import one.nem.kidshift.model.ParentModel; +import one.nem.kidshift.utils.KSLogger; +import retrofit2.Call; +import retrofit2.Response; public class KSActionsImpl implements KSActions { private UserSettings userSettings; + private KidShiftApiService kidShiftApiService; + private KSLogger logger; @Inject - public KSActionsImpl(UserSettings userSettings) { + public KSActionsImpl(UserSettings userSettings, KidShiftApiService kidShiftApiService, KSLogger logger) { this.userSettings = userSettings; + this.kidShiftApiService = kidShiftApiService; + this.logger = logger; + logger.setTag("KSActions"); } @Override @@ -25,7 +38,33 @@ public class KSActionsImpl implements KSActions { } @Override - public void syncParent() { - + public CompletableFuture syncParent() { + logger.info("syncParent called and started"); + return CompletableFuture.supplyAsync(() -> { + logger.info("fetching..."); + Call call = kidShiftApiService.getParentInfo(); + try { + Response response = call.execute(); + if (!response.isSuccessful()) { + logger.error("Error fetching parent info: " + response.errorBody().string()); + throw new RuntimeException("Error fetching parent info: " + response.errorBody().string()); + } + ParentInfoResponse responseBody = response.body(); + ParentModel parent = new ParentModel(); + // TODO: 詰め替えをどこかにまとめる, 他のプロパティも処理する + parent.setInternalId(responseBody.getId()); + parent.setEmail(responseBody.getEmail()); + parent.setDisplayName(responseBody.getEmail()); // Workaround + logger.info("Parent fetched with status: " + response.code()); + logger.debug("Parent: " + parent); + // Save to cache + userSettings.getCache().setParent(parent); + logger.info("Parent saved to cache"); + return parent; + } catch (Exception e) { + logger.error("Error fetching parent info"); + throw new RuntimeException(e); + } + }); } } From 159342d2d1f574947c6107524655919af3c79df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 11:00:13 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=AB=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=A4=E3=83=B3=E3=82=BF=E3=83=95=E3=82=A7?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nem/kidshift/model/callback/ParentModelCallback.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 model/src/main/java/one/nem/kidshift/model/callback/ParentModelCallback.java diff --git a/model/src/main/java/one/nem/kidshift/model/callback/ParentModelCallback.java b/model/src/main/java/one/nem/kidshift/model/callback/ParentModelCallback.java new file mode 100644 index 0000000..fdefa43 --- /dev/null +++ b/model/src/main/java/one/nem/kidshift/model/callback/ParentModelCallback.java @@ -0,0 +1,9 @@ +package one.nem.kidshift.model.callback; + +import one.nem.kidshift.model.ParentModel; + +public interface ParentModelCallback { + void onUnchanged(); + void onUpdated(ParentModel parent); + void onFailed(String message); +} From 52c2e1f3ca09adfaf39bf5d9b900676fdbdcb1ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 11:09:59 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E3=83=A2=E3=82=B8=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kidshift/data/modules/KSActionsModule.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 data/src/main/java/one/nem/kidshift/data/modules/KSActionsModule.java diff --git a/data/src/main/java/one/nem/kidshift/data/modules/KSActionsModule.java b/data/src/main/java/one/nem/kidshift/data/modules/KSActionsModule.java new file mode 100644 index 0000000..b0002b0 --- /dev/null +++ b/data/src/main/java/one/nem/kidshift/data/modules/KSActionsModule.java @@ -0,0 +1,16 @@ +package one.nem.kidshift.data.modules; + +import dagger.Binds; +import dagger.Module; +import dagger.hilt.InstallIn; +import dagger.hilt.components.SingletonComponent; +import one.nem.kidshift.data.KSActions; +import one.nem.kidshift.data.impl.KSActionsImpl; + +@Module +@InstallIn(SingletonComponent.class) +public abstract class KSActionsModule { + + @Binds + public abstract KSActions bindKSActions(KSActionsImpl impl); +} From 726ef14b1a4eff6e0043a90888581ec10eace845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 11:10:13 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=E5=BC=95=E6=95=B0=E5=9E=8B=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/main/java/one/nem/kidshift/data/ParentData.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/src/main/java/one/nem/kidshift/data/ParentData.java b/data/src/main/java/one/nem/kidshift/data/ParentData.java index 31d19e3..78c67c9 100644 --- a/data/src/main/java/one/nem/kidshift/data/ParentData.java +++ b/data/src/main/java/one/nem/kidshift/data/ParentData.java @@ -3,6 +3,7 @@ package one.nem.kidshift.data; import java.util.concurrent.CompletableFuture; import one.nem.kidshift.model.ParentModel; +import one.nem.kidshift.model.callback.ParentModelCallback; public interface ParentData { @@ -11,7 +12,7 @@ public interface ParentData { * 親ユーザー情報取得 * @return 親ユーザー情報 */ - CompletableFuture getParent(); + CompletableFuture getParent(ParentModelCallback callback); /** * 親ユーザー情報更新 From 90be6d6dfca4f87e6f5e4290c74c3ab5300f5930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 11:10:19 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=AB=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kidshift/data/impl/ParentDataImpl.java | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/data/src/main/java/one/nem/kidshift/data/impl/ParentDataImpl.java b/data/src/main/java/one/nem/kidshift/data/impl/ParentDataImpl.java index 6e166d7..84b2429 100644 --- a/data/src/main/java/one/nem/kidshift/data/impl/ParentDataImpl.java +++ b/data/src/main/java/one/nem/kidshift/data/impl/ParentDataImpl.java @@ -7,11 +7,14 @@ import java.util.concurrent.CompletableFuture; import javax.inject.Inject; +import one.nem.kidshift.data.KSActions; import one.nem.kidshift.data.ParentData; import one.nem.kidshift.data.UserSettings; import one.nem.kidshift.data.retrofit.KidShiftApiService; import one.nem.kidshift.data.retrofit.model.parent.ParentInfoResponse; import one.nem.kidshift.model.ParentModel; +import one.nem.kidshift.model.callback.ParentModelCallback; +import one.nem.kidshift.utils.KSLogger; import retrofit2.Call; import retrofit2.Response; @@ -21,35 +24,40 @@ public class ParentDataImpl implements ParentData { private UserSettings userSettings; + private KSLogger logger; + + private KSActions ksActions; + @Inject - public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings) { + public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings, KSLogger logger, KSActions ksActions) { this.kidshiftApiService = kidshiftApiService; this.userSettings = userSettings; + this.logger = logger; + this.ksActions = ksActions; + + logger.setTag("ParentData"); } + // 一旦キャッシュを返して, その後非同期でAPIから取得→更新があればコールバックで通知 @Override - public CompletableFuture getParent() { - return CompletableFuture.supplyAsync(() -> { - Response parentInfoResponse; - Call response = kidshiftApiService.getParentInfo(); - try { - parentInfoResponse = response.execute(); - ParentInfoResponse responseBody = parentInfoResponse.body(); - ParentModel parent = new ParentModel(); - assert parentInfoResponse != null; - parent.setInternalId(responseBody.getId()); - parent.setEmail(responseBody.getEmail()); - parent.setDisplayName(responseBody.getEmail()); // Workaround - // TODO: 他のプロパティも処理する - return parent; - } catch (IOException e) { - throw new RuntimeException(e); + public CompletableFuture getParent(ParentModelCallback callback) { + // Start thread to fetch parent info + new Thread(() -> { + logger.info("Fetching parent info..."); + ParentModel refreshedParent = ksActions.syncParent().join(); + if (refreshedParent == null) { + callback.onFailed("Failed to fetch parent info"); + } else { + // Workaround, TODO: Compare with existing parent + callback.onUpdated(refreshedParent); } - }); + }).start(); + return CompletableFuture.supplyAsync(() -> userSettings.getCache().getParent()); } @Override public void updateParent(ParentModel parent) { } + } From 08a6520dd30fdd41469b6d3bf1f684ffb40cfcad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 11:10:28 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=AB=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF=E6=9A=AB=E5=AE=9A=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/setting/SettingMainFragment.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java b/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java index 4466854..0a3cca7 100644 --- a/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java +++ b/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java @@ -16,6 +16,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import javax.inject.Inject; @@ -24,6 +25,7 @@ import one.nem.kidshift.data.ChildData; import one.nem.kidshift.data.ParentData; import one.nem.kidshift.model.ChildModel; import one.nem.kidshift.model.ParentModel; +import one.nem.kidshift.model.callback.ParentModelCallback; /** * A simple {@link Fragment} subclass. @@ -85,8 +87,25 @@ public class SettingMainFragment extends Fragment { Bundle savedInstanceState) { // Inflate the layout for this fragment - //親の名前、アドレス表示 - ParentModel parent = parentData.getParent().join(); + CompletableFuture completableFuture = parentData.getParent(new ParentModelCallback() { + + @Override + public void onUnchanged() { + // TODO + } + + @Override + public void onUpdated(ParentModel parent) { + // TODO + } + + @Override + public void onFailed(String message) { + // TODO + } + }); + + ParentModel parent = completableFuture.join(); if (parent == null) { parent = new ParentModel(); // Workaround(非ログインデバッグ用) From 8a35bdc2853ba8dbe2ff3a0b23b0b6289e51aae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8D=E3=82=80=E3=81=AD=E3=81=93?= Date: Mon, 24 Jun 2024 12:04:54 +0900 Subject: [PATCH 9/9] =?UTF-8?q?TODO=E6=98=8E=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kidshift/feature/setting/SettingMainFragment.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java b/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java index 0a3cca7..7019de9 100644 --- a/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java +++ b/feature/setting/src/main/java/one/nem/kidshift/feature/setting/SettingMainFragment.java @@ -105,6 +105,16 @@ public class SettingMainFragment extends Fragment { } }); + /* + TODO: + - コールバックの処理を実装 + - 結果に応じてRecyclerViewを更新する + - キャッシュ受け取りの時にjoinでUIスレッドをブロックしないように + - Placeholderの表示? + - エラーハンドリング + - onFailed時にそれを通知 + */ + ParentModel parent = completableFuture.join(); if (parent == null) {