diff --git a/tests/src/com/android/launcher3/util/rule/LazyActivityRule.java b/tests/src/com/android/launcher3/util/rule/LazyActivityRule.java
deleted file mode 100644
index 6c300bb..0000000
--- a/tests/src/com/android/launcher3/util/rule/LazyActivityRule.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.util.rule;
-
-import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
-
-import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-
-import androidx.annotation.Nullable;
-import androidx.test.core.app.ActivityScenario;
-
-import com.android.launcher3.Launcher;
-
-import org.junit.rules.ExternalResource;
-
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Supplier;
-
-/**
- * Similar to {@code ActivityScenarioRule} but it creates the activity lazily when needed
- */
-public class LazyActivityRule<A extends Activity> extends ExternalResource {
-
-    private final Supplier<ActivityScenario<A>> mScenarioSupplier;
-
-    @Nullable private ActivityScenario<A> mScenario;
-
-    /**
-     * Constructs LazyActivityScenarioRule for a given scenario provider.
-     */
-    public LazyActivityRule(Supplier<ActivityScenario<A>> supplier) {
-        mScenarioSupplier = supplier;
-    }
-
-    /**
-     * Resets the rule, such that the activity is in closed state
-     */
-    public synchronized void reset() {
-        if (mScenario != null) {
-            try {
-                mScenario.close();
-            } catch (AssertionError e) {
-                // Ignore errors during close
-            }
-        }
-        mScenario = null;
-    }
-
-    @Override
-    protected synchronized void after() {
-        reset();
-    }
-
-    /**
-     * Returns the scenario, creating one if it doesn't exist
-     */
-    public synchronized ActivityScenario<A> getScenario() {
-        if (mScenario == null) {
-            mScenario = mScenarioSupplier.get();
-        }
-        return mScenario;
-    }
-
-    /**
-     * Executes the function {@code f} on the activities main thread and returns the result
-     */
-    public <T> T getFromActivity(Function<A, T> f) {
-        AtomicReference<T> result = new AtomicReference<>();
-        getScenario().onActivity(a -> result.set(f.apply(a)));
-        return result.get();
-    }
-
-    /**
-     * Runs the provided function {@code f} on the activity if the scenario is already created
-     */
-    public synchronized void runOnActivity(Consumer<A> f) {
-        if (mScenario != null) {
-            mScenario.onActivity(f::accept);
-        }
-    }
-
-    /**
-     * Returns a {@link LazyActivityRule} for the Launcher activity
-     */
-    public static <T extends Launcher> LazyActivityRule<T> forLauncher() {
-        Context context = getInstrumentation().getTargetContext();
-        // Create the activity after the model setup is done.
-        Intent homeIntent = new Intent(Intent.ACTION_MAIN)
-                .addCategory(Intent.CATEGORY_HOME)
-                .addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK
-                        | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | FLAG_ACTIVITY_NO_ANIMATION);
-        ResolveInfo ri = context.getPackageManager().resolveActivity(
-                new Intent(homeIntent).setPackage(context.getPackageName()), 0);
-        homeIntent.setComponent(ri.getComponentInfo().getComponentName());
-        return new LazyActivityRule<>(() -> ActivityScenario.launch(homeIntent));
-    }
-}
diff --git a/tests/src/com/android/launcher3/util/rule/WrapperRule.kt b/tests/src/com/android/launcher3/util/rule/WrapperRule.kt
deleted file mode 100644
index 290cc45..0000000
--- a/tests/src/com/android/launcher3/util/rule/WrapperRule.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.android.launcher3.util.rule
-
-import com.android.launcher3.config.FeatureFlags.BooleanFlag
-import com.android.launcher3.config.FeatureFlags.IntFlag
-import com.android.launcher3.util.SafeCloseable
-import com.android.launcher3.util.TestUtil
-import java.util.function.Supplier
-import org.junit.rules.ExternalResource
-
-/** Simple rule which wraps any SafeCloseable object */
-class WrapperRule(private val overrideProvider: Supplier<SafeCloseable>) : ExternalResource() {
-
-    private lateinit var overrideClosable: SafeCloseable
-
-    override fun before() {
-        overrideClosable = overrideProvider.get()
-    }
-
-    override fun after() {
-        overrideClosable.close()
-    }
-
-    companion object {
-
-        fun BooleanFlag.overrideFlag(value: Boolean) = WrapperRule {
-            TestUtil.overrideFlag(this, value)
-        }
-
-        fun IntFlag.overrideFlag(value: Int) = WrapperRule { TestUtil.overrideFlag(this, value) }
-    }
-}
