diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index 456727c069..c724318c2d 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -326,6 +326,8 @@ public abstract class BaseQuickstepLauncher extends Launcher @Override public void onAttachedToWindow() { super.onAttachedToWindow(); - InteractionJankMonitorWrapper.init(getWindow().getDecorView()); + if (Utilities.ATLEAST_R) { + InteractionJankMonitorWrapper.init(getWindow().getDecorView()); + } } } diff --git a/robolectric_tests/Android.mk b/robolectric_tests/Android.mk index 3fa9b0ab63..836ded5d25 100644 --- a/robolectric_tests/Android.mk +++ b/robolectric_tests/Android.mk @@ -59,4 +59,4 @@ LOCAL_INSTRUMENT_SOURCE_DIRS := packages/apps/Launcher3/src LOCAL_ROBOTEST_TIMEOUT := 36000 -include prebuilts/misc/common/robolectric/4.3.1/run_robotests.mk +include prebuilts/misc/common/robolectric/4.4/run_robotests.mk diff --git a/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java b/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java index b7ba10696f..2a94d9bc73 100644 --- a/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java +++ b/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java @@ -25,16 +25,20 @@ import android.os.UserHandle; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; +import com.android.launcher3.util.Executors; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.LooperMode; +import org.robolectric.annotation.LooperMode.Mode; import java.util.ArrayList; @RunWith(RobolectricTestRunner.class) +@LooperMode(Mode.PAUSED) public final class FolderNameProviderTest { private Context mContext; private WorkspaceItemInfo mItem1; @@ -58,18 +62,20 @@ public final class FolderNameProviderTest { } @Test - public void getSuggestedFolderName_workAssignedToEnd() { + public void getSuggestedFolderName_workAssignedToEnd() throws Exception { ArrayList list = new ArrayList<>(); list.add(mItem1); list.add(mItem2); FolderNameInfos nameInfos = new FolderNameInfos(); - new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos); + Executors.MODEL_EXECUTOR.submit(() -> + new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos)).get(); assertEquals("Work", nameInfos.getLabels()[0]); nameInfos.setLabel(0, "candidate1", 1.0f); nameInfos.setLabel(1, "candidate2", 1.0f); nameInfos.setLabel(2, "candidate3", 1.0f); - new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos); + Executors.MODEL_EXECUTOR.submit(() -> + new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos)).get(); assertEquals("Work", nameInfos.getLabels()[3]); assertTrue(nameInfos.hasSuggestions()); assertTrue(nameInfos.hasPrimary()); diff --git a/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java index c892618a9d..01b23ba966 100644 --- a/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java +++ b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java @@ -9,8 +9,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; -import org.robolectric.util.Scheduler; +import org.robolectric.annotation.LooperMode; +import org.robolectric.annotation.LooperMode.Mode; import java.io.File; import java.io.PrintWriter; @@ -21,11 +21,10 @@ import java.util.Calendar; * Tests for {@link FileLog} */ @RunWith(RobolectricTestRunner.class) +@LooperMode(Mode.PAUSED) public class FileLogTest { private File mTempDir; - private boolean mTestActive; - @Before public void setUp() { int count = 0; @@ -35,14 +34,6 @@ public class FileLogTest { } while (!mTempDir.mkdir()); FileLog.setDir(mTempDir); - - mTestActive = true; - Scheduler scheduler = Shadows.shadowOf(FileLog.getHandler().getLooper()).getScheduler(); - new Thread(() -> { - while (mTestActive) { - scheduler.advanceToLastPostedRunnable(); - } - }).start(); } @After @@ -52,8 +43,6 @@ public class FileLogTest { new File(mTempDir, "log-" + i).delete(); } mTempDir.delete(); - - mTestActive = false; } @Test diff --git a/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java b/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java index 87fe3c086b..aab6c25f1c 100644 --- a/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java +++ b/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java @@ -30,6 +30,7 @@ import com.android.launcher3.PagedView; import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfo; +import com.android.launcher3.shadows.ShadowLooperExecutor; import com.android.launcher3.util.Executors; import com.android.launcher3.util.LauncherLayoutBuilder; import com.android.launcher3.util.LauncherModelHelper; @@ -43,8 +44,8 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.LooperMode; import org.robolectric.annotation.LooperMode.Mode; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowPackageManager; -import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.Arrays; @@ -74,7 +75,8 @@ public class ModelMultiCallbacksTest { // Since robolectric tests run on main thread, we run the loader-UI calls on a temp thread, // so that we can wait appropriately for the loader to complete. mTempMainExecutor = new LooperExecutor(createAndStartNewForegroundLooper("tempMain")); - ReflectionHelpers.setField(mModelHelper.getModel(), "mMainExecutor", mTempMainExecutor); + ShadowLooperExecutor sle = Shadow.extract(Executors.MAIN_EXECUTOR); + sle.setHandler(mTempMainExecutor.getHandler()); } @Test diff --git a/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java b/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java index baae2a6a80..e3694aeddc 100644 --- a/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java +++ b/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java @@ -59,8 +59,6 @@ public class SDWorkModeTest { private InvariantDeviceProfile mIdp; private LauncherModelHelper mModelHelper; - private LauncherLayoutBuilder mLayoutBuilder; - @Before public void setup() throws Exception { mModelHelper = new LauncherModelHelper(); @@ -70,7 +68,6 @@ public class SDWorkModeTest { Settings.Global.WINDOW_ANIMATION_SCALE, 0); mModelHelper.installApp(TEST_PACKAGE); - mLayoutBuilder = new LauncherLayoutBuilder(); } @Test @@ -86,7 +83,7 @@ public class SDWorkModeTest { public void testAllAppsList_workProfile() throws Exception { ShadowUserManager sum = Shadow.extract(mTargetContext.getSystemService(UserManager.class)); sum.addUser(SYSTEM_USER, "me", FLAG_SYSTEM); - sum.addUser(WORK_PROFILE_ID, "work", FLAG_PROFILE); + sum.addProfile(SYSTEM_USER, WORK_PROFILE_ID, "work", FLAG_PROFILE); SecondaryDisplayLauncher launcher = loadLauncher(); launcher.showAppDrawer(true); diff --git a/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java b/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java index a3b7dc706f..57eda7eae8 100644 --- a/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java +++ b/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java @@ -23,6 +23,8 @@ import static org.robolectric.util.ReflectionHelpers.setField; import android.os.Handler; +import androidx.annotation.Nullable; + import com.android.launcher3.util.LooperExecutor; import org.robolectric.annotation.Implementation; @@ -37,8 +39,13 @@ public class ShadowLooperExecutor { @RealObject private LooperExecutor mRealExecutor; + private Handler mOverriddenHandler; + @Implementation protected Handler getHandler() { + if (mOverriddenHandler != null) { + return mOverriddenHandler; + } Handler handler = directlyOn(mRealExecutor, LooperExecutor.class, "getHandler"); Thread thread = handler.getLooper().getThread(); if (!thread.isAlive()) { @@ -49,4 +56,8 @@ public class ShadowLooperExecutor { } return directlyOn(mRealExecutor, LooperExecutor.class, "getHandler"); } + + public void setHandler(@Nullable Handler handler) { + mOverriddenHandler = handler; + } } diff --git a/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java b/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java index f2b3071c95..849f98b8ff 100644 --- a/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java +++ b/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java @@ -48,10 +48,12 @@ import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.pm.UserCache; +import com.android.launcher3.shadows.ShadowLooperExecutor; import org.mockito.ArgumentCaptor; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowContentResolver; import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.util.ReflectionHelpers; @@ -403,14 +405,16 @@ public class LauncherModelHelper { public void loadModelSync() throws ExecutionException, InterruptedException { // Since robolectric tests run on main thread, we run the loader-UI calls on a temp thread, // so that we can wait appropriately for the loader to complete. - ReflectionHelpers.setField(getModel(), "mMainExecutor", Executors.UI_HELPER_EXECUTOR); + ShadowLooperExecutor sle = Shadow.extract(Executors.MAIN_EXECUTOR); + sle.setHandler(Executors.UI_HELPER_EXECUTOR.getHandler()); Callbacks mockCb = mock(Callbacks.class); getModel().addCallbacksAndLoad(mockCb); Executors.MODEL_EXECUTOR.submit(() -> { }).get(); Executors.UI_HELPER_EXECUTOR.submit(() -> { }).get(); - ReflectionHelpers.setField(getModel(), "mMainExecutor", Executors.MAIN_EXECUTOR); + + sle.setHandler(null); getModel().removeCallbacks(mockCb); }