From 567ca725e9baa38da1167dcc5b48be42df325366 Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Tue, 17 Mar 2026 17:47:16 -0300 Subject: [PATCH 1/4] Executor module --- build.gradle | 2 +- events-domain/build.gradle | 1 + executor/.classpath | 6 + executor/.gitignore | 3 + .../org.eclipse.buildship.core.prefs | 2 + executor/README.md | 121 ++++++++++++++++++ executor/build.gradle | 22 ++++ .../executor/SplitBaseTaskExecutor.java | 14 +- .../SplitClientEventTaskExecutor.java | 0 .../SplitSingleThreadTaskExecutor.java | 0 .../client/service/executor/SplitTask.java | 0 .../service/executor/SplitTaskBatchItem.java | 0 .../executor/SplitTaskBatchWrapper.java | 5 +- .../executor/SplitTaskExecutionInfo.java | 0 .../executor/SplitTaskExecutionListener.java | 0 .../executor/SplitTaskExecutionStatus.java | 0 .../service/executor/SplitTaskExecutor.java | 0 .../executor/SplitTaskExecutorImpl.java | 0 .../executor/SplitTaskSerialWrapper.java | 0 .../service/executor/SplitTaskType.java | 0 .../client/service/executor/TaskWrapper.java | 5 +- .../executor/ThreadFactoryBuilder.java | 15 ++- .../parallel/SplitDeferredTaskItem.java | 5 +- .../parallel/SplitParallelTaskExecutor.java | 0 .../SplitParallelTaskExecutorFactory.java | 0 .../SplitParallelTaskExecutorFactoryImpl.java | 0 .../SplitParallelTaskExecutorImpl.java | 0 .../PausableScheduledThreadPoolExecutor.java | 0 ...usableScheduledThreadPoolExecutorImpl.java | 0 .../scheduler/PausableThreadPoolExecutor.java | 0 .../PausableThreadPoolExecutorImpl.java | 0 .../client/service/SplitTaskExecutorTest.java | 0 .../executor/SplitTaskSerialWrapperTest.java | 0 .../executor/ThreadFactoryBuilderTest.java | 0 .../SplitParallelTaskExecutorImplTest.java | 0 ...leScheduledThreadPoolExecutorImplTest.java | 0 main/AGENTS.md | 69 ++++++++++ main/CLAUDE.md | 1 + main/build.gradle | 1 + settings.gradle | 1 + submitter/build.gradle | 2 +- 41 files changed, 250 insertions(+), 25 deletions(-) create mode 100644 executor/.classpath create mode 100644 executor/.gitignore create mode 100644 executor/.settings/org.eclipse.buildship.core.prefs create mode 100644 executor/README.md create mode 100644 executor/build.gradle rename {main => executor}/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java (94%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTask.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskBatchItem.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java (88%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionInfo.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionListener.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionStatus.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskExecutor.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskExecutorImpl.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskSerialWrapper.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/client/service/executor/SplitTaskType.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/TaskWrapper.java (89%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java (93%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java (78%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutor.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactory.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactoryImpl.java (100%) rename {main => executor}/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImpl.java (100%) rename {main => executor}/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutor.java (100%) rename {main => executor}/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImpl.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutor.java (100%) rename {events-domain => executor}/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutorImpl.java (100%) rename {main => executor}/src/test/java/io/split/android/client/service/SplitTaskExecutorTest.java (100%) rename {main => executor}/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java (100%) rename {main => executor}/src/test/java/io/split/android/client/service/executor/ThreadFactoryBuilderTest.java (100%) rename {main => executor}/src/test/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImplTest.java (100%) rename {main => executor}/src/test/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImplTest.java (100%) create mode 100644 main/AGENTS.md create mode 120000 main/CLAUDE.md diff --git a/build.gradle b/build.gradle index 0f558a3fe..91abd934d 100644 --- a/build.gradle +++ b/build.gradle @@ -145,7 +145,7 @@ dependencies { return candidates.find { findProject(it) != null } } - ['main', 'logger', 'events', 'events-domain', 'api', 'http-api', 'http', 'fallback', 'backoff', 'tracker', 'submitter'].each { moduleName -> + ['main', 'logger', 'executor', 'events', 'events-domain', 'api', 'http-api', 'http', 'fallback', 'backoff', 'tracker', 'submitter'].each { moduleName -> def resolvedPath = resolveProjectPath(moduleName) if (resolvedPath != null) { include project(resolvedPath) diff --git a/events-domain/build.gradle b/events-domain/build.gradle index 4b4d0941b..cce729dd2 100644 --- a/events-domain/build.gradle +++ b/events-domain/build.gradle @@ -16,6 +16,7 @@ android { dependencies { implementation libs.annotation + api clientModuleProject('executor') implementation clientModuleProject('api') implementation clientModuleProject('events') implementation clientModuleProject('logger') diff --git a/executor/.classpath b/executor/.classpath new file mode 100644 index 000000000..d9b92d645 --- /dev/null +++ b/executor/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/executor/.gitignore b/executor/.gitignore new file mode 100644 index 000000000..a9c32b0f6 --- /dev/null +++ b/executor/.gitignore @@ -0,0 +1,3 @@ +/build +.gradle +local.properties diff --git a/executor/.settings/org.eclipse.buildship.core.prefs b/executor/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 000000000..b1886adb4 --- /dev/null +++ b/executor/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=.. +eclipse.preferences.version=1 diff --git a/executor/README.md b/executor/README.md new file mode 100644 index 000000000..debfea966 --- /dev/null +++ b/executor/README.md @@ -0,0 +1,121 @@ +# executor + +Generic task scheduling and execution infrastructure for the Split Android SDK. + +## Purpose + +Provides a pausable, lifecycle-aware task executor with support for: +- Scheduled and immediate task execution +- Parallel task execution with timeout +- Serial and batch task wrappers +- Main thread task execution via Android Handler +- Pause/resume support for Android lifecycle management + +## Public API + +### Core Executor + +| Class / Interface | Role | +|---|---| +| `SplitTaskExecutor` | Main interface for task scheduling and execution | +| `SplitTaskExecutorImpl` | Default implementation with configurable thread pool | +| `SplitSingleThreadTaskExecutor` | Single-threaded variant for sequential execution | +| `SplitBaseTaskExecutor` | Abstract base with pause/resume and lifecycle management | + +### Task Abstractions + +| Class / Interface | Role | +|---|---| +| `SplitTask` | Task interface with single `execute()` method | +| `SplitTaskType` | Enum of 18 task types (SPLITS_SYNC, EVENTS_RECORDER, etc.) | +| `SplitTaskExecutionInfo` | Execution result with status, type, and optional data | +| `SplitTaskExecutionStatus` | SUCCESS or ERROR status enum | +| `SplitTaskExecutionListener` | Callback interface for task completion | + +### Parallel Execution + +| Class / Interface | Role | +|---|---| +| `SplitParallelTaskExecutor` | Interface for parallel task execution with timeout | +| `SplitParallelTaskExecutorImpl` | Implementation using ExecutorService.invokeAll() | +| `SplitParallelTaskExecutorFactory` | Factory for creating parallel executors | + +### Wrappers & Utilities + +| Class / Interface | Role | +|---|---| +| `TaskWrapper` | Wraps SplitTask with execution listener callback | +| `SplitTaskSerialWrapper` | Executes multiple tasks serially, stops on first error | +| `SplitTaskBatchWrapper` | Batch execution wrapper for multiple tasks | +| `ThreadFactoryBuilder` | Creates named daemon threads for executor | + +### Pausable Schedulers + +| Class / Interface | Role | +|---|---| +| `PausableScheduledThreadPoolExecutor` | Interface extending ScheduledExecutorService with pause/resume | +| `PausableScheduledThreadPoolExecutorImpl` | Implementation with lifecycle-aware scheduling | +| `PausableThreadPoolExecutor` | Non-scheduled pausable executor interface | +| `PausableThreadPoolExecutorImpl` | Non-scheduled pausable executor implementation | + +## Usage + +### Basic Task Execution + +```java +SplitTaskExecutor executor = new SplitTaskExecutorImpl(); + +SplitTask task = () -> { + // Do work + return SplitTaskExecutionInfo.success(SplitTaskType.SPLITS_SYNC); +}; + +executor.submit(task, null); +``` + +### Scheduled Execution + +```java +executor.schedule( + task, + 60, // delay in seconds + null // optional listener +); +``` + +### Parallel Execution + +```java +SplitParallelTaskExecutor parallelExecutor = + new SplitParallelTaskExecutorFactoryImpl().build(); + +List> tasks = Arrays.asList( + () -> fetchData1(), + () -> fetchData2() +); + +List results = parallelExecutor.executeParallelTasks(tasks, 60); +``` + +### Lifecycle Management + +```java +executor.pause(); // Pause scheduled tasks +executor.resume(); // Resume scheduled tasks +executor.stop(); // Stop and shutdown executor +``` + +## Dependencies + +- **logger**: Logging abstraction +- **Android framework**: Handler/Looper for main thread execution +- **AndroidX annotations**: @NonNull, @Nullable, etc. + +## Wiring (in main module) + +Created in `SplitFactoryImpl`: + +```java +SplitTaskExecutor executor = new SplitTaskExecutorImpl(); +SplitTaskExecutor sseExecutor = new SplitSingleThreadTaskExecutor(); +``` diff --git a/executor/build.gradle b/executor/build.gradle new file mode 100644 index 000000000..17b2228c4 --- /dev/null +++ b/executor/build.gradle @@ -0,0 +1,22 @@ +plugins { + id 'com.android.library' +} + +apply from: "$projectDir/../gradle/common-android-library.gradle" + +android { + namespace 'io.split.android.client.executor' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation libs.annotation + implementation clientModuleProject('logger') + + testImplementation libs.junit4 + testImplementation libs.mockitoCore +} diff --git a/main/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java b/executor/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java similarity index 94% rename from main/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java index 997cfbbab..e63dfb4ed 100644 --- a/main/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java +++ b/executor/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java @@ -1,8 +1,5 @@ package io.split.android.client.service.executor; -import static io.split.android.client.utils.Utils.checkArgument; -import static io.split.android.client.utils.Utils.checkNotNull; - import android.os.Handler; import android.os.Looper; @@ -12,6 +9,7 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; @@ -42,8 +40,10 @@ public String schedule(@NonNull SplitTask task, long periodInSecs, @Nullable SplitTaskExecutionListener executionListener ) { - checkNotNull(task); - checkArgument(periodInSecs > 0); + Objects.requireNonNull(task); + if (periodInSecs <= 0) { + throw new IllegalArgumentException("periodInSecs must be positive"); + } String taskId = null; if (!mScheduler.isShutdown()) { @@ -62,7 +62,7 @@ public String schedule(@NonNull SplitTask task, long initialDelayInSecs, @Nullable SplitTaskExecutionListener executionListener ) { - checkNotNull(task); + Objects.requireNonNull(task); String taskId = null; if (!mScheduler.isShutdown()) { ScheduledFuture taskFuture = mScheduler.schedule( @@ -77,7 +77,7 @@ public String schedule(@NonNull SplitTask task, @Override public void submit(@NonNull SplitTask task, @Nullable SplitTaskExecutionListener executionListener) { - checkNotNull(task); + Objects.requireNonNull(task); if (!mScheduler.isShutdown()) { mScheduler.submit(new TaskWrapper(task, executionListener)); } diff --git a/main/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java b/executor/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java diff --git a/main/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java b/executor/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTask.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTask.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTask.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTask.java diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskBatchItem.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskBatchItem.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskBatchItem.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskBatchItem.java diff --git a/main/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java similarity index 88% rename from main/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java index 47b0dca6b..0e41e1165 100644 --- a/main/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java +++ b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskBatchWrapper.java @@ -1,8 +1,7 @@ package io.split.android.client.service.executor; -import static io.split.android.client.utils.Utils.checkNotNull; - import java.util.List; +import java.util.Objects; import io.split.android.client.utils.logger.Logger; @@ -10,7 +9,7 @@ class SplitTaskBatchWrapper implements Runnable { private final List mTaskQueue; SplitTaskBatchWrapper(List taskQueue) { - mTaskQueue = checkNotNull(taskQueue); + mTaskQueue = Objects.requireNonNull(taskQueue); } @Override diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionInfo.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionInfo.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionInfo.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionInfo.java diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionListener.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionListener.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionListener.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionListener.java diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionStatus.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionStatus.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionStatus.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutionStatus.java diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutor.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutor.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskExecutor.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutor.java diff --git a/main/src/main/java/io/split/android/client/service/executor/SplitTaskExecutorImpl.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutorImpl.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/SplitTaskExecutorImpl.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskExecutorImpl.java diff --git a/main/src/main/java/io/split/android/client/service/executor/SplitTaskSerialWrapper.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskSerialWrapper.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/SplitTaskSerialWrapper.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskSerialWrapper.java diff --git a/events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskType.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskType.java similarity index 100% rename from events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskType.java rename to executor/src/main/java/io/split/android/client/service/executor/SplitTaskType.java diff --git a/main/src/main/java/io/split/android/client/service/executor/TaskWrapper.java b/executor/src/main/java/io/split/android/client/service/executor/TaskWrapper.java similarity index 89% rename from main/src/main/java/io/split/android/client/service/executor/TaskWrapper.java rename to executor/src/main/java/io/split/android/client/service/executor/TaskWrapper.java index 71018e3ef..f5009a33a 100644 --- a/main/src/main/java/io/split/android/client/service/executor/TaskWrapper.java +++ b/executor/src/main/java/io/split/android/client/service/executor/TaskWrapper.java @@ -1,8 +1,7 @@ package io.split.android.client.service.executor; -import static io.split.android.client.utils.Utils.checkNotNull; - import java.lang.ref.WeakReference; +import java.util.Objects; import io.split.android.client.utils.logger.Logger; @@ -12,7 +11,7 @@ class TaskWrapper implements Runnable { TaskWrapper(SplitTask task, SplitTaskExecutionListener executionListener) { - mTask = checkNotNull(task); + mTask = Objects.requireNonNull(task); mExecutionListener = new WeakReference<>(executionListener); } diff --git a/main/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java b/executor/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java similarity index 93% rename from main/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java rename to executor/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java index 4b3059b48..adb4000e7 100644 --- a/main/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java +++ b/executor/src/main/java/io/split/android/client/service/executor/ThreadFactoryBuilder.java @@ -2,9 +2,6 @@ import static java.util.Objects.requireNonNull; -import static io.split.android.client.utils.Utils.checkArgument; -import static io.split.android.client.utils.Utils.checkNotNull; - import androidx.annotation.Nullable; import java.util.Locale; @@ -71,8 +68,12 @@ public ThreadFactoryBuilder setDaemon(boolean daemon) { public ThreadFactoryBuilder setPriority(int priority) { // Thread#setPriority() already checks for validity. These error messages // are nicer though and will fail-fast. - checkArgument(priority >= Thread.MIN_PRIORITY); - checkArgument(priority <= Thread.MAX_PRIORITY); + if (priority < Thread.MIN_PRIORITY) { + throw new IllegalArgumentException("priority must be >= Thread.MIN_PRIORITY"); + } + if (priority > Thread.MAX_PRIORITY) { + throw new IllegalArgumentException("priority must be <= Thread.MAX_PRIORITY"); + } this.priority = priority; return this; } @@ -86,7 +87,7 @@ public ThreadFactoryBuilder setPriority(int priority) { */ public ThreadFactoryBuilder setUncaughtExceptionHandler( Thread.UncaughtExceptionHandler uncaughtExceptionHandler) { - this.uncaughtExceptionHandler = checkNotNull(uncaughtExceptionHandler); + this.uncaughtExceptionHandler = requireNonNull(uncaughtExceptionHandler); return this; } @@ -99,7 +100,7 @@ public ThreadFactoryBuilder setUncaughtExceptionHandler( * @return this for the builder pattern */ public ThreadFactoryBuilder setThreadFactory(ThreadFactory backingThreadFactory) { - this.backingThreadFactory = checkNotNull(backingThreadFactory); + this.backingThreadFactory = requireNonNull(backingThreadFactory); return this; } diff --git a/main/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java b/executor/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java similarity index 78% rename from main/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java rename to executor/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java index d905ca301..e32d0584f 100644 --- a/main/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java +++ b/executor/src/main/java/io/split/android/client/service/executor/parallel/SplitDeferredTaskItem.java @@ -1,9 +1,8 @@ package io.split.android.client.service.executor.parallel; -import static io.split.android.client.utils.Utils.checkNotNull; - import androidx.annotation.NonNull; +import java.util.Objects; import java.util.concurrent.Callable; public class SplitDeferredTaskItem implements Callable { @@ -11,7 +10,7 @@ public class SplitDeferredTaskItem implements Callable { private final Callable mCallable; public SplitDeferredTaskItem(@NonNull Callable callable) { - mCallable = checkNotNull(callable); + mCallable = Objects.requireNonNull(callable); } @Override diff --git a/main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutor.java b/executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutor.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutor.java rename to executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutor.java diff --git a/main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactory.java b/executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactory.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactory.java rename to executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactory.java diff --git a/main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactoryImpl.java b/executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactoryImpl.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactoryImpl.java rename to executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorFactoryImpl.java diff --git a/main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImpl.java b/executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImpl.java similarity index 100% rename from main/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImpl.java rename to executor/src/main/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImpl.java diff --git a/main/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutor.java b/executor/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutor.java similarity index 100% rename from main/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutor.java rename to executor/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutor.java diff --git a/main/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImpl.java b/executor/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImpl.java similarity index 100% rename from main/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImpl.java rename to executor/src/main/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImpl.java diff --git a/events-domain/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutor.java b/executor/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutor.java similarity index 100% rename from events-domain/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutor.java rename to executor/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutor.java diff --git a/events-domain/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutorImpl.java b/executor/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutorImpl.java similarity index 100% rename from events-domain/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutorImpl.java rename to executor/src/main/java/io/split/android/engine/scheduler/PausableThreadPoolExecutorImpl.java diff --git a/main/src/test/java/io/split/android/client/service/SplitTaskExecutorTest.java b/executor/src/test/java/io/split/android/client/service/SplitTaskExecutorTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/service/SplitTaskExecutorTest.java rename to executor/src/test/java/io/split/android/client/service/SplitTaskExecutorTest.java diff --git a/main/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java b/executor/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java rename to executor/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java diff --git a/main/src/test/java/io/split/android/client/service/executor/ThreadFactoryBuilderTest.java b/executor/src/test/java/io/split/android/client/service/executor/ThreadFactoryBuilderTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/service/executor/ThreadFactoryBuilderTest.java rename to executor/src/test/java/io/split/android/client/service/executor/ThreadFactoryBuilderTest.java diff --git a/main/src/test/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImplTest.java b/executor/src/test/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImplTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImplTest.java rename to executor/src/test/java/io/split/android/client/service/executor/parallel/SplitParallelTaskExecutorImplTest.java diff --git a/main/src/test/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImplTest.java b/executor/src/test/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImplTest.java similarity index 100% rename from main/src/test/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImplTest.java rename to executor/src/test/java/io/split/android/engine/scheduler/PausableScheduledThreadPoolExecutorImplTest.java diff --git a/main/AGENTS.md b/main/AGENTS.md new file mode 100644 index 000000000..21eaf0457 --- /dev/null +++ b/main/AGENTS.md @@ -0,0 +1,69 @@ +# AGENTS.md — main module + +## Purpose + +Core SDK logic for the Split Android SDK. This is the largest and most complex module, containing: +- `SplitClient` / `SplitFactory` implementation +- Feature flag evaluation engine (matchers, splitter, parser) +- Data synchronization (splits, segments, SSE streaming) +- Impressions and events tracking +- Storage (database via Room/SQLite) +- Telemetry, lifecycle management, localhost mode + +## Key Packages + +| Package | Description | +|---------|-------------| +| `io.split.android.client` | Top-level: SplitClientImpl, SplitFactoryImpl, SplitClientConfig, EvaluatorImpl | +| `io.split.android.client.api` | Public API implementations | +| `io.split.android.client.service` | Background services: splits sync, segments sync, SSE, impressions, events, telemetry | +| `io.split.android.client.service.executor` | Task executor and SplitTaskFactory | +| `io.split.android.client.service.sseclient` | SSE client and BackoffCounterTimer | +| `io.split.android.client.service.synchronizer` | Sync orchestration | +| `io.split.android.client.impressions` | Impression capture, deduplication, flushing | +| `io.split.android.client.factory` | SplitFactoryImpl and SplitFactoryHelper | +| `io.split.android.client.localhost` | Localhost mode (YAML/JSON feature flag files) | +| `io.split.android.client.shared` | SplitClientContainer, shared state | +| `io.split.android.engine` | Evaluation engine: experiments (ParsedSplit), matchers, splitter | +| `io.split.android.engine.experiments` | SplitParser, ParsedSplit, FetcherPolicy | +| `io.split.android.engine.matchers` | All matcher implementations (string, set, number, semver, date) | + +## Testing + +- **Run unit tests**: `./gradlew :main:test` +- **Run a single class**: `./gradlew :main:test --tests "io.split.android.client."` +- **Test sources**: `main/src/test/java/` + `main/src/sharedTest/java/` (shared with instrumented tests) +- **Instrumented tests**: `main/src/androidTest/java/` — requires device/emulator farm (Sauce Labs) +- **Test options**: `unitTests.returnDefaultValues = true` (mocks Android framework returns) + +## Dependencies + +This module depends on all other modules: +- `:api` — public interfaces +- `:logger` — logging +- `:http`, `:http-api` — networking +- `:fallback` — fallback treatments +- `:events`, `:events-domain` — event processing +- `:backoff` — retry logic +- `:tracker` — impression/event tracking + +## Important Patterns + +- **Task pattern**: Background work is modeled as `SplitTask` implementations, scheduled via `SplitTaskExecutor` +- **Factory pattern**: `SplitTaskFactoryImpl` wires together all tasks; `SplitClientFactoryImpl` creates clients +- **SSE streaming**: SSE client with `BackoffCounterTimer` (now from `:backoff` module) for reconnect +- **Shared state**: `SplitClientContainer` manages multiple `SplitClient` instances (multi-key support) +- **Localhost mode**: Reads feature flags from YAML/JSON files without connecting to Split servers + +## DOs + +- Follow the existing `SplitTask` interface when adding new background tasks +- Maintain the `SplitTaskFactory` interface in `:api` when adding new task types +- Add corresponding unit tests in `src/test/` for all new evaluator/matcher logic +- Use `RetryBackoffCounterTimerFactory` for retry-capable timers (delegates to `:backoff` module) + +## DON'Ts + +- Don't add direct dependencies on Android UI framework (this is a library, not an app) +- Don't put public API interfaces in this module — they belong in `:api` +- Don't add instrumented-test-only dependencies to the main `dependencies` block diff --git a/main/CLAUDE.md b/main/CLAUDE.md new file mode 120000 index 000000000..47dc3e3d8 --- /dev/null +++ b/main/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/main/build.gradle b/main/build.gradle index e2eb14591..8029dd92e 100644 --- a/main/build.gradle +++ b/main/build.gradle @@ -50,6 +50,7 @@ android { dependencies { // Public api modules + api clientModuleProject('executor') api clientModuleProject('logger') api clientModuleProject('api') api clientModuleProject('http-api') diff --git a/settings.gradle b/settings.gradle index 22c935f1b..659c104d3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,6 +8,7 @@ include ':fallback' include ':main' include ':events' include ':events-domain' +include ':executor' include ':backoff' include ':tracker' include ':submitter' diff --git a/submitter/build.gradle b/submitter/build.gradle index 906878de7..02bba6959 100644 --- a/submitter/build.gradle +++ b/submitter/build.gradle @@ -14,7 +14,7 @@ android { } dependencies { - api clientModuleProject('events-domain') + implementation clientModuleProject('executor') implementation clientModuleProject('logger') implementation libs.annotation From 6ace37d36a28bd4410bb1dba710d948a0e6b3b2a Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Tue, 17 Mar 2026 18:39:49 -0300 Subject: [PATCH 2/4] SplitTaskType in main --- .../service/executor/SplitTaskType.java | 17 ++++----- .../executor/SplitTaskSerialWrapperTest.java | 36 ++++++++++--------- .../workmanager/WorkManagerWrapperTest.java | 2 +- .../client/service/CleanUpDatabaseTask.java | 2 +- .../android/client/service/SplitTaskType.java | 25 +++++++++++++ .../attributes/LoadAttributesTask.java | 2 +- .../service/events/EventsRecorderTask.java | 2 +- .../ImpressionsCountRecorderTask.java | 2 +- .../impressions/ImpressionsRecorderTask.java | 2 +- .../impressions/SaveImpressionsCountTask.java | 2 +- .../strategy/ImpressionStrategyProvider.java | 2 +- .../unique/SaveUniqueImpressionsTask.java | 2 +- .../unique/UniqueKeysRecorderTask.java | 2 +- .../mysegments/LoadMySegmentsTaskConfig.java | 2 +- .../mysegments/MySegmentsSyncTaskConfig.java | 2 +- .../MySegmentsUpdateTaskConfig.java | 2 +- .../rules/LoadRuleBasedSegmentsTask.java | 2 +- .../RuleBasedSegmentInPlaceUpdateTask.java | 2 +- .../splits/FilterSplitsInCacheTask.java | 2 +- .../client/service/splits/LoadSplitsTask.java | 2 +- .../RuleBasedSegmentInPlaceUpdateTask.java | 2 +- .../splits/SplitInPlaceUpdateTask.java | 2 +- .../client/service/splits/SplitKillTask.java | 2 +- .../service/splits/SplitsSyncHelper.java | 2 +- .../service/splits/SplitsUpdateTask.java | 2 +- .../synchronizer/SynchronizerImpl.java | 16 ++++----- .../synchronizer/WorkManagerWrapper.java | 2 +- .../TelemetryConfigRecorderTask.java | 2 +- .../telemetry/TelemetryStatsRecorderTask.java | 2 +- .../service/EventsRecorderTaskTest.java | 2 +- .../ImpressionsCountRecorderTaskTest.java | 2 +- .../service/ImpressionsRecorderTaskTest.java | 2 +- .../client/service/LoadSplitsTaskTest.java | 2 +- .../service/MySegmentsUpdateTaskTest.java | 2 +- .../client/service/SplitKillTaskTest.java | 2 +- .../client/service/SplitSyncTaskTest.java | 2 +- .../client/service/SplitUpdateTaskTest.java | 2 +- .../client/service/SynchronizerTest.java | 2 +- .../attributes/LoadAttributesTaskTest.java | 2 +- .../impressions/strategy/DebugStrategyTest.kt | 2 +- .../impressions/strategy/DebugTrackerTest.kt | 2 +- .../impressions/strategy/NoneTrackerTest.kt | 2 +- .../strategy/OptimizedStrategyTest.kt | 2 +- .../strategy/OptimizedTrackerTest.kt | 2 +- .../unique/UniqueKeysRecorderTaskTest.java | 2 +- .../LoadMySegmentsTaskConfigTest.java | 2 +- .../MySegmentsSyncTaskConfigTest.java | 2 +- .../MySegmentsUpdateTaskConfigTest.java | 2 +- .../sseclient/SplitUpdateWorkerTest.java | 2 +- .../RetryBackoffCounterTimerTest.java | 2 +- .../FeatureFlagsSynchronizerImplTest.java | 2 +- .../LoadLocalDataListenerTest.java | 2 +- .../RecorderSyncHelperImplTest.java | 2 +- .../MySegmentsSynchronizerImplTest.java | 2 +- .../SynchronizerImplTelemetryTest.java | 2 +- .../TelemetryConfigRecorderTaskTest.java | 2 +- .../TelemetryStatsRecorderTaskTest.java | 2 +- .../TelemetrySynchronizerImplTest.java | 2 +- .../client/submitter/RecorderTaskTest.java | 2 +- 59 files changed, 114 insertions(+), 90 deletions(-) create mode 100644 main/src/main/java/io/split/android/client/service/SplitTaskType.java diff --git a/executor/src/main/java/io/split/android/client/service/executor/SplitTaskType.java b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskType.java index 7842fea6d..8eaacb000 100644 --- a/executor/src/main/java/io/split/android/client/service/executor/SplitTaskType.java +++ b/executor/src/main/java/io/split/android/client/service/executor/SplitTaskType.java @@ -1,13 +1,10 @@ package io.split.android.client.service.executor; -public enum SplitTaskType { - SPLITS_SYNC, MY_SEGMENTS_SYNC, EVENTS_RECORDER, IMPRESSIONS_RECORDER, - LOAD_LOCAL_SPLITS, LOAD_LOCAL_MY_SEGMENTS, SSE_AUTHENTICATION_TASK, - SPLIT_KILL, FILTER_SPLITS_CACHE, GENERIC_TASK, - CLEAN_UP_DATABASE, IMPRESSIONS_COUNT_RECORDER, SAVE_IMPRESSIONS_COUNT, - MY_SEGMENTS_UPDATE, LOAD_LOCAL_ATTRIBUTES, - TELEMETRY_CONFIG_TASK, TELEMETRY_STATS_TASK, - SAVE_UNIQUE_KEYS_TASK, UNIQUE_KEYS_RECORDER_TASK, - MY_LARGE_SEGMENTS_UPDATE, LOAD_LOCAL_RULE_BASED_SEGMENTS, - RULE_BASED_SEGMENT_SYNC, +public interface SplitTaskType { + SplitTaskType GENERIC_TASK = new SplitTaskType() { + @Override + public String toString() { + return "GENERIC_TASK"; + } + }; } diff --git a/executor/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java b/executor/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java index 11dee9e9a..4b47a9b81 100644 --- a/executor/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java +++ b/executor/src/test/java/io/split/android/client/service/executor/SplitTaskSerialWrapperTest.java @@ -12,13 +12,17 @@ public class SplitTaskSerialWrapperTest { + private static final SplitTaskType TASK_TYPE_A = new SplitTaskType() {}; + private static final SplitTaskType TASK_TYPE_B = new SplitTaskType() {}; + private static final SplitTaskType TASK_TYPE_C = new SplitTaskType() {}; + @Test public void successfulStatusContainsResultsOfEveryTask() { SplitTask task1 = mock(SplitTask.class); SplitTask task2 = mock(SplitTask.class); - when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_CONFIG_TASK)); - when(task2.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_STATS_TASK)); + when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_A)); + when(task2.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_B)); SplitTaskSerialWrapper wrapper = new SplitTaskSerialWrapper(task1, task2); @@ -27,10 +31,10 @@ public void successfulStatusContainsResultsOfEveryTask() { List results = (List) executionInfo.getObjectValue("serial_task_results"); assertEquals(SplitTaskExecutionStatus.SUCCESS, executionInfo.getStatus()); assertEquals(2, results.size()); - assertEquals(SplitTaskType.TELEMETRY_CONFIG_TASK, results.get(0).getTaskType()); + assertEquals(TASK_TYPE_A, results.get(0).getTaskType()); assertEquals(SplitTaskExecutionStatus.SUCCESS, results.get(0).getStatus()); - assertEquals(SplitTaskType.TELEMETRY_STATS_TASK, results.get(1).getTaskType()); + assertEquals(TASK_TYPE_B, results.get(1).getTaskType()); assertEquals(SplitTaskExecutionStatus.SUCCESS, results.get(1).getStatus()); } @@ -40,9 +44,9 @@ public void unsuccessfulResultContainsExecutionInfoUpToFirstUnsuccessfulTask() { SplitTask task2 = mock(SplitTask.class); SplitTask task3 = mock(SplitTask.class); - when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_CONFIG_TASK)); - when(task2.execute()).thenReturn(SplitTaskExecutionInfo.error(SplitTaskType.TELEMETRY_STATS_TASK)); - when(task3.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.IMPRESSIONS_RECORDER)); + when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_A)); + when(task2.execute()).thenReturn(SplitTaskExecutionInfo.error(TASK_TYPE_B)); + when(task3.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_C)); SplitTaskSerialWrapper wrapper = new SplitTaskSerialWrapper(task1, task2, task3); @@ -51,10 +55,10 @@ public void unsuccessfulResultContainsExecutionInfoUpToFirstUnsuccessfulTask() { List results = (List) executionInfo.getObjectValue("serial_task_results"); assertEquals(SplitTaskExecutionStatus.ERROR, executionInfo.getStatus()); assertEquals(2, results.size()); - assertEquals(SplitTaskType.TELEMETRY_CONFIG_TASK, results.get(0).getTaskType()); + assertEquals(TASK_TYPE_A, results.get(0).getTaskType()); assertEquals(SplitTaskExecutionStatus.SUCCESS, results.get(0).getStatus()); - assertEquals(SplitTaskType.TELEMETRY_STATS_TASK, results.get(1).getTaskType()); + assertEquals(TASK_TYPE_B, results.get(1).getTaskType()); assertEquals(SplitTaskExecutionStatus.ERROR, results.get(1).getStatus()); } @@ -64,9 +68,9 @@ public void successfulTasksAreAllExecuted() { SplitTask task2 = mock(SplitTask.class); SplitTask task3 = mock(SplitTask.class); - when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_CONFIG_TASK)); - when(task2.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_STATS_TASK)); - when(task3.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.IMPRESSIONS_RECORDER)); + when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_A)); + when(task2.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_B)); + when(task3.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_C)); SplitTaskSerialWrapper wrapper = new SplitTaskSerialWrapper(task1, task2, task3); @@ -84,10 +88,10 @@ public void tasksAreExecutedUpToUnsuccessfulOne() { SplitTask task3 = mock(SplitTask.class); SplitTask task4 = mock(SplitTask.class); - when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_CONFIG_TASK)); - when(task2.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.TELEMETRY_STATS_TASK)); - when(task3.execute()).thenReturn(SplitTaskExecutionInfo.error(SplitTaskType.IMPRESSIONS_RECORDER)); - when(task4.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.IMPRESSIONS_RECORDER)); + when(task1.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_A)); + when(task2.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_B)); + when(task3.execute()).thenReturn(SplitTaskExecutionInfo.error(TASK_TYPE_C)); + when(task4.execute()).thenReturn(SplitTaskExecutionInfo.success(TASK_TYPE_C)); SplitTaskSerialWrapper wrapper = new SplitTaskSerialWrapper(task1, task2, task3, task4); wrapper.execute(); diff --git a/main/src/androidTest/java/tests/workmanager/WorkManagerWrapperTest.java b/main/src/androidTest/java/tests/workmanager/WorkManagerWrapperTest.java index 8f3539423..b2865386f 100644 --- a/main/src/androidTest/java/tests/workmanager/WorkManagerWrapperTest.java +++ b/main/src/androidTest/java/tests/workmanager/WorkManagerWrapperTest.java @@ -34,7 +34,7 @@ import io.split.android.client.SplitClientConfig; import io.split.android.client.SplitFilter; import io.split.android.client.network.CertificatePinningConfiguration; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.synchronizer.WorkManagerWrapper; import io.split.android.client.service.workmanager.EventsRecorderWorker; import io.split.android.client.service.workmanager.ImpressionsRecorderWorker; diff --git a/main/src/main/java/io/split/android/client/service/CleanUpDatabaseTask.java b/main/src/main/java/io/split/android/client/service/CleanUpDatabaseTask.java index 1eca9ba92..a487d9ef4 100644 --- a/main/src/main/java/io/split/android/client/service/CleanUpDatabaseTask.java +++ b/main/src/main/java/io/split/android/client/service/CleanUpDatabaseTask.java @@ -4,7 +4,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.impressions.observer.PersistentImpressionsObserverCacheStorage; import io.split.android.client.storage.events.PersistentEventsStorage; import io.split.android.client.storage.impressions.PersistentImpressionsCountStorage; diff --git a/main/src/main/java/io/split/android/client/service/SplitTaskType.java b/main/src/main/java/io/split/android/client/service/SplitTaskType.java new file mode 100644 index 000000000..0ee0d016e --- /dev/null +++ b/main/src/main/java/io/split/android/client/service/SplitTaskType.java @@ -0,0 +1,25 @@ +package io.split.android.client.service; + +public enum SplitTaskType implements io.split.android.client.service.executor.SplitTaskType { + SPLITS_SYNC, + MY_SEGMENTS_SYNC, + EVENTS_RECORDER, + IMPRESSIONS_RECORDER, + LOAD_LOCAL_SPLITS, + LOAD_LOCAL_MY_SEGMENTS, + SSE_AUTHENTICATION_TASK, + SPLIT_KILL, + FILTER_SPLITS_CACHE, + CLEAN_UP_DATABASE, + IMPRESSIONS_COUNT_RECORDER, + SAVE_IMPRESSIONS_COUNT, + MY_SEGMENTS_UPDATE, + LOAD_LOCAL_ATTRIBUTES, + TELEMETRY_CONFIG_TASK, + TELEMETRY_STATS_TASK, + SAVE_UNIQUE_KEYS_TASK, + UNIQUE_KEYS_RECORDER_TASK, + MY_LARGE_SEGMENTS_UPDATE, + LOAD_LOCAL_RULE_BASED_SEGMENTS, + RULE_BASED_SEGMENT_SYNC, +} diff --git a/main/src/main/java/io/split/android/client/service/attributes/LoadAttributesTask.java b/main/src/main/java/io/split/android/client/service/attributes/LoadAttributesTask.java index fd7883012..58cebeee2 100644 --- a/main/src/main/java/io/split/android/client/service/attributes/LoadAttributesTask.java +++ b/main/src/main/java/io/split/android/client/service/attributes/LoadAttributesTask.java @@ -7,7 +7,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.attributes.AttributesStorage; import io.split.android.client.storage.attributes.PersistentAttributesStorage; diff --git a/main/src/main/java/io/split/android/client/service/events/EventsRecorderTask.java b/main/src/main/java/io/split/android/client/service/events/EventsRecorderTask.java index fa51ec1e0..e26d121da 100644 --- a/main/src/main/java/io/split/android/client/service/events/EventsRecorderTask.java +++ b/main/src/main/java/io/split/android/client/service/events/EventsRecorderTask.java @@ -7,7 +7,7 @@ import io.split.android.client.dtos.Event; import io.split.android.client.service.HttpRecorderSubmitterAdapter; import io.split.android.client.service.TelemetryRecorderAdapter; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.storage.events.PersistentEventsStorage; import io.split.android.client.submitter.RecorderTask; diff --git a/main/src/main/java/io/split/android/client/service/impressions/ImpressionsCountRecorderTask.java b/main/src/main/java/io/split/android/client/service/impressions/ImpressionsCountRecorderTask.java index 976d73ef3..32ae11600 100644 --- a/main/src/main/java/io/split/android/client/service/impressions/ImpressionsCountRecorderTask.java +++ b/main/src/main/java/io/split/android/client/service/impressions/ImpressionsCountRecorderTask.java @@ -7,7 +7,7 @@ import io.split.android.client.service.HttpRecorderSubmitterAdapter; import io.split.android.client.service.ServiceConstants; import io.split.android.client.service.TelemetryRecorderAdapter; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.storage.impressions.PersistentImpressionsCountStorage; import io.split.android.client.submitter.RecorderTask; diff --git a/main/src/main/java/io/split/android/client/service/impressions/ImpressionsRecorderTask.java b/main/src/main/java/io/split/android/client/service/impressions/ImpressionsRecorderTask.java index 57f737b93..d6fdabb7b 100644 --- a/main/src/main/java/io/split/android/client/service/impressions/ImpressionsRecorderTask.java +++ b/main/src/main/java/io/split/android/client/service/impressions/ImpressionsRecorderTask.java @@ -7,7 +7,7 @@ import io.split.android.client.dtos.KeyImpression; import io.split.android.client.service.HttpRecorderSubmitterAdapter; import io.split.android.client.service.TelemetryRecorderAdapter; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.storage.impressions.PersistentImpressionsStorage; import io.split.android.client.submitter.RecorderTask; diff --git a/main/src/main/java/io/split/android/client/service/impressions/SaveImpressionsCountTask.java b/main/src/main/java/io/split/android/client/service/impressions/SaveImpressionsCountTask.java index 564a137c1..8e8e5c303 100644 --- a/main/src/main/java/io/split/android/client/service/impressions/SaveImpressionsCountTask.java +++ b/main/src/main/java/io/split/android/client/service/impressions/SaveImpressionsCountTask.java @@ -6,7 +6,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.impressions.PersistentImpressionsCountStorage; import static io.split.android.client.utils.Utils.checkNotNull; diff --git a/main/src/main/java/io/split/android/client/service/impressions/strategy/ImpressionStrategyProvider.java b/main/src/main/java/io/split/android/client/service/impressions/strategy/ImpressionStrategyProvider.java index c76b65dc1..3c1a29235 100644 --- a/main/src/main/java/io/split/android/client/service/impressions/strategy/ImpressionStrategyProvider.java +++ b/main/src/main/java/io/split/android/client/service/impressions/strategy/ImpressionStrategyProvider.java @@ -5,7 +5,7 @@ import io.split.android.client.dtos.KeyImpression; import io.split.android.client.service.ServiceConstants; import io.split.android.client.service.executor.SplitTaskExecutor; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.impressions.ImpressionManagerRetryTimerProviderImpl; import io.split.android.client.service.impressions.ImpressionsCounter; import io.split.android.client.service.impressions.ImpressionsMode; diff --git a/main/src/main/java/io/split/android/client/service/impressions/unique/SaveUniqueImpressionsTask.java b/main/src/main/java/io/split/android/client/service/impressions/unique/SaveUniqueImpressionsTask.java index 2772ea031..a25148f7b 100644 --- a/main/src/main/java/io/split/android/client/service/impressions/unique/SaveUniqueImpressionsTask.java +++ b/main/src/main/java/io/split/android/client/service/impressions/unique/SaveUniqueImpressionsTask.java @@ -13,7 +13,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.impressions.PersistentImpressionsUniqueStorage; public class SaveUniqueImpressionsTask implements SplitTask { diff --git a/main/src/main/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTask.java b/main/src/main/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTask.java index cbafed13f..cac00741a 100644 --- a/main/src/main/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTask.java +++ b/main/src/main/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTask.java @@ -10,7 +10,7 @@ import java.util.Set; import io.split.android.client.service.HttpRecorderSubmitterAdapter; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.storage.impressions.PersistentImpressionsUniqueStorage; import io.split.android.client.submitter.RecorderTask; diff --git a/main/src/main/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfig.java b/main/src/main/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfig.java index 451d58dad..99ab45950 100644 --- a/main/src/main/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfig.java +++ b/main/src/main/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfig.java @@ -1,6 +1,6 @@ package io.split.android.client.service.mysegments; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; public class LoadMySegmentsTaskConfig { diff --git a/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfig.java b/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfig.java index 77ddd812d..42cadcde1 100644 --- a/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfig.java +++ b/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfig.java @@ -3,7 +3,7 @@ import androidx.annotation.NonNull; import io.split.android.client.events.SplitInternalEvent; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.telemetry.model.OperationType; public class MySegmentsSyncTaskConfig { diff --git a/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfig.java b/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfig.java index 5a3caf515..ad5ba08eb 100644 --- a/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfig.java +++ b/main/src/main/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfig.java @@ -3,7 +3,7 @@ import androidx.annotation.NonNull; import io.split.android.client.events.SplitInternalEvent; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.telemetry.model.streaming.UpdatesFromSSEEnum; public class MySegmentsUpdateTaskConfig { diff --git a/main/src/main/java/io/split/android/client/service/rules/LoadRuleBasedSegmentsTask.java b/main/src/main/java/io/split/android/client/service/rules/LoadRuleBasedSegmentsTask.java index ba8731c4a..3a740d6f5 100644 --- a/main/src/main/java/io/split/android/client/service/rules/LoadRuleBasedSegmentsTask.java +++ b/main/src/main/java/io/split/android/client/service/rules/LoadRuleBasedSegmentsTask.java @@ -6,7 +6,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.rbs.RuleBasedSegmentStorage; import io.split.android.client.utils.logger.Logger; diff --git a/main/src/main/java/io/split/android/client/service/rules/RuleBasedSegmentInPlaceUpdateTask.java b/main/src/main/java/io/split/android/client/service/rules/RuleBasedSegmentInPlaceUpdateTask.java index 72c05e4a2..656b5aff0 100644 --- a/main/src/main/java/io/split/android/client/service/rules/RuleBasedSegmentInPlaceUpdateTask.java +++ b/main/src/main/java/io/split/android/client/service/rules/RuleBasedSegmentInPlaceUpdateTask.java @@ -10,7 +10,7 @@ import io.split.android.client.events.metadata.EventMetadataHelpers; import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.rbs.RuleBasedSegmentStorage; import io.split.android.client.utils.logger.Logger; diff --git a/main/src/main/java/io/split/android/client/service/splits/FilterSplitsInCacheTask.java b/main/src/main/java/io/split/android/client/service/splits/FilterSplitsInCacheTask.java index 2fb16db3a..6b6357f3c 100644 --- a/main/src/main/java/io/split/android/client/service/splits/FilterSplitsInCacheTask.java +++ b/main/src/main/java/io/split/android/client/service/splits/FilterSplitsInCacheTask.java @@ -12,7 +12,7 @@ import io.split.android.client.dtos.Split; import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.splits.PersistentSplitsStorage; import io.split.android.client.utils.logger.Logger; diff --git a/main/src/main/java/io/split/android/client/service/splits/LoadSplitsTask.java b/main/src/main/java/io/split/android/client/service/splits/LoadSplitsTask.java index 49ca1d512..ab9731bb3 100644 --- a/main/src/main/java/io/split/android/client/service/splits/LoadSplitsTask.java +++ b/main/src/main/java/io/split/android/client/service/splits/LoadSplitsTask.java @@ -7,7 +7,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.splits.SplitsStorage; import io.split.android.client.utils.logger.Logger; diff --git a/main/src/main/java/io/split/android/client/service/splits/RuleBasedSegmentInPlaceUpdateTask.java b/main/src/main/java/io/split/android/client/service/splits/RuleBasedSegmentInPlaceUpdateTask.java index 6fb8fc8dc..2b6d886b5 100644 --- a/main/src/main/java/io/split/android/client/service/splits/RuleBasedSegmentInPlaceUpdateTask.java +++ b/main/src/main/java/io/split/android/client/service/splits/RuleBasedSegmentInPlaceUpdateTask.java @@ -10,7 +10,7 @@ import io.split.android.client.events.metadata.EventMetadataHelpers; import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.rules.ProcessedRuleBasedSegmentChange; import io.split.android.client.service.rules.RuleBasedSegmentChangeProcessor; import io.split.android.client.storage.rbs.RuleBasedSegmentStorage; diff --git a/main/src/main/java/io/split/android/client/service/splits/SplitInPlaceUpdateTask.java b/main/src/main/java/io/split/android/client/service/splits/SplitInPlaceUpdateTask.java index 2c86042b0..2b8345f7d 100644 --- a/main/src/main/java/io/split/android/client/service/splits/SplitInPlaceUpdateTask.java +++ b/main/src/main/java/io/split/android/client/service/splits/SplitInPlaceUpdateTask.java @@ -14,7 +14,7 @@ import io.split.android.client.events.metadata.EventMetadataHelpers; import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.splits.ProcessedSplitChange; import io.split.android.client.storage.splits.SplitsStorage; import io.split.android.client.telemetry.model.streaming.UpdatesFromSSEEnum; diff --git a/main/src/main/java/io/split/android/client/service/splits/SplitKillTask.java b/main/src/main/java/io/split/android/client/service/splits/SplitKillTask.java index 001d4ec04..53ee6f518 100644 --- a/main/src/main/java/io/split/android/client/service/splits/SplitKillTask.java +++ b/main/src/main/java/io/split/android/client/service/splits/SplitKillTask.java @@ -13,7 +13,7 @@ import io.split.android.client.events.metadata.EventMetadataHelpers; import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.splits.SplitsStorage; import io.split.android.client.utils.logger.Logger; diff --git a/main/src/main/java/io/split/android/client/service/splits/SplitsSyncHelper.java b/main/src/main/java/io/split/android/client/service/splits/SplitsSyncHelper.java index 60155c321..208cc557e 100644 --- a/main/src/main/java/io/split/android/client/service/splits/SplitsSyncHelper.java +++ b/main/src/main/java/io/split/android/client/service/splits/SplitsSyncHelper.java @@ -25,7 +25,7 @@ import io.split.android.client.network.SplitHttpHeadersBuilder; import io.split.android.client.service.ServiceConstants; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpFetcher; import io.split.android.client.service.http.HttpFetcherException; import io.split.android.client.service.http.HttpStatus; diff --git a/main/src/main/java/io/split/android/client/service/splits/SplitsUpdateTask.java b/main/src/main/java/io/split/android/client/service/splits/SplitsUpdateTask.java index d14600725..8bddb0d04 100644 --- a/main/src/main/java/io/split/android/client/service/splits/SplitsUpdateTask.java +++ b/main/src/main/java/io/split/android/client/service/splits/SplitsUpdateTask.java @@ -17,7 +17,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.synchronizer.SplitsChangeChecker; import io.split.android.client.storage.rbs.RuleBasedSegmentStorage; import io.split.android.client.storage.splits.SplitsStorage; diff --git a/main/src/main/java/io/split/android/client/service/synchronizer/SynchronizerImpl.java b/main/src/main/java/io/split/android/client/service/synchronizer/SynchronizerImpl.java index 51d6feaa4..d0609534a 100644 --- a/main/src/main/java/io/split/android/client/service/synchronizer/SynchronizerImpl.java +++ b/main/src/main/java/io/split/android/client/service/synchronizer/SynchronizerImpl.java @@ -19,7 +19,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutor; import io.split.android.client.service.executor.SplitTaskFactory; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.impressions.StrategyImpressionManager; import io.split.android.client.service.sseclient.feedbackchannel.PushManagerEventBroadcaster; import io.split.android.client.service.sseclient.sseclient.RetryBackoffCounterTimer; @@ -307,14 +307,12 @@ private void scheduleEventsRecorderTask() { @Override public void taskExecuted(@NonNull SplitTaskExecutionInfo taskInfo) { - switch (taskInfo.getTaskType()) { - case SPLITS_SYNC: - mFeatureFlagsSynchronizer.submitLoadingTask(null); - break; - case MY_SEGMENTS_SYNC: - Logger.d("Loading my segments updated in background"); - mMySegmentsSynchronizerRegistry.submitMySegmentsLoadingTask(); - break; + io.split.android.client.service.executor.SplitTaskType type = taskInfo.getTaskType(); + if (type == SplitTaskType.SPLITS_SYNC) { + mFeatureFlagsSynchronizer.submitLoadingTask(null); + } else if (type == SplitTaskType.MY_SEGMENTS_SYNC) { + Logger.d("Loading my segments updated in background"); + mMySegmentsSynchronizerRegistry.submitMySegmentsLoadingTask(); } } } diff --git a/main/src/main/java/io/split/android/client/service/synchronizer/WorkManagerWrapper.java b/main/src/main/java/io/split/android/client/service/synchronizer/WorkManagerWrapper.java index 2b86786fd..0e7c94814 100644 --- a/main/src/main/java/io/split/android/client/service/synchronizer/WorkManagerWrapper.java +++ b/main/src/main/java/io/split/android/client/service/synchronizer/WorkManagerWrapper.java @@ -29,7 +29,7 @@ import io.split.android.client.service.ServiceConstants; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionListener; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.impressions.ImpressionManagerConfig; import io.split.android.client.service.synchronizer.mysegments.MySegmentsWorkManagerWrapper; import io.split.android.client.service.workmanager.EventsRecorderWorker; diff --git a/main/src/main/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTask.java b/main/src/main/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTask.java index 5083359dd..568668d86 100644 --- a/main/src/main/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTask.java +++ b/main/src/main/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTask.java @@ -8,7 +8,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.service.http.HttpStatus; diff --git a/main/src/main/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTask.java b/main/src/main/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTask.java index c6c8fbd21..464055ac2 100644 --- a/main/src/main/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTask.java +++ b/main/src/main/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTask.java @@ -8,7 +8,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.service.http.HttpStatus; diff --git a/main/src/test/java/io/split/android/client/service/EventsRecorderTaskTest.java b/main/src/test/java/io/split/android/client/service/EventsRecorderTaskTest.java index 9fe3c763a..f3c9d5420 100644 --- a/main/src/test/java/io/split/android/client/service/EventsRecorderTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/EventsRecorderTaskTest.java @@ -24,7 +24,7 @@ import io.split.android.client.service.events.EventsRecorderTaskConfig; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.storage.events.PersistentEventsStorage; diff --git a/main/src/test/java/io/split/android/client/service/ImpressionsCountRecorderTaskTest.java b/main/src/test/java/io/split/android/client/service/ImpressionsCountRecorderTaskTest.java index 11d20af45..d8ac9d9ba 100644 --- a/main/src/test/java/io/split/android/client/service/ImpressionsCountRecorderTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/ImpressionsCountRecorderTaskTest.java @@ -24,7 +24,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.service.impressions.ImpressionsCount; diff --git a/main/src/test/java/io/split/android/client/service/ImpressionsRecorderTaskTest.java b/main/src/test/java/io/split/android/client/service/ImpressionsRecorderTaskTest.java index 913cd9511..632be84ab 100644 --- a/main/src/test/java/io/split/android/client/service/ImpressionsRecorderTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/ImpressionsRecorderTaskTest.java @@ -25,7 +25,7 @@ import io.split.android.client.service.executor.SplitTask; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.service.impressions.ImpressionsRecorderTask; diff --git a/main/src/test/java/io/split/android/client/service/LoadSplitsTaskTest.java b/main/src/test/java/io/split/android/client/service/LoadSplitsTaskTest.java index 0720c7064..f07aa402f 100644 --- a/main/src/test/java/io/split/android/client/service/LoadSplitsTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/LoadSplitsTaskTest.java @@ -11,7 +11,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.splits.LoadSplitsTask; import io.split.android.client.storage.splits.SplitsStorage; diff --git a/main/src/test/java/io/split/android/client/service/MySegmentsUpdateTaskTest.java b/main/src/test/java/io/split/android/client/service/MySegmentsUpdateTaskTest.java index 663602b30..109d32bbc 100644 --- a/main/src/test/java/io/split/android/client/service/MySegmentsUpdateTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/MySegmentsUpdateTaskTest.java @@ -29,7 +29,7 @@ import io.split.android.client.events.SplitInternalEvent; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpFetcherException; import io.split.android.client.service.mysegments.MySegmentsUpdateTask; import io.split.android.client.service.mysegments.MySegmentsUpdateTaskConfig; diff --git a/main/src/test/java/io/split/android/client/service/SplitKillTaskTest.java b/main/src/test/java/io/split/android/client/service/SplitKillTaskTest.java index beb9d4043..e3dd8261b 100644 --- a/main/src/test/java/io/split/android/client/service/SplitKillTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/SplitKillTaskTest.java @@ -17,7 +17,7 @@ import io.split.android.client.events.SplitInternalEvent; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpFetcherException; import io.split.android.client.service.splits.SplitKillTask; import io.split.android.client.storage.splits.SplitsStorage; diff --git a/main/src/test/java/io/split/android/client/service/SplitSyncTaskTest.java b/main/src/test/java/io/split/android/client/service/SplitSyncTaskTest.java index 45bc7b228..e63578b11 100644 --- a/main/src/test/java/io/split/android/client/service/SplitSyncTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/SplitSyncTaskTest.java @@ -36,7 +36,7 @@ import io.split.android.client.events.SplitEventsManager; import io.split.android.client.events.SplitInternalEvent; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpFetcherException; import io.split.android.client.service.splits.SplitsSyncHelper; import io.split.android.client.service.splits.SplitsSyncTask; diff --git a/main/src/test/java/io/split/android/client/service/SplitUpdateTaskTest.java b/main/src/test/java/io/split/android/client/service/SplitUpdateTaskTest.java index fda1b1a89..d46d9dc04 100644 --- a/main/src/test/java/io/split/android/client/service/SplitUpdateTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/SplitUpdateTaskTest.java @@ -29,7 +29,7 @@ import io.split.android.client.events.SplitInternalEvent; import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpFetcherException; import io.split.android.client.service.splits.SplitsSyncHelper; import io.split.android.client.service.splits.SplitsUpdateTask; diff --git a/main/src/test/java/io/split/android/client/service/SynchronizerTest.java b/main/src/test/java/io/split/android/client/service/SynchronizerTest.java index db14dcc2b..c6eb2ac1b 100644 --- a/main/src/test/java/io/split/android/client/service/SynchronizerTest.java +++ b/main/src/test/java/io/split/android/client/service/SynchronizerTest.java @@ -53,7 +53,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutor; import io.split.android.client.service.executor.SplitTaskFactory; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpFetcher; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.impressions.ImpressionManagerConfig; diff --git a/main/src/test/java/io/split/android/client/service/attributes/LoadAttributesTaskTest.java b/main/src/test/java/io/split/android/client/service/attributes/LoadAttributesTaskTest.java index 052581c27..eb71fc99c 100644 --- a/main/src/test/java/io/split/android/client/service/attributes/LoadAttributesTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/attributes/LoadAttributesTaskTest.java @@ -15,7 +15,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.storage.attributes.AttributesStorage; import io.split.android.client.storage.attributes.PersistentAttributesStorage; diff --git a/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugStrategyTest.kt b/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugStrategyTest.kt index c6c1d0bf9..cf6034c85 100644 --- a/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugStrategyTest.kt +++ b/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugStrategyTest.kt @@ -4,7 +4,7 @@ import io.split.android.client.dtos.KeyImpression import io.split.android.client.service.executor.SplitTaskExecutionInfo import io.split.android.client.service.executor.SplitTaskExecutionListener import io.split.android.client.service.executor.SplitTaskExecutor -import io.split.android.client.service.executor.SplitTaskType +import io.split.android.client.service.SplitTaskType import io.split.android.client.service.impressions.ImpressionsRecorderTask import io.split.android.client.service.impressions.ImpressionsTaskFactory import io.split.android.client.service.impressions.observer.ImpressionsObserver diff --git a/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugTrackerTest.kt b/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugTrackerTest.kt index 66e17142c..76d5ee1d9 100644 --- a/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugTrackerTest.kt +++ b/main/src/test/java/io/split/android/client/service/impressions/strategy/DebugTrackerTest.kt @@ -4,7 +4,7 @@ import io.split.android.client.dtos.KeyImpression import io.split.android.client.service.executor.SplitTaskExecutionInfo import io.split.android.client.service.executor.SplitTaskExecutionListener import io.split.android.client.service.executor.SplitTaskExecutor -import io.split.android.client.service.executor.SplitTaskType +import io.split.android.client.service.SplitTaskType import io.split.android.client.service.impressions.ImpressionsRecorderTask import io.split.android.client.service.impressions.ImpressionsTaskFactory import io.split.android.client.service.impressions.observer.ImpressionsObserver diff --git a/main/src/test/java/io/split/android/client/service/impressions/strategy/NoneTrackerTest.kt b/main/src/test/java/io/split/android/client/service/impressions/strategy/NoneTrackerTest.kt index 8d1ebe1f9..617a578f9 100644 --- a/main/src/test/java/io/split/android/client/service/impressions/strategy/NoneTrackerTest.kt +++ b/main/src/test/java/io/split/android/client/service/impressions/strategy/NoneTrackerTest.kt @@ -6,7 +6,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo.DO_NOT_RE import io.split.android.client.service.executor.SplitTaskExecutionListener import io.split.android.client.service.executor.SplitTaskExecutor import io.split.android.client.service.executor.SplitTaskSerialWrapper -import io.split.android.client.service.executor.SplitTaskType +import io.split.android.client.service.SplitTaskType import io.split.android.client.service.impressions.* import io.split.android.client.service.impressions.unique.SaveUniqueImpressionsTask import io.split.android.client.service.impressions.unique.UniqueKeysRecorderTask diff --git a/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedStrategyTest.kt b/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedStrategyTest.kt index ddd5967c8..ac312c089 100644 --- a/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedStrategyTest.kt +++ b/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedStrategyTest.kt @@ -6,7 +6,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo import io.split.android.client.service.executor.SplitTaskExecutionInfo.DO_NOT_RETRY import io.split.android.client.service.executor.SplitTaskExecutionListener import io.split.android.client.service.executor.SplitTaskExecutor -import io.split.android.client.service.executor.SplitTaskType +import io.split.android.client.service.SplitTaskType import io.split.android.client.service.impressions.ImpressionsCounter import io.split.android.client.service.impressions.ImpressionsRecorderTask import io.split.android.client.service.impressions.ImpressionsTaskFactory diff --git a/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedTrackerTest.kt b/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedTrackerTest.kt index 5bd1c4952..dca54065c 100644 --- a/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedTrackerTest.kt +++ b/main/src/test/java/io/split/android/client/service/impressions/strategy/OptimizedTrackerTest.kt @@ -6,7 +6,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo.DO_NOT_RE import io.split.android.client.service.executor.SplitTaskExecutionListener import io.split.android.client.service.executor.SplitTaskExecutor import io.split.android.client.service.executor.SplitTaskSerialWrapper -import io.split.android.client.service.executor.SplitTaskType +import io.split.android.client.service.SplitTaskType import io.split.android.client.service.impressions.* import io.split.android.client.service.impressions.observer.ImpressionsObserver import io.split.android.client.service.sseclient.sseclient.RetryBackoffCounterTimer diff --git a/main/src/test/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTaskTest.java b/main/src/test/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTaskTest.java index 93839a0ad..f12c33e44 100644 --- a/main/src/test/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/impressions/unique/UniqueKeysRecorderTaskTest.java @@ -25,7 +25,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.storage.impressions.PersistentImpressionsUniqueStorage; diff --git a/main/src/test/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfigTest.java b/main/src/test/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfigTest.java index 9973189e6..6e1e224de 100644 --- a/main/src/test/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfigTest.java +++ b/main/src/test/java/io/split/android/client/service/mysegments/LoadMySegmentsTaskConfigTest.java @@ -4,7 +4,7 @@ import org.junit.Test; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; public class LoadMySegmentsTaskConfigTest { diff --git a/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfigTest.java b/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfigTest.java index 7e2d8b3c0..207c5c479 100644 --- a/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfigTest.java +++ b/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsSyncTaskConfigTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import io.split.android.client.events.SplitInternalEvent; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.telemetry.model.OperationType; public class MySegmentsSyncTaskConfigTest { diff --git a/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfigTest.java b/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfigTest.java index ea7f26181..b212b848e 100644 --- a/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfigTest.java +++ b/main/src/test/java/io/split/android/client/service/mysegments/MySegmentsUpdateTaskConfigTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import io.split.android.client.events.SplitInternalEvent; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.telemetry.model.streaming.UpdatesFromSSEEnum; public class MySegmentsUpdateTaskConfigTest { diff --git a/main/src/test/java/io/split/android/client/service/sseclient/SplitUpdateWorkerTest.java b/main/src/test/java/io/split/android/client/service/sseclient/SplitUpdateWorkerTest.java index b946113db..8fe8012c4 100644 --- a/main/src/test/java/io/split/android/client/service/sseclient/SplitUpdateWorkerTest.java +++ b/main/src/test/java/io/split/android/client/service/sseclient/SplitUpdateWorkerTest.java @@ -27,7 +27,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutor; import io.split.android.client.service.executor.SplitTaskFactory; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.rules.RuleBasedSegmentInPlaceUpdateTask; import io.split.android.client.service.splits.SplitInPlaceUpdateTask; import io.split.android.client.service.sseclient.notifications.InstantUpdateChangeNotification; diff --git a/main/src/test/java/io/split/android/client/service/sseclient/sseclient/RetryBackoffCounterTimerTest.java b/main/src/test/java/io/split/android/client/service/sseclient/sseclient/RetryBackoffCounterTimerTest.java index 02a7afabc..2aafc3dcd 100644 --- a/main/src/test/java/io/split/android/client/service/sseclient/sseclient/RetryBackoffCounterTimerTest.java +++ b/main/src/test/java/io/split/android/client/service/sseclient/sseclient/RetryBackoffCounterTimerTest.java @@ -26,7 +26,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutionStatus; import io.split.android.client.service.executor.SplitTaskExecutor; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.backoff.BackoffCounter; public class RetryBackoffCounterTimerTest { diff --git a/main/src/test/java/io/split/android/client/service/synchronizer/FeatureFlagsSynchronizerImplTest.java b/main/src/test/java/io/split/android/client/service/synchronizer/FeatureFlagsSynchronizerImplTest.java index 515d3dd3e..32215d873 100644 --- a/main/src/test/java/io/split/android/client/service/synchronizer/FeatureFlagsSynchronizerImplTest.java +++ b/main/src/test/java/io/split/android/client/service/synchronizer/FeatureFlagsSynchronizerImplTest.java @@ -34,7 +34,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutor; import io.split.android.client.service.executor.SplitTaskFactory; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.rules.LoadRuleBasedSegmentsTask; import io.split.android.client.service.splits.FilterSplitsInCacheTask; import io.split.android.client.service.splits.LoadSplitsTask; diff --git a/main/src/test/java/io/split/android/client/service/synchronizer/LoadLocalDataListenerTest.java b/main/src/test/java/io/split/android/client/service/synchronizer/LoadLocalDataListenerTest.java index 252c29696..8a6a861e9 100644 --- a/main/src/test/java/io/split/android/client/service/synchronizer/LoadLocalDataListenerTest.java +++ b/main/src/test/java/io/split/android/client/service/synchronizer/LoadLocalDataListenerTest.java @@ -16,7 +16,7 @@ import io.split.android.client.events.ISplitEventsManager; import io.split.android.client.events.SplitInternalEvent; import io.split.android.client.service.executor.SplitTaskExecutionInfo; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; public class LoadLocalDataListenerTest { diff --git a/main/src/test/java/io/split/android/client/service/synchronizer/RecorderSyncHelperImplTest.java b/main/src/test/java/io/split/android/client/service/synchronizer/RecorderSyncHelperImplTest.java index dfdaf24a8..56d1be867 100644 --- a/main/src/test/java/io/split/android/client/service/synchronizer/RecorderSyncHelperImplTest.java +++ b/main/src/test/java/io/split/android/client/service/synchronizer/RecorderSyncHelperImplTest.java @@ -10,7 +10,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutor; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.submitter.RecorderSyncHelperImpl; import io.split.android.client.submitter.StoragePusher; diff --git a/main/src/test/java/io/split/android/client/service/synchronizer/mysegments/MySegmentsSynchronizerImplTest.java b/main/src/test/java/io/split/android/client/service/synchronizer/mysegments/MySegmentsSynchronizerImplTest.java index 2c87b101a..a542cbd0a 100644 --- a/main/src/test/java/io/split/android/client/service/synchronizer/mysegments/MySegmentsSynchronizerImplTest.java +++ b/main/src/test/java/io/split/android/client/service/synchronizer/mysegments/MySegmentsSynchronizerImplTest.java @@ -28,7 +28,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutor; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.mysegments.LoadMySegmentsTask; import io.split.android.client.service.mysegments.MySegmentUpdateParams; import io.split.android.client.service.mysegments.MySegmentsSyncTask; diff --git a/main/src/test/java/io/split/android/client/service/telemetry/SynchronizerImplTelemetryTest.java b/main/src/test/java/io/split/android/client/service/telemetry/SynchronizerImplTelemetryTest.java index 2c83e3ada..914b73e8f 100644 --- a/main/src/test/java/io/split/android/client/service/telemetry/SynchronizerImplTelemetryTest.java +++ b/main/src/test/java/io/split/android/client/service/telemetry/SynchronizerImplTelemetryTest.java @@ -22,7 +22,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutor; import io.split.android.client.service.executor.SplitTaskFactory; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.impressions.StrategyImpressionManager; import io.split.android.client.service.splits.SplitsSyncTask; import io.split.android.client.service.sseclient.feedbackchannel.PushManagerEventBroadcaster; diff --git a/main/src/test/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTaskTest.java b/main/src/test/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTaskTest.java index f3182ffdc..6ee10c633 100644 --- a/main/src/test/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/telemetry/TelemetryConfigRecorderTaskTest.java @@ -20,7 +20,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.telemetry.model.Config; diff --git a/main/src/test/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTaskTest.java b/main/src/test/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTaskTest.java index 7ab3064ae..adbe1137e 100644 --- a/main/src/test/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTaskTest.java +++ b/main/src/test/java/io/split/android/client/service/telemetry/TelemetryStatsRecorderTaskTest.java @@ -19,7 +19,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionStatus; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.http.HttpRecorder; import io.split.android.client.service.http.HttpRecorderException; import io.split.android.client.telemetry.model.OperationType; diff --git a/main/src/test/java/io/split/android/client/telemetry/TelemetrySynchronizerImplTest.java b/main/src/test/java/io/split/android/client/telemetry/TelemetrySynchronizerImplTest.java index bf099811e..2c565c82c 100644 --- a/main/src/test/java/io/split/android/client/telemetry/TelemetrySynchronizerImplTest.java +++ b/main/src/test/java/io/split/android/client/telemetry/TelemetrySynchronizerImplTest.java @@ -22,7 +22,7 @@ import io.split.android.client.service.executor.SplitTaskExecutionInfo; import io.split.android.client.service.executor.SplitTaskExecutionListener; import io.split.android.client.service.executor.SplitTaskExecutor; -import io.split.android.client.service.executor.SplitTaskType; +import io.split.android.client.service.SplitTaskType; import io.split.android.client.service.sseclient.sseclient.RetryBackoffCounterTimer; import io.split.android.client.service.telemetry.TelemetryConfigRecorderTask; import io.split.android.client.service.telemetry.TelemetryStatsRecorderTask; diff --git a/submitter/src/test/java/io/split/android/client/submitter/RecorderTaskTest.java b/submitter/src/test/java/io/split/android/client/submitter/RecorderTaskTest.java index 1e0994e6e..763a7d22b 100644 --- a/submitter/src/test/java/io/split/android/client/submitter/RecorderTaskTest.java +++ b/submitter/src/test/java/io/split/android/client/submitter/RecorderTaskTest.java @@ -29,7 +29,7 @@ public class RecorderTaskTest { private static final int BATCH_SIZE = 10; - private static final SplitTaskType TASK_TYPE = SplitTaskType.IMPRESSIONS_RECORDER; + private static final SplitTaskType TASK_TYPE = new SplitTaskType() {}; private RecorderStorage mStorage; private RecorderSubmitter> mSubmitter; From 4550e1472fb1addec1ab4df8f30e73c8e3b0596c Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Tue, 17 Mar 2026 19:35:28 -0300 Subject: [PATCH 3/4] Fixes --- executor/.classpath | 6 -- executor/.gitignore | 2 + .../org.eclipse.buildship.core.prefs | 2 - main/AGENTS.md | 69 ------------------- main/CLAUDE.md | 1 - 5 files changed, 2 insertions(+), 78 deletions(-) delete mode 100644 executor/.classpath delete mode 100644 executor/.settings/org.eclipse.buildship.core.prefs delete mode 100644 main/AGENTS.md delete mode 120000 main/CLAUDE.md diff --git a/executor/.classpath b/executor/.classpath deleted file mode 100644 index d9b92d645..000000000 --- a/executor/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/executor/.gitignore b/executor/.gitignore index a9c32b0f6..22e7e7b81 100644 --- a/executor/.gitignore +++ b/executor/.gitignore @@ -1,3 +1,5 @@ /build .gradle local.properties +.classpath +.settings \ No newline at end of file diff --git a/executor/.settings/org.eclipse.buildship.core.prefs b/executor/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index b1886adb4..000000000 --- a/executor/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/main/AGENTS.md b/main/AGENTS.md deleted file mode 100644 index 21eaf0457..000000000 --- a/main/AGENTS.md +++ /dev/null @@ -1,69 +0,0 @@ -# AGENTS.md — main module - -## Purpose - -Core SDK logic for the Split Android SDK. This is the largest and most complex module, containing: -- `SplitClient` / `SplitFactory` implementation -- Feature flag evaluation engine (matchers, splitter, parser) -- Data synchronization (splits, segments, SSE streaming) -- Impressions and events tracking -- Storage (database via Room/SQLite) -- Telemetry, lifecycle management, localhost mode - -## Key Packages - -| Package | Description | -|---------|-------------| -| `io.split.android.client` | Top-level: SplitClientImpl, SplitFactoryImpl, SplitClientConfig, EvaluatorImpl | -| `io.split.android.client.api` | Public API implementations | -| `io.split.android.client.service` | Background services: splits sync, segments sync, SSE, impressions, events, telemetry | -| `io.split.android.client.service.executor` | Task executor and SplitTaskFactory | -| `io.split.android.client.service.sseclient` | SSE client and BackoffCounterTimer | -| `io.split.android.client.service.synchronizer` | Sync orchestration | -| `io.split.android.client.impressions` | Impression capture, deduplication, flushing | -| `io.split.android.client.factory` | SplitFactoryImpl and SplitFactoryHelper | -| `io.split.android.client.localhost` | Localhost mode (YAML/JSON feature flag files) | -| `io.split.android.client.shared` | SplitClientContainer, shared state | -| `io.split.android.engine` | Evaluation engine: experiments (ParsedSplit), matchers, splitter | -| `io.split.android.engine.experiments` | SplitParser, ParsedSplit, FetcherPolicy | -| `io.split.android.engine.matchers` | All matcher implementations (string, set, number, semver, date) | - -## Testing - -- **Run unit tests**: `./gradlew :main:test` -- **Run a single class**: `./gradlew :main:test --tests "io.split.android.client."` -- **Test sources**: `main/src/test/java/` + `main/src/sharedTest/java/` (shared with instrumented tests) -- **Instrumented tests**: `main/src/androidTest/java/` — requires device/emulator farm (Sauce Labs) -- **Test options**: `unitTests.returnDefaultValues = true` (mocks Android framework returns) - -## Dependencies - -This module depends on all other modules: -- `:api` — public interfaces -- `:logger` — logging -- `:http`, `:http-api` — networking -- `:fallback` — fallback treatments -- `:events`, `:events-domain` — event processing -- `:backoff` — retry logic -- `:tracker` — impression/event tracking - -## Important Patterns - -- **Task pattern**: Background work is modeled as `SplitTask` implementations, scheduled via `SplitTaskExecutor` -- **Factory pattern**: `SplitTaskFactoryImpl` wires together all tasks; `SplitClientFactoryImpl` creates clients -- **SSE streaming**: SSE client with `BackoffCounterTimer` (now from `:backoff` module) for reconnect -- **Shared state**: `SplitClientContainer` manages multiple `SplitClient` instances (multi-key support) -- **Localhost mode**: Reads feature flags from YAML/JSON files without connecting to Split servers - -## DOs - -- Follow the existing `SplitTask` interface when adding new background tasks -- Maintain the `SplitTaskFactory` interface in `:api` when adding new task types -- Add corresponding unit tests in `src/test/` for all new evaluator/matcher logic -- Use `RetryBackoffCounterTimerFactory` for retry-capable timers (delegates to `:backoff` module) - -## DON'Ts - -- Don't add direct dependencies on Android UI framework (this is a library, not an app) -- Don't put public API interfaces in this module — they belong in `:api` -- Don't add instrumented-test-only dependencies to the main `dependencies` block diff --git a/main/CLAUDE.md b/main/CLAUDE.md deleted file mode 120000 index 47dc3e3d8..000000000 --- a/main/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -AGENTS.md \ No newline at end of file From 03330e034a98357a1754139d6e80ab74ea5a71a2 Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Tue, 17 Mar 2026 19:45:42 -0300 Subject: [PATCH 4/4] Udpate readme --- executor/README.md | 65 ++-------------------------------------------- 1 file changed, 2 insertions(+), 63 deletions(-) diff --git a/executor/README.md b/executor/README.md index debfea966..e07ec571a 100644 --- a/executor/README.md +++ b/executor/README.md @@ -4,59 +4,7 @@ Generic task scheduling and execution infrastructure for the Split Android SDK. ## Purpose -Provides a pausable, lifecycle-aware task executor with support for: -- Scheduled and immediate task execution -- Parallel task execution with timeout -- Serial and batch task wrappers -- Main thread task execution via Android Handler -- Pause/resume support for Android lifecycle management - -## Public API - -### Core Executor - -| Class / Interface | Role | -|---|---| -| `SplitTaskExecutor` | Main interface for task scheduling and execution | -| `SplitTaskExecutorImpl` | Default implementation with configurable thread pool | -| `SplitSingleThreadTaskExecutor` | Single-threaded variant for sequential execution | -| `SplitBaseTaskExecutor` | Abstract base with pause/resume and lifecycle management | - -### Task Abstractions - -| Class / Interface | Role | -|---|---| -| `SplitTask` | Task interface with single `execute()` method | -| `SplitTaskType` | Enum of 18 task types (SPLITS_SYNC, EVENTS_RECORDER, etc.) | -| `SplitTaskExecutionInfo` | Execution result with status, type, and optional data | -| `SplitTaskExecutionStatus` | SUCCESS or ERROR status enum | -| `SplitTaskExecutionListener` | Callback interface for task completion | - -### Parallel Execution - -| Class / Interface | Role | -|---|---| -| `SplitParallelTaskExecutor` | Interface for parallel task execution with timeout | -| `SplitParallelTaskExecutorImpl` | Implementation using ExecutorService.invokeAll() | -| `SplitParallelTaskExecutorFactory` | Factory for creating parallel executors | - -### Wrappers & Utilities - -| Class / Interface | Role | -|---|---| -| `TaskWrapper` | Wraps SplitTask with execution listener callback | -| `SplitTaskSerialWrapper` | Executes multiple tasks serially, stops on first error | -| `SplitTaskBatchWrapper` | Batch execution wrapper for multiple tasks | -| `ThreadFactoryBuilder` | Creates named daemon threads for executor | - -### Pausable Schedulers - -| Class / Interface | Role | -|---|---| -| `PausableScheduledThreadPoolExecutor` | Interface extending ScheduledExecutorService with pause/resume | -| `PausableScheduledThreadPoolExecutorImpl` | Implementation with lifecycle-aware scheduling | -| `PausableThreadPoolExecutor` | Non-scheduled pausable executor interface | -| `PausableThreadPoolExecutorImpl` | Non-scheduled pausable executor implementation | +Provides a pausable task executor with support for scheduled and immediate task execution, parallel task execution with timeout, serial and batch task wrappers, main thread task execution via Android Handler, and pause/resume/stop controls. ## Usage @@ -67,7 +15,7 @@ SplitTaskExecutor executor = new SplitTaskExecutorImpl(); SplitTask task = () -> { // Do work - return SplitTaskExecutionInfo.success(SplitTaskType.SPLITS_SYNC); + return SplitTaskExecutionInfo.success(SplitTaskType.GENERIC_TASK); }; executor.submit(task, null); @@ -110,12 +58,3 @@ executor.stop(); // Stop and shutdown executor - **logger**: Logging abstraction - **Android framework**: Handler/Looper for main thread execution - **AndroidX annotations**: @NonNull, @Nullable, etc. - -## Wiring (in main module) - -Created in `SplitFactoryImpl`: - -```java -SplitTaskExecutor executor = new SplitTaskExecutorImpl(); -SplitTaskExecutor sseExecutor = new SplitSingleThreadTaskExecutor(); -```