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 786bb38..5b654ca 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 @@ -24,10 +24,10 @@ import retrofit2.Response; public class KSActionsImpl implements KSActions { - private UserSettings userSettings; - private KidShiftApiService kidShiftApiService; - private KSLogger logger; - private CacheWrapper cacheWrapper; + private final UserSettings userSettings; + private final KidShiftApiService kidShiftApiService; + private final KSLogger logger; + private final CacheWrapper cacheWrapper; @Inject public KSActionsImpl(UserSettings userSettings, KidShiftApiService kidShiftApiService, KSLogger logger, CacheWrapper cacheWrapper) { 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 a8f70d6..4fcfe57 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 @@ -14,17 +14,14 @@ import one.nem.kidshift.utils.KSLogger; public class ParentDataImpl implements ParentData { - private KidShiftApiService kidshiftApiService; + private final UserSettings userSettings; - private UserSettings userSettings; + private final KSLogger logger; - private KSLogger logger; - - private KSActions ksActions; + private final KSActions ksActions; @Inject public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings, KSLogger logger, KSActions ksActions) { - this.kidshiftApiService = kidshiftApiService; this.userSettings = userSettings; this.logger = logger; this.ksActions = ksActions; diff --git a/data/src/main/java/one/nem/kidshift/data/impl/TaskDataImpl.java b/data/src/main/java/one/nem/kidshift/data/impl/TaskDataImpl.java index 4e13e85..2ce4397 100644 --- a/data/src/main/java/one/nem/kidshift/data/impl/TaskDataImpl.java +++ b/data/src/main/java/one/nem/kidshift/data/impl/TaskDataImpl.java @@ -1,16 +1,14 @@ package one.nem.kidshift.data.impl; +import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; -import javax.security.auth.callback.Callback; import one.nem.kidshift.data.KSActions; import one.nem.kidshift.data.TaskData; -import one.nem.kidshift.data.retrofit.model.converter.TaskModelConverter; -import one.nem.kidshift.data.retrofit.model.task.TaskListResponse; import one.nem.kidshift.data.room.utils.CacheWrapper; import one.nem.kidshift.model.callback.TaskItemModelCallback; import one.nem.kidshift.model.tasks.TaskItemModel; @@ -18,9 +16,9 @@ import one.nem.kidshift.utils.KSLogger; public class TaskDataImpl implements TaskData { - private KSActions ksActions; - private CacheWrapper cacheWrapper; - private KSLogger logger; + private final KSActions ksActions; + private final CacheWrapper cacheWrapper; + private final KSLogger logger; @Inject public TaskDataImpl(KSActions ksActions, CacheWrapper cacheWrapper, KSLogger logger) { @@ -31,30 +29,74 @@ public class TaskDataImpl implements TaskData { @Override public CompletableFuture> getTasks(TaskItemModelCallback callback) { - return CompletableFuture.supplyAsync(() -> { - logger.debug("タスク取得開始"); - Thread thread = new Thread(() -> { - // TODO-rca: ちゃんと比較して呼ぶ - ksActions.syncTasks().thenAccept(callback::onUpdated); - }); - thread.start(); - return cacheWrapper.getTaskList().thenApply(taskList -> { - if (taskList == null || taskList.isEmpty()) { - try { - logger.debug("キャッシュ無: タスク取得スレッド待機"); - thread.join(); - return cacheWrapper.getTaskList().join(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } else { - logger.debug("キャッシュ有 (タスク数: " + taskList.size() + ")"); - return taskList; - } - }).join(); + logger.debug("タスク取得開始"); + + CompletableFuture> cachedTasksFuture = cacheWrapper.getTaskList(); + + return cachedTasksFuture.thenCompose(cachedTasks -> { + if (cachedTasks == null || cachedTasks.isEmpty()) { + logger.debug("キャッシュ無: サーバーからタスクを取得"); + return fetchTasksFromServer(callback); + } else { + logger.debug("キャッシュ有 (タスク数: " + cachedTasks.size() + ")"); + return checkForUpdates(cachedTasks, callback); + } }); } + private CompletableFuture> fetchTasksFromServer(TaskItemModelCallback callback) { + return ksActions.syncTasks().thenApply(serverTasks -> { + if (serverTasks == null || serverTasks.isEmpty()) { + callback.onUnchanged(); + } else { + callback.onUpdated(serverTasks); + } + return serverTasks; + }).exceptionally(e -> { + logger.error("タスク取得失敗: " + e.getMessage()); + callback.onFailed(e.getMessage()); + return Collections.emptyList(); + }); + } + + private CompletableFuture> checkForUpdates(List cachedTasks, TaskItemModelCallback callback) { + return ksActions.syncTasks().thenApply(serverTasks -> { + if (serverTasks == null || serverTasks.isEmpty()) { + callback.onUnchanged(); + return cachedTasks; + } else { + boolean isChanged = isTaskListChanged(cachedTasks, serverTasks); + if (isChanged) { + logger.debug("タスク取得完了: キャッシュと比較して変更あり"); + callback.onUpdated(serverTasks); + return serverTasks; + } else { + logger.debug("タスク取得完了: キャッシュと比較して変更なし"); + callback.onUnchanged(); + return cachedTasks; + } + } + }).exceptionally(e -> { + logger.error("タスク取得失敗: " + e.getMessage()); + callback.onFailed(e.getMessage()); + return cachedTasks; + }); + } + + private boolean isTaskListChanged(List cachedTasks, List serverTasks) { + if (cachedTasks.size() != serverTasks.size()) { + return true; + } + + for (TaskItemModel serverTask : serverTasks) { + boolean exists = cachedTasks.stream().anyMatch(cachedTask -> serverTask.getId().equals(cachedTask.getId())); + if (!exists) { + return true; + } + } + return false; + } + @Override public CompletableFuture> getTasks(String childId, TaskItemModelCallback callback) { return null;