OSDN Git Service

Convert test code to kotlin
authorutzcoz <utzcoz@outlook.com>
Sun, 7 Feb 2021 15:48:31 +0000 (23:48 +0800)
committerutzcoz <utzcoz@outlook.com>
Wed, 10 Feb 2021 10:55:54 +0000 (18:55 +0800)
1. Use Android Studio tool to convert test code to kotlin.
2. Fix null checking error, just adding !! and remove some ?.
3. Fix incompatibility of type between Int and Long in assert.

Test: ./gradlew test

Signed-off-by: utzcoz <utzcoz@outlook.com>
89 files changed:
app/build.gradle
app/src/test/java/com/farmerbb/taskbar/Constants.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/Constants.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/LauncherAppsHelper.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/LauncherAppsHelper.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/helper/DashboardHelperTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/helper/DashboardHelperTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/helper/FreeformHackHelperTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/helper/FreeformHackHelperTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/helper/LauncherHelperTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/helper/LauncherHelperTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/helper/MenuHelperTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/helper/MenuHelperTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/mockito/BooleanAnswer.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/mockito/BooleanAnswer.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/mockito/IntAnswer.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/mockito/IntAnswer.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/mockito/StringAnswer.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/mockito/StringAnswer.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/receiver/BootReceiverTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/receiver/BootReceiverTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/receiver/PackageUpgradeReceiverTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/receiver/PackageUpgradeReceiverTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/receiver/QuitReceiverTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/receiver/QuitReceiverTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/receiver/ShowHideTaskbarReceiverTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/receiver/ShowHideTaskbarReceiverTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/service/FavoriteAppTileServiceTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/service/FavoriteAppTileServiceTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/service/NotificationCountServiceTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/service/NotificationCountServiceTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/service/PowerMenuServiceTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/service/PowerMenuServiceTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/service/QuickSettingsTileServiceTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/service/QuickSettingsTileServiceTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/service/UIHostServiceNewControllerTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/service/UIHostServiceNewControllerTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowScrollView.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowScrollView.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/MockUIHost.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/MockUIHost.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/StartMenuControllerTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/StartMenuControllerTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/TaskbarControllerTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/TaskbarControllerTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/TestUIController.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/TestUIController.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/TestUIHostService.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/TestUIHostService.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/UIControllerTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/UIControllerTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/UIHostServiceTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/UIHostServiceTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/ui/ViewParamsTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/ui/ViewParamsTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/AppEntryTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/AppEntryTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/BlacklistTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/BlacklistTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/DesktopIconInfoTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/DesktopIconInfoTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/FABWrapperTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/FABWrapperTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/IconPackManagerTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/IconPackManagerTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/PinnedBlockedAppsTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/PinnedBlockedAppsTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/RunnableHooker.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/RunnableHooker.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizeEntryTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizeEntryTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizesTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizesTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/TaskbarPositionTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/TaskbarPositionTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/ToastFrameworkImplTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/ToastFrameworkImplTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/TopAppsTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/TopAppsTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/util/UTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/util/UTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/widget/DashboardCellTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/widget/DashboardCellTest.kt [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/widget/StartMenuLayoutTest.java [deleted file]
app/src/test/java/com/farmerbb/taskbar/widget/StartMenuLayoutTest.kt [new file with mode: 0644]
build.gradle
dependencies.gradle

index effaab4..ff99783 100644 (file)
@@ -1,5 +1,6 @@
 apply from: '../dependencies.gradle'
 apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
 apply plugin: 'jacoco'
 
 repositories {
@@ -35,6 +36,10 @@ android {
         targetCompatibility JavaVersion.VERSION_1_8
     }
 
+    kotlinOptions {
+        jvmTarget = '1.8'
+    }
+
     signingConfigs {
         release {
             if(System.getenv("KSTOREFILE") != null)
@@ -118,6 +123,7 @@ android {
 }
 
 dependencies {
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTILN_VERSION"
     implementation "androidx.legacy:legacy-support-v4:$SUPPORT_V4_VERSION"
     implementation "androidx.appcompat:appcompat:$APPCOMPAT_VERSION"
     implementation "androidx.browser:browser:$BROWSER_VERSION"
diff --git a/app/src/test/java/com/farmerbb/taskbar/Constants.java b/app/src/test/java/com/farmerbb/taskbar/Constants.java
deleted file mode 100644 (file)
index fd99e1e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.farmerbb.taskbar;
-
-public class Constants {
-    public static final String UNSUPPORTED = "unsupported";
-    public static final String TEST_PACKAGE = "test-package";
-    public static final String TEST_COMPONENT = "test-component";
-    public static final String TEST_LABEL = "test-label";
-    public static final String TEST_NAME = "test-name";
-    public static final String TEST_WINDOW_SIZE = "400x400";
-    public static final int DEFAULT_TEST_USER_ID = 0;
-    public static final int DEFAULT_TEST_USER_PROFILE_ID = 200000;
-    public static final int DEFAULT_TEST_CELL_ID = 1000;
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/Constants.kt b/app/src/test/java/com/farmerbb/taskbar/Constants.kt
new file mode 100644 (file)
index 0000000..eb3e13e
--- /dev/null
@@ -0,0 +1,13 @@
+package com.farmerbb.taskbar
+
+object Constants {
+    const val UNSUPPORTED = "unsupported"
+    const val TEST_PACKAGE = "test-package"
+    const val TEST_COMPONENT = "test-component"
+    const val TEST_LABEL = "test-label"
+    const val TEST_NAME = "test-name"
+    const val TEST_WINDOW_SIZE = "400x400"
+    const val DEFAULT_TEST_USER_ID = 0
+    const val DEFAULT_TEST_USER_PROFILE_ID = 200000
+    const val DEFAULT_TEST_CELL_ID = 1000
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/LauncherAppsHelper.java b/app/src/test/java/com/farmerbb/taskbar/LauncherAppsHelper.java
deleted file mode 100644 (file)
index b100a02..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.farmerbb.taskbar;
-
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.pm.LauncherActivityInfo;
-import android.os.UserHandle;
-
-import org.robolectric.util.ReflectionHelpers;
-
-import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
-
-public class LauncherAppsHelper {
-    public static LauncherActivityInfo generateTestLauncherActivityInfo(Context context,
-                                                                        ActivityInfo activityInfo,
-                                                                        int userHandleId) {
-        return
-                ReflectionHelpers.callConstructor(
-                        LauncherActivityInfo.class,
-                        from(Context.class, context),
-                        from(ActivityInfo.class, activityInfo),
-                        from(UserHandle.class, UserHandle.getUserHandleForUid(userHandleId))
-                );
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/LauncherAppsHelper.kt b/app/src/test/java/com/farmerbb/taskbar/LauncherAppsHelper.kt
new file mode 100644 (file)
index 0000000..39d532d
--- /dev/null
@@ -0,0 +1,22 @@
+package com.farmerbb.taskbar
+
+import android.content.Context
+import android.content.pm.ActivityInfo
+import android.content.pm.LauncherActivityInfo
+import android.os.UserHandle
+import org.robolectric.util.ReflectionHelpers
+import org.robolectric.util.ReflectionHelpers.ClassParameter
+
+object LauncherAppsHelper {
+    @JvmStatic
+    fun generateTestLauncherActivityInfo(context: Context,
+                                         activityInfo: ActivityInfo,
+                                         userHandleId: Int): LauncherActivityInfo {
+        return ReflectionHelpers.callConstructor(
+                LauncherActivityInfo::class.java,
+                ClassParameter.from(Context::class.java, context),
+                ClassParameter.from(ActivityInfo::class.java, activityInfo),
+                ClassParameter.from(UserHandle::class.java, UserHandle.getUserHandleForUid(userHandleId))
+        )
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/DashboardHelperTest.java b/app/src/test/java/com/farmerbb/taskbar/helper/DashboardHelperTest.java
deleted file mode 100644 (file)
index c751586..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.farmerbb.taskbar.helper;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class DashboardHelperTest {
-    private DashboardHelper helper = DashboardHelper.getInstance();
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(helper);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(helper, DashboardHelper.getInstance());
-        }
-    }
-
-    @Test
-    public void testSetDashboardOpen() {
-        assertFalse(helper.isDashboardOpen());
-        helper.setDashboardOpen(true);
-        assertTrue(helper.isDashboardOpen());
-        helper.setDashboardOpen(false);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/DashboardHelperTest.kt b/app/src/test/java/com/farmerbb/taskbar/helper/DashboardHelperTest.kt
new file mode 100644 (file)
index 0000000..462c65e
--- /dev/null
@@ -0,0 +1,27 @@
+package com.farmerbb.taskbar.helper
+
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class DashboardHelperTest {
+    private val helper = DashboardHelper.getInstance()
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(helper)
+        for (i in 1..20) {
+            Assert.assertEquals(helper, DashboardHelper.getInstance())
+        }
+    }
+
+    @Test
+    fun testSetDashboardOpen() {
+        Assert.assertFalse(helper.isDashboardOpen)
+        helper.isDashboardOpen = true
+        Assert.assertTrue(helper.isDashboardOpen)
+        helper.isDashboardOpen = false
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/FreeformHackHelperTest.java b/app/src/test/java/com/farmerbb/taskbar/helper/FreeformHackHelperTest.java
deleted file mode 100644 (file)
index a0d71c4..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.farmerbb.taskbar.helper;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class FreeformHackHelperTest {
-    private FreeformHackHelper freeformHackHelper = FreeformHackHelper.getInstance();
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(freeformHackHelper);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(freeformHackHelper, FreeformHackHelper.getInstance());
-        }
-    }
-
-    @Test
-    public void testSetFreeformHackActive() {
-        assertFalse(freeformHackHelper.isFreeformHackActive());
-        freeformHackHelper.setFreeformHackActive(true);
-        assertTrue(freeformHackHelper.isFreeformHackActive());
-        freeformHackHelper.setFreeformHackActive(false);
-    }
-
-    @Test
-    public void testSetInFreeformWorkspace() {
-        assertFalse(freeformHackHelper.isInFreeformWorkspace());
-        freeformHackHelper.setInFreeformWorkspace(true);
-        assertTrue(freeformHackHelper.isInFreeformWorkspace());
-        freeformHackHelper.setInFreeformWorkspace(false);
-    }
-
-    @Test
-    public void testSetTouchAbsorberActive() {
-        assertFalse(freeformHackHelper.isTouchAbsorberActive());
-        freeformHackHelper.setTouchAbsorberActive(true);
-        assertTrue(freeformHackHelper.isTouchAbsorberActive());
-        freeformHackHelper.setTouchAbsorberActive(false);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/FreeformHackHelperTest.kt b/app/src/test/java/com/farmerbb/taskbar/helper/FreeformHackHelperTest.kt
new file mode 100644 (file)
index 0000000..9c3bc6b
--- /dev/null
@@ -0,0 +1,43 @@
+package com.farmerbb.taskbar.helper
+
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class FreeformHackHelperTest {
+    private val freeformHackHelper = FreeformHackHelper.getInstance()
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(freeformHackHelper)
+        for (i in 1..20) {
+            Assert.assertEquals(freeformHackHelper, FreeformHackHelper.getInstance())
+        }
+    }
+
+    @Test
+    fun testSetFreeformHackActive() {
+        Assert.assertFalse(freeformHackHelper.isFreeformHackActive)
+        freeformHackHelper.isFreeformHackActive = true
+        Assert.assertTrue(freeformHackHelper.isFreeformHackActive)
+        freeformHackHelper.isFreeformHackActive = false
+    }
+
+    @Test
+    fun testSetInFreeformWorkspace() {
+        Assert.assertFalse(freeformHackHelper.isInFreeformWorkspace)
+        freeformHackHelper.isInFreeformWorkspace = true
+        Assert.assertTrue(freeformHackHelper.isInFreeformWorkspace)
+        freeformHackHelper.isInFreeformWorkspace = false
+    }
+
+    @Test
+    fun testSetTouchAbsorberActive() {
+        Assert.assertFalse(freeformHackHelper.isTouchAbsorberActive)
+        freeformHackHelper.isTouchAbsorberActive = true
+        Assert.assertTrue(freeformHackHelper.isTouchAbsorberActive)
+        freeformHackHelper.isTouchAbsorberActive = false
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/LauncherHelperTest.java b/app/src/test/java/com/farmerbb/taskbar/helper/LauncherHelperTest.java
deleted file mode 100644 (file)
index d623cfd..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.farmerbb.taskbar.helper;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.mockito.IntAnswer;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.powermock.api.mockito.PowerMockito.when;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(U.class)
-public class LauncherHelperTest {
-
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private LauncherHelper launcherHelper;
-    private Context context;
-    private IntAnswer getExternalDisplayIdAnswer;
-
-    @Before
-    public void setUp() {
-        launcherHelper = LauncherHelper.getInstance();
-        context = ApplicationProvider.getApplicationContext();
-        assertNotNull(context);
-
-        PowerMockito.spy(U.class);
-        getExternalDisplayIdAnswer = new IntAnswer();
-        when(U.getExternalDisplayID(context)).thenAnswer(getExternalDisplayIdAnswer);
-    }
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(launcherHelper);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(launcherHelper, LauncherHelper.getInstance());
-        }
-    }
-
-    @Test
-    public void testIsHomeScreen() {
-        assertFalse(launcherHelper.isOnHomeScreen(context));
-        launcherHelper.setOnPrimaryHomeScreen(true);
-        assertTrue(launcherHelper.isOnHomeScreen(context));
-        launcherHelper.setOnPrimaryHomeScreen(false);
-        launcherHelper.setOnSecondaryHomeScreen(true, 1);
-        assertFalse(launcherHelper.isOnHomeScreen(context));
-        getExternalDisplayIdAnswer.answer = 1;
-        assertTrue(launcherHelper.isOnHomeScreen(context));
-        launcherHelper.setOnSecondaryHomeScreen(false, 1);
-        assertEquals(-1, launcherHelper.getSecondaryDisplayId());
-    }
-
-    @Test
-    public void testIsOnSecondaryHomeScreen() {
-        assertFalse(launcherHelper.isOnSecondaryHomeScreen(context));
-        launcherHelper.setOnPrimaryHomeScreen(true);
-        assertFalse(launcherHelper.isOnSecondaryHomeScreen(context));
-        launcherHelper.setOnSecondaryHomeScreen(true, 1);
-        assertFalse(launcherHelper.isOnSecondaryHomeScreen(context));
-        getExternalDisplayIdAnswer.answer = 1;
-        assertTrue(launcherHelper.isOnSecondaryHomeScreen(context));
-        launcherHelper.setOnPrimaryHomeScreen(false);
-        assertTrue(launcherHelper.isOnSecondaryHomeScreen(context));
-        launcherHelper.setOnSecondaryHomeScreen(false, 1);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/LauncherHelperTest.kt b/app/src/test/java/com/farmerbb/taskbar/helper/LauncherHelperTest.kt
new file mode 100644 (file)
index 0000000..5a904c3
--- /dev/null
@@ -0,0 +1,73 @@
+package com.farmerbb.taskbar.helper
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.mockito.IntAnswer
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(U::class)
+class LauncherHelperTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var launcherHelper: LauncherHelper? = null
+    private var context: Context? = null
+    private var getExternalDisplayIdAnswer: IntAnswer? = null
+
+    @Before
+    fun setUp() {
+        launcherHelper = LauncherHelper.getInstance()
+        context = ApplicationProvider.getApplicationContext()
+        Assert.assertNotNull(context)
+        PowerMockito.spy(U::class.java)
+        getExternalDisplayIdAnswer = IntAnswer()
+        PowerMockito.`when`(U.getExternalDisplayID(context)).thenAnswer(getExternalDisplayIdAnswer)
+    }
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(launcherHelper)
+        for (i in 1..20) {
+            Assert.assertEquals(launcherHelper, LauncherHelper.getInstance())
+        }
+    }
+
+    @Test
+    fun testIsHomeScreen() {
+        Assert.assertFalse(launcherHelper!!.isOnHomeScreen(context))
+        launcherHelper!!.setOnPrimaryHomeScreen(true)
+        Assert.assertTrue(launcherHelper!!.isOnHomeScreen(context))
+        launcherHelper!!.setOnPrimaryHomeScreen(false)
+        launcherHelper!!.setOnSecondaryHomeScreen(true, 1)
+        Assert.assertFalse(launcherHelper!!.isOnHomeScreen(context))
+        getExternalDisplayIdAnswer!!.answer = 1
+        Assert.assertTrue(launcherHelper!!.isOnHomeScreen(context))
+        launcherHelper!!.setOnSecondaryHomeScreen(false, 1)
+        Assert.assertEquals(-1, launcherHelper!!.secondaryDisplayId.toLong())
+    }
+
+    @Test
+    fun testIsOnSecondaryHomeScreen() {
+        Assert.assertFalse(launcherHelper!!.isOnSecondaryHomeScreen(context))
+        launcherHelper!!.setOnPrimaryHomeScreen(true)
+        Assert.assertFalse(launcherHelper!!.isOnSecondaryHomeScreen(context))
+        launcherHelper!!.setOnSecondaryHomeScreen(true, 1)
+        Assert.assertFalse(launcherHelper!!.isOnSecondaryHomeScreen(context))
+        getExternalDisplayIdAnswer!!.answer = 1
+        Assert.assertTrue(launcherHelper!!.isOnSecondaryHomeScreen(context))
+        launcherHelper!!.setOnPrimaryHomeScreen(false)
+        Assert.assertTrue(launcherHelper!!.isOnSecondaryHomeScreen(context))
+        launcherHelper!!.setOnSecondaryHomeScreen(false, 1)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/MenuHelperTest.java b/app/src/test/java/com/farmerbb/taskbar/helper/MenuHelperTest.java
deleted file mode 100644 (file)
index f980693..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.farmerbb.taskbar.helper;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class MenuHelperTest {
-    private MenuHelper menuHelper = MenuHelper.getInstance();
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(menuHelper);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(menuHelper, MenuHelper.getInstance());
-        }
-    }
-
-    @Test
-    public void testSetStartMenuOpen() {
-        assertFalse(menuHelper.isStartMenuOpen());
-        menuHelper.setStartMenuOpen(true);
-        assertTrue(menuHelper.isStartMenuOpen());
-        menuHelper.setStartMenuOpen(false);
-    }
-
-    @Test
-    public void testSetContextMenuOpen() {
-        assertFalse(menuHelper.isContextMenuOpen());
-        menuHelper.setContextMenuOpen(true);
-        assertTrue(menuHelper.isContextMenuOpen());
-        menuHelper.setContextMenuOpen(false);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/helper/MenuHelperTest.kt b/app/src/test/java/com/farmerbb/taskbar/helper/MenuHelperTest.kt
new file mode 100644 (file)
index 0000000..ccdf819
--- /dev/null
@@ -0,0 +1,35 @@
+package com.farmerbb.taskbar.helper
+
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class MenuHelperTest {
+    private val menuHelper = MenuHelper.getInstance()
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(menuHelper)
+        for (i in 1..20) {
+            Assert.assertEquals(menuHelper, MenuHelper.getInstance())
+        }
+    }
+
+    @Test
+    fun testSetStartMenuOpen() {
+        Assert.assertFalse(menuHelper.isStartMenuOpen)
+        menuHelper.isStartMenuOpen = true
+        Assert.assertTrue(menuHelper.isStartMenuOpen)
+        menuHelper.isStartMenuOpen = false
+    }
+
+    @Test
+    fun testSetContextMenuOpen() {
+        Assert.assertFalse(menuHelper.isContextMenuOpen)
+        menuHelper.isContextMenuOpen = true
+        Assert.assertTrue(menuHelper.isContextMenuOpen)
+        menuHelper.isContextMenuOpen = false
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/mockito/BooleanAnswer.java b/app/src/test/java/com/farmerbb/taskbar/mockito/BooleanAnswer.java
deleted file mode 100644 (file)
index 4331c97..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.farmerbb.taskbar.mockito;
-
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class BooleanAnswer implements Answer<Boolean> {
-    public boolean answer = false;
-
-    @Override
-    public Boolean answer(InvocationOnMock invocation) {
-        return answer;
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/mockito/BooleanAnswer.kt b/app/src/test/java/com/farmerbb/taskbar/mockito/BooleanAnswer.kt
new file mode 100644 (file)
index 0000000..a067738
--- /dev/null
@@ -0,0 +1,11 @@
+package com.farmerbb.taskbar.mockito
+
+import org.mockito.invocation.InvocationOnMock
+import org.mockito.stubbing.Answer
+
+class BooleanAnswer : Answer<Boolean> {
+    var answer = false
+    override fun answer(invocation: InvocationOnMock): Boolean {
+        return answer
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/mockito/IntAnswer.java b/app/src/test/java/com/farmerbb/taskbar/mockito/IntAnswer.java
deleted file mode 100644 (file)
index b8b07d9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.farmerbb.taskbar.mockito;
-
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class IntAnswer implements Answer<Integer> {
-    public int answer = 0;
-
-    @Override
-    public Integer answer(InvocationOnMock invocation) {
-        return answer;
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/mockito/IntAnswer.kt b/app/src/test/java/com/farmerbb/taskbar/mockito/IntAnswer.kt
new file mode 100644 (file)
index 0000000..680fb63
--- /dev/null
@@ -0,0 +1,11 @@
+package com.farmerbb.taskbar.mockito
+
+import org.mockito.invocation.InvocationOnMock
+import org.mockito.stubbing.Answer
+
+class IntAnswer : Answer<Int> {
+    var answer = 0
+    override fun answer(invocation: InvocationOnMock): Int {
+        return answer
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/mockito/StringAnswer.java b/app/src/test/java/com/farmerbb/taskbar/mockito/StringAnswer.java
deleted file mode 100644 (file)
index 6a98c97..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.farmerbb.taskbar.mockito;
-
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class StringAnswer implements Answer<String> {
-    public String answer = null;
-
-    @Override
-    public String answer(InvocationOnMock invocation) throws Throwable {
-        return answer;
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/mockito/StringAnswer.kt b/app/src/test/java/com/farmerbb/taskbar/mockito/StringAnswer.kt
new file mode 100644 (file)
index 0000000..c95c2f5
--- /dev/null
@@ -0,0 +1,13 @@
+package com.farmerbb.taskbar.mockito
+
+import org.mockito.invocation.InvocationOnMock
+import org.mockito.stubbing.Answer
+
+class StringAnswer : Answer<String?> {
+    var answer: String? = null
+
+    @Throws(Throwable::class)
+    override fun answer(invocation: InvocationOnMock): String? {
+        return answer
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/BootReceiverTest.java b/app/src/test/java/com/farmerbb/taskbar/receiver/BootReceiverTest.java
deleted file mode 100644 (file)
index 607c88d..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.farmerbb.taskbar.receiver;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.service.NotificationService;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-
-import static com.farmerbb.taskbar.util.Constants.PREF_BLISS_OS_PREFS;
-import static com.farmerbb.taskbar.util.Constants.PREF_FREEFORM_HACK;
-import static com.farmerbb.taskbar.util.Constants.PREF_FREEFORM_HACK_OVERRIDE;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_ON_BOOT;
-import static com.farmerbb.taskbar.util.Constants.PREF_TASKBAR_ACTIVE;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.powermock.api.mockito.PowerMockito.when;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(U.class)
-public class BootReceiverTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private BootReceiver bootReceiver;
-    private Context context;
-    private Intent intent;
-    private SharedPreferences prefs;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        bootReceiver = new BootReceiver();
-        intent = new Intent(Intent.ACTION_BOOT_COMPLETED);
-        prefs = U.getSharedPreferences(context);
-    }
-
-    @After
-    public void tearDown() {
-        prefs.edit().remove(PREF_FREEFORM_HACK).apply();
-    }
-
-    @Test
-    public void testPrefsInit() {
-        PowerMockito.mockStatic(U.class);
-        when(U.getSharedPreferences(context)).thenReturn(prefs);
-        when(U.canEnableFreeform()).thenReturn(false);
-
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        prefs.edit().putBoolean(PREF_BLISS_OS_PREFS, false).apply();
-        when(U.isAndroidGeneric(context)).thenReturn(true);
-        bootReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, true));
-
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        prefs.edit().putBoolean(PREF_BLISS_OS_PREFS, true).apply();
-        when(U.isAndroidGeneric(context)).thenReturn(true);
-        bootReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, false));
-
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        prefs.edit().putBoolean(PREF_BLISS_OS_PREFS, false).apply();
-        when(U.isAndroidGeneric(context)).thenReturn(false);
-        bootReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, false));
-
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        prefs.edit().putBoolean(PREF_BLISS_OS_PREFS, true).apply();
-        when(U.isAndroidGeneric(context)).thenReturn(false);
-        bootReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, false));
-    }
-
-    @Test
-    public void testPrefFreeformHackInit() {
-        PowerMockito.mockStatic(U.class);
-        when(U.getSharedPreferences(context)).thenReturn(prefs);
-        BooleanAnswer answer = new BooleanAnswer();
-        when(U.hasFreeformSupport(context)).thenAnswer(answer);
-
-        answer.answer = false;
-        bootReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, true));
-
-        answer.answer = true;
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        bootReceiver.onReceive(context, intent);
-        assertTrue(prefs.getBoolean(PREF_FREEFORM_HACK, false));
-    }
-
-    @Test
-    public void testStartOnBootInit() {
-        prefs.edit().putBoolean(PREF_START_ON_BOOT, true).apply();
-        bootReceiver.onReceive(context, intent);
-        assertTrue(prefs.getBoolean(PREF_TASKBAR_ACTIVE, false));
-
-        prefs.edit().putBoolean(PREF_START_ON_BOOT, false).apply();
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        PowerMockito.mockStatic(U.class);
-        when(U.getSharedPreferences(context)).thenReturn(prefs);
-        when(U.isServiceRunning(context, NotificationService.class)).thenReturn(false);
-        bootReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_TASKBAR_ACTIVE, false));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/BootReceiverTest.kt b/app/src/test/java/com/farmerbb/taskbar/receiver/BootReceiverTest.kt
new file mode 100644 (file)
index 0000000..ccfc56b
--- /dev/null
@@ -0,0 +1,98 @@
+package com.farmerbb.taskbar.receiver
+
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.service.NotificationService
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.*
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(U::class)
+class BootReceiverTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var bootReceiver: BootReceiver? = null
+    private var context: Context? = null
+    private var intent: Intent? = null
+    private var prefs: SharedPreferences? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        bootReceiver = BootReceiver()
+        intent = Intent(Intent.ACTION_BOOT_COMPLETED)
+        prefs = U.getSharedPreferences(context)
+    }
+
+    @After
+    fun tearDown() {
+        prefs!!.edit().remove(Constants.PREF_FREEFORM_HACK).apply()
+    }
+
+    @Test
+    fun testPrefsInit() {
+        PowerMockito.mockStatic(U::class.java)
+        PowerMockito.`when`(U.getSharedPreferences(context)).thenReturn(prefs)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(false)
+        prefs!!.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_BLISS_OS_PREFS, false).apply()
+        PowerMockito.`when`(U.isAndroidGeneric(context)).thenReturn(true)
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_FREEFORM_HACK, true))
+        prefs!!.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_BLISS_OS_PREFS, true).apply()
+        PowerMockito.`when`(U.isAndroidGeneric(context)).thenReturn(true)
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_FREEFORM_HACK, false))
+        prefs!!.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_BLISS_OS_PREFS, false).apply()
+        PowerMockito.`when`(U.isAndroidGeneric(context)).thenReturn(false)
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_FREEFORM_HACK, false))
+        prefs!!.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_BLISS_OS_PREFS, true).apply()
+        PowerMockito.`when`(U.isAndroidGeneric(context)).thenReturn(false)
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_FREEFORM_HACK, false))
+    }
+
+    @Test
+    fun testPrefFreeformHackInit() {
+        PowerMockito.mockStatic(U::class.java)
+        PowerMockito.`when`(U.getSharedPreferences(context)).thenReturn(prefs)
+        val answer = BooleanAnswer()
+        PowerMockito.`when`(U.hasFreeformSupport(context)).thenAnswer(answer)
+        answer.answer = false
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_FREEFORM_HACK, true))
+        answer.answer = true
+        prefs!!.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertTrue(prefs!!.getBoolean(Constants.PREF_FREEFORM_HACK, false))
+    }
+
+    @Test
+    fun testStartOnBootInit() {
+        prefs!!.edit().putBoolean(Constants.PREF_START_ON_BOOT, true).apply()
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertTrue(prefs!!.getBoolean(Constants.PREF_TASKBAR_ACTIVE, false))
+        prefs!!.edit().putBoolean(Constants.PREF_START_ON_BOOT, false).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        PowerMockito.mockStatic(U::class.java)
+        PowerMockito.`when`(U.getSharedPreferences(context)).thenReturn(prefs)
+        PowerMockito.`when`(U.isServiceRunning(context, NotificationService::class.java)).thenReturn(false)
+        bootReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_TASKBAR_ACTIVE, false))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/PackageUpgradeReceiverTest.java b/app/src/test/java/com/farmerbb/taskbar/receiver/PackageUpgradeReceiverTest.java
deleted file mode 100644 (file)
index dcad5f1..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-package com.farmerbb.taskbar.receiver;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Build;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.activity.DummyActivity;
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.service.NotificationService;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowSettings;
-
-import static com.farmerbb.taskbar.util.Constants.EXTRA_START_FREEFORM_HACK;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_START_SERVICES;
-import static com.farmerbb.taskbar.util.Constants.PREF_IS_HIDDEN;
-import static com.farmerbb.taskbar.util.Constants.PREF_TASKBAR_ACTIVE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.powermock.api.mockito.PowerMockito.when;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(U.class)
-public class PackageUpgradeReceiverTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private PackageUpgradeReceiver packageUpgradeReceiver;
-    private Context context;
-    private Intent intent;
-    private SharedPreferences prefs;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        packageUpgradeReceiver = new PackageUpgradeReceiver();
-        intent = new Intent(Intent.ACTION_MY_PACKAGE_REPLACED);
-        prefs = U.getSharedPreferences(context);
-    }
-
-    @Test
-    public void testStartDummyActivity() {
-        PowerMockito.mockStatic(U.class);
-        when(U.getSharedPreferences(context)).thenReturn(prefs);
-        BooleanAnswer answer = new BooleanAnswer();
-        when(U.hasFreeformSupport(context)).thenAnswer(answer);
-        when(U.isFreeformModeEnabled(context)).thenAnswer(answer);
-
-        Application application = (Application) context;
-        shadowOf(application).clearNextStartedActivities();
-
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, false).apply();
-        answer.answer = true;
-        packageUpgradeReceiver.onReceive(context, intent);
-        Intent startedIntent = shadowOf(application).peekNextStartedActivity();
-        assertNotNull(startedIntent);
-        assertTrue(startedIntent.getBooleanExtra(EXTRA_START_FREEFORM_HACK, false));
-        assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, startedIntent.getFlags());
-        assertNotNull(startedIntent.getComponent());
-        assertEquals(DummyActivity.class.getCanonicalName(), startedIntent.getComponent().getClassName());
-
-        shadowOf(application).clearNextStartedActivities();
-        answer.answer = false;
-        packageUpgradeReceiver.onReceive(context, this.intent);
-        assertNull(shadowOf(application).peekNextStartedActivity());
-
-        shadowOf(application).clearNextStartedActivities();
-        answer.answer = true;
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, true).apply();
-        packageUpgradeReceiver.onReceive(context, this.intent);
-        assertNull(shadowOf(application).peekNextStartedActivity());
-
-        shadowOf(application).clearNextStartedActivities();
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, false).apply();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, false).apply();
-        packageUpgradeReceiver.onReceive(context, this.intent);
-        assertNull(shadowOf(application).peekNextStartedActivity());
-    }
-
-    @Test
-    public void testStartNotificationService() {
-        Application application = (Application) context;
-
-        shadowOf(application).clearStartedServices();
-        ShadowSettings.setCanDrawOverlays(true);
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, false).apply();
-        packageUpgradeReceiver.onReceive(context, intent);
-        Intent startedIntent = shadowOf(application).peekNextStartedService();
-        assertNotNull(startedIntent);
-        assertTrue(startedIntent.getBooleanExtra(EXTRA_START_SERVICES, false));
-        assertNotNull(startedIntent.getComponent());
-        assertEquals(
-                NotificationService.class.getCanonicalName(),
-                startedIntent.getComponent().getClassName()
-        );
-
-        shadowOf(application).clearStartedServices();
-        ShadowSettings.setCanDrawOverlays(false);
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, false).apply();
-        packageUpgradeReceiver.onReceive(context, intent);
-        startedIntent = shadowOf(application).peekNextStartedService();
-        assertNull(startedIntent);
-
-        shadowOf(application).clearStartedServices();
-        ShadowSettings.setCanDrawOverlays(true);
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, true).apply();
-        packageUpgradeReceiver.onReceive(context, intent);
-        startedIntent = shadowOf(application).peekNextStartedService();
-        assertNotNull(startedIntent);
-        assertFalse(startedIntent.getBooleanExtra(EXTRA_START_SERVICES, true));
-        assertNotNull(startedIntent.getComponent());
-        assertEquals(
-                NotificationService.class.getCanonicalName(),
-                startedIntent.getComponent().getClassName()
-        );
-
-        shadowOf(application).clearStartedServices();
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, false).apply();
-        packageUpgradeReceiver.onReceive(context, intent);
-        assertNull(shadowOf(application).peekNextStartedService());
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/PackageUpgradeReceiverTest.kt b/app/src/test/java/com/farmerbb/taskbar/receiver/PackageUpgradeReceiverTest.kt
new file mode 100644 (file)
index 0000000..de6855e
--- /dev/null
@@ -0,0 +1,121 @@
+package com.farmerbb.taskbar.receiver
+
+import android.app.Application
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.activity.DummyActivity
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.service.NotificationService
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.shadows.ShadowSettings
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(U::class)
+class PackageUpgradeReceiverTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var packageUpgradeReceiver: PackageUpgradeReceiver? = null
+    private var context: Context? = null
+    private var intent: Intent? = null
+    private var prefs: SharedPreferences? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        packageUpgradeReceiver = PackageUpgradeReceiver()
+        intent = Intent(Intent.ACTION_MY_PACKAGE_REPLACED)
+        prefs = U.getSharedPreferences(context)
+    }
+
+    @Test
+    fun testStartDummyActivity() {
+        PowerMockito.mockStatic(U::class.java)
+        PowerMockito.`when`(U.getSharedPreferences(context)).thenReturn(prefs)
+        val answer = BooleanAnswer()
+        PowerMockito.`when`(U.hasFreeformSupport(context)).thenAnswer(answer)
+        PowerMockito.`when`(U.isFreeformModeEnabled(context)).thenAnswer(answer)
+        val application = context as Application?
+        Shadows.shadowOf(application).clearNextStartedActivities()
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, false).apply()
+        answer.answer = true
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        val startedIntent = Shadows.shadowOf(application).peekNextStartedActivity()
+        Assert.assertNotNull(startedIntent)
+        Assert.assertTrue(startedIntent.getBooleanExtra(Constants.EXTRA_START_FREEFORM_HACK, false))
+        Assert.assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK.toLong(), startedIntent.flags.toLong())
+        Assert.assertNotNull(startedIntent.component)
+        Assert.assertEquals(DummyActivity::class.java.canonicalName, startedIntent.component!!.className)
+        Shadows.shadowOf(application).clearNextStartedActivities()
+        answer.answer = false
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedActivity())
+        Shadows.shadowOf(application).clearNextStartedActivities()
+        answer.answer = true
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, true).apply()
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedActivity())
+        Shadows.shadowOf(application).clearNextStartedActivities()
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, false).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, false).apply()
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedActivity())
+    }
+
+    @Test
+    fun testStartNotificationService() {
+        val application = context as Application?
+        Shadows.shadowOf(application).clearStartedServices()
+        ShadowSettings.setCanDrawOverlays(true)
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, false).apply()
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        var startedIntent = Shadows.shadowOf(application).peekNextStartedService()
+        Assert.assertNotNull(startedIntent)
+        Assert.assertTrue(startedIntent.getBooleanExtra(Constants.EXTRA_START_SERVICES, false))
+        Assert.assertNotNull(startedIntent.component)
+        Assert.assertEquals(
+                NotificationService::class.java.canonicalName,
+                startedIntent.component!!.className
+        )
+        Shadows.shadowOf(application).clearStartedServices()
+        ShadowSettings.setCanDrawOverlays(false)
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, false).apply()
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        startedIntent = Shadows.shadowOf(application).peekNextStartedService()
+        Assert.assertNull(startedIntent)
+        Shadows.shadowOf(application).clearStartedServices()
+        ShadowSettings.setCanDrawOverlays(true)
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, true).apply()
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        startedIntent = Shadows.shadowOf(application).peekNextStartedService()
+        Assert.assertNotNull(startedIntent)
+        Assert.assertFalse(startedIntent.getBooleanExtra(Constants.EXTRA_START_SERVICES, true))
+        Assert.assertNotNull(startedIntent.component)
+        Assert.assertEquals(
+                NotificationService::class.java.canonicalName,
+                startedIntent.component!!.className
+        )
+        Shadows.shadowOf(application).clearStartedServices()
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, false).apply()
+        packageUpgradeReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedService())
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/QuitReceiverTest.java b/app/src/test/java/com/farmerbb/taskbar/receiver/QuitReceiverTest.java
deleted file mode 100644 (file)
index 1a2aeb5..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.farmerbb.taskbar.receiver;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static com.farmerbb.taskbar.Constants.UNSUPPORTED;
-import static com.farmerbb.taskbar.util.Constants.ACTION_QUIT;
-import static com.farmerbb.taskbar.util.Constants.PREF_SKIP_QUIT_RECEIVER;
-import static com.farmerbb.taskbar.util.Constants.PREF_TASKBAR_ACTIVE;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class QuitReceiverTest {
-    private QuitReceiver quitReceiver;
-    private Context context;
-    private SharedPreferences prefs;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        quitReceiver = new QuitReceiver();
-        prefs = U.getSharedPreferences(context);
-    }
-
-    @Test
-    public void testSkipQuitReceiver() {
-        prefs.edit().putBoolean(PREF_SKIP_QUIT_RECEIVER, true).apply();
-
-        quitReceiver.onReceive(context, null);
-        assertTrue(prefs.getBoolean(PREF_SKIP_QUIT_RECEIVER, true));
-
-        Intent intent = new Intent();
-        quitReceiver.onReceive(context, intent);
-        assertTrue(prefs.getBoolean(PREF_SKIP_QUIT_RECEIVER, true));
-
-        intent.setAction(ACTION_QUIT + UNSUPPORTED);
-        quitReceiver.onReceive(context, intent);
-        assertTrue(prefs.getBoolean(PREF_SKIP_QUIT_RECEIVER, true));
-
-        intent.setAction(ACTION_QUIT);
-        quitReceiver.onReceive(context, intent);
-        assertFalse(prefs.contains(PREF_SKIP_QUIT_RECEIVER));
-    }
-
-    @Test
-    public void testNonSkipQuitReceiver() {
-        prefs.edit().putBoolean(PREF_SKIP_QUIT_RECEIVER, false).apply();
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        Intent intent = new Intent(ACTION_QUIT);
-        quitReceiver.onReceive(context, intent);
-        assertFalse(prefs.getBoolean(PREF_TASKBAR_ACTIVE, true));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/QuitReceiverTest.kt b/app/src/test/java/com/farmerbb/taskbar/receiver/QuitReceiverTest.kt
new file mode 100644 (file)
index 0000000..1941091
--- /dev/null
@@ -0,0 +1,53 @@
+package com.farmerbb.taskbar.receiver
+
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.Constants.UNSUPPORTED
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class QuitReceiverTest {
+    private var quitReceiver: QuitReceiver? = null
+    private var context: Context? = null
+    private var prefs: SharedPreferences? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        quitReceiver = QuitReceiver()
+        prefs = U.getSharedPreferences(context)
+    }
+
+    @Test
+    fun testSkipQuitReceiver() {
+        prefs!!.edit().putBoolean(Constants.PREF_SKIP_QUIT_RECEIVER, true).apply()
+        quitReceiver!!.onReceive(context, null)
+        Assert.assertTrue(prefs!!.getBoolean(Constants.PREF_SKIP_QUIT_RECEIVER, true))
+        val intent = Intent()
+        quitReceiver!!.onReceive(context, intent)
+        Assert.assertTrue(prefs!!.getBoolean(Constants.PREF_SKIP_QUIT_RECEIVER, true))
+        intent.action = Constants.ACTION_QUIT + UNSUPPORTED
+        quitReceiver!!.onReceive(context, intent)
+        Assert.assertTrue(prefs!!.getBoolean(Constants.PREF_SKIP_QUIT_RECEIVER, true))
+        intent.action = Constants.ACTION_QUIT
+        quitReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.contains(Constants.PREF_SKIP_QUIT_RECEIVER))
+    }
+
+    @Test
+    fun testNonSkipQuitReceiver() {
+        prefs!!.edit().putBoolean(Constants.PREF_SKIP_QUIT_RECEIVER, false).apply()
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        val intent = Intent(Constants.ACTION_QUIT)
+        quitReceiver!!.onReceive(context, intent)
+        Assert.assertFalse(prefs!!.getBoolean(Constants.PREF_TASKBAR_ACTIVE, true))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/ShowHideTaskbarReceiverTest.java b/app/src/test/java/com/farmerbb/taskbar/receiver/ShowHideTaskbarReceiverTest.java
deleted file mode 100644 (file)
index 2c02a06..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.farmerbb.taskbar.receiver;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.service.NotificationService;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.shadows.ShadowSettings;
-
-import static com.farmerbb.taskbar.Constants.UNSUPPORTED;
-import static com.farmerbb.taskbar.util.Constants.ACTION_SHOW_HIDE_TASKBAR;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_START_SERVICES;
-import static com.farmerbb.taskbar.util.Constants.PREF_IS_HIDDEN;
-import static com.farmerbb.taskbar.util.Constants.PREF_TASKBAR_ACTIVE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-public class ShowHideTaskbarReceiverTest {
-    private ShowHideTaskbarReceiver showHideTaskbarReceiver;
-    private Application application;
-    private Context context;
-    private SharedPreferences prefs;
-    private Intent notificationIntent;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        application = (Application) context;
-        notificationIntent = new Intent(context, NotificationService.class);
-        prefs = U.getSharedPreferences(context);
-        showHideTaskbarReceiver = new ShowHideTaskbarReceiver();
-    }
-
-    @Test
-    public void testSkipShowHideTaskbar() {
-        ShadowSettings.setCanDrawOverlays(true);
-
-        shadowOf(application).clearStartedServices();
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, false).apply();
-
-        showHideTaskbarReceiver.onReceive(context, null);
-        assertNull(shadowOf(application).peekNextStartedService());
-
-        Intent intent = new Intent();
-        showHideTaskbarReceiver.onReceive(context, intent);
-        assertNull(shadowOf(application).peekNextStartedService());
-
-        intent.setAction(ACTION_SHOW_HIDE_TASKBAR + UNSUPPORTED);
-        showHideTaskbarReceiver.onReceive(context, intent);
-        assertNull(shadowOf(application).peekNextStartedService());
-
-        intent.setAction(ACTION_SHOW_HIDE_TASKBAR);
-        showHideTaskbarReceiver.onReceive(context, intent);
-        assertNull(shadowOf(application).peekNextStartedService());
-
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-        showHideTaskbarReceiver.onReceive(context, intent);
-        Intent startedServiceIntent = shadowOf(application).peekNextStartedService();
-        assertNotNull(startedServiceIntent);
-        assertEquals(notificationIntent.getComponent(), startedServiceIntent.getComponent());
-    }
-
-    @Test
-    public void testShowHideTaskbar() {
-        Intent intent = new Intent(ACTION_SHOW_HIDE_TASKBAR);
-        ShadowSettings.setCanDrawOverlays(true);
-        prefs.edit().putBoolean(PREF_TASKBAR_ACTIVE, true).apply();
-
-        shadowOf(application).clearStartedServices();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, true).apply();
-        showHideTaskbarReceiver.onReceive(context, intent);
-        Intent startedServiceIntent = shadowOf(application).peekNextStartedService();
-        assertNotNull(startedServiceIntent);
-        assertEquals(notificationIntent.getComponent(), startedServiceIntent.getComponent());
-        assertTrue(startedServiceIntent.getBooleanExtra(EXTRA_START_SERVICES, false));
-
-        shadowOf(application).clearStartedServices();
-        prefs.edit().putBoolean(PREF_IS_HIDDEN, false).apply();
-        showHideTaskbarReceiver.onReceive(context, intent);
-        startedServiceIntent = shadowOf(application).peekNextStartedService();
-        assertNotNull(startedServiceIntent);
-        assertEquals(notificationIntent.getComponent(), startedServiceIntent.getComponent());
-        assertNull(startedServiceIntent.getExtras());
-        assertTrue(prefs.getBoolean(PREF_IS_HIDDEN, false));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/receiver/ShowHideTaskbarReceiverTest.kt b/app/src/test/java/com/farmerbb/taskbar/receiver/ShowHideTaskbarReceiverTest.kt
new file mode 100644 (file)
index 0000000..00729e6
--- /dev/null
@@ -0,0 +1,81 @@
+package com.farmerbb.taskbar.receiver
+
+import android.app.Application
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.Constants.UNSUPPORTED
+import com.farmerbb.taskbar.service.NotificationService
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.shadows.ShadowSettings
+
+@RunWith(RobolectricTestRunner::class)
+class ShowHideTaskbarReceiverTest {
+    private var showHideTaskbarReceiver: ShowHideTaskbarReceiver? = null
+    private var application: Application? = null
+    private var context: Context? = null
+    private var prefs: SharedPreferences? = null
+    private var notificationIntent: Intent? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        application = context as Application?
+        notificationIntent = Intent(context, NotificationService::class.java)
+        prefs = U.getSharedPreferences(context)
+        showHideTaskbarReceiver = ShowHideTaskbarReceiver()
+    }
+
+    @Test
+    fun testSkipShowHideTaskbar() {
+        ShadowSettings.setCanDrawOverlays(true)
+        Shadows.shadowOf(application).clearStartedServices()
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, false).apply()
+        showHideTaskbarReceiver!!.onReceive(context, null)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedService())
+        val intent = Intent()
+        showHideTaskbarReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedService())
+        intent.action = Constants.ACTION_SHOW_HIDE_TASKBAR + UNSUPPORTED
+        showHideTaskbarReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedService())
+        intent.action = Constants.ACTION_SHOW_HIDE_TASKBAR
+        showHideTaskbarReceiver!!.onReceive(context, intent)
+        Assert.assertNull(Shadows.shadowOf(application).peekNextStartedService())
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        showHideTaskbarReceiver!!.onReceive(context, intent)
+        val startedServiceIntent = Shadows.shadowOf(application).peekNextStartedService()
+        Assert.assertNotNull(startedServiceIntent)
+        Assert.assertEquals(notificationIntent!!.component, startedServiceIntent.component)
+    }
+
+    @Test
+    fun testShowHideTaskbar() {
+        val intent = Intent(Constants.ACTION_SHOW_HIDE_TASKBAR)
+        ShadowSettings.setCanDrawOverlays(true)
+        prefs!!.edit().putBoolean(Constants.PREF_TASKBAR_ACTIVE, true).apply()
+        Shadows.shadowOf(application).clearStartedServices()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, true).apply()
+        showHideTaskbarReceiver!!.onReceive(context, intent)
+        var startedServiceIntent = Shadows.shadowOf(application).peekNextStartedService()
+        Assert.assertNotNull(startedServiceIntent)
+        Assert.assertEquals(notificationIntent!!.component, startedServiceIntent.component)
+        Assert.assertTrue(startedServiceIntent.getBooleanExtra(Constants.EXTRA_START_SERVICES, false))
+        Shadows.shadowOf(application).clearStartedServices()
+        prefs!!.edit().putBoolean(Constants.PREF_IS_HIDDEN, false).apply()
+        showHideTaskbarReceiver!!.onReceive(context, intent)
+        startedServiceIntent = Shadows.shadowOf(application).peekNextStartedService()
+        Assert.assertNotNull(startedServiceIntent)
+        Assert.assertEquals(notificationIntent!!.component, startedServiceIntent.component)
+        Assert.assertNull(startedServiceIntent.extras)
+        Assert.assertTrue(prefs!!.getBoolean(Constants.PREF_IS_HIDDEN, false))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/FavoriteAppTileServiceTest.java b/app/src/test/java/com/farmerbb/taskbar/service/FavoriteAppTileServiceTest.java
deleted file mode 100644 (file)
index a54596c..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-package com.farmerbb.taskbar.service;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Process;
-import android.os.UserManager;
-import android.service.quicksettings.Tile;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.activity.PersistentShortcutLaunchActivity;
-import com.farmerbb.taskbar.activity.PersistentShortcutSelectAppActivity;
-import com.farmerbb.taskbar.util.Constants;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-import static android.content.Context.USER_SERVICE;
-import static com.farmerbb.taskbar.Constants.TEST_COMPONENT;
-import static com.farmerbb.taskbar.Constants.TEST_LABEL;
-import static com.farmerbb.taskbar.Constants.TEST_PACKAGE;
-import static com.farmerbb.taskbar.Constants.TEST_WINDOW_SIZE;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_COMPONENT_NAME;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_PACKAGE_NAME;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_USER_ID;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_WINDOW_SIZE;
-import static com.farmerbb.taskbar.util.Constants.PREF_COMPONENT_NAME_SUFFIX;
-import static com.farmerbb.taskbar.util.Constants.PREF_LABEL_SUFFIX;
-import static com.farmerbb.taskbar.util.Constants.PREF_PACKAGE_NAME_SUFFIX;
-import static com.farmerbb.taskbar.util.Constants.PREF_QS_TILE;
-import static com.farmerbb.taskbar.util.Constants.PREF_WINDOW_SIZE_SUFFIX;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-public class FavoriteAppTileServiceTest {
-    private FavoriteApp1 app1;
-    private SharedPreferences prefs;
-    private Context context;
-
-    @Before
-    public void setUp() {
-        app1 = Robolectric.setupService(FavoriteApp1.class);
-        prefs = U.getSharedPreferences(app1);
-        context = ApplicationProvider.getApplicationContext();
-    }
-
-    @Test
-    public void testFavoriteApp1TileNumber() {
-        assertEquals(1, app1.tileNumber());
-    }
-
-    @Test
-    public void testFavoriteApp2TileNumber() {
-        FavoriteApp2 app2 = Robolectric.setupService(FavoriteApp2.class);
-        assertEquals(2, app2.tileNumber());
-    }
-
-    @Test
-    public void testFavoriteApp3TileNumber() {
-        FavoriteApp3 app3 = Robolectric.setupService(FavoriteApp3.class);
-        assertEquals(3, app3.tileNumber());
-    }
-
-    @Test
-    public void testFavoriteApp4TileNumber() {
-        FavoriteApp4 app4 = Robolectric.setupService(FavoriteApp4.class);
-        assertEquals(4, app4.tileNumber());
-    }
-
-    @Test
-    public void testFavoriteApp5TileNumber() {
-        FavoriteApp5 app5 = Robolectric.setupService(FavoriteApp5.class);
-        assertEquals(5, app5.tileNumber());
-    }
-
-    @Test
-    public void testOnTileRemoved() {
-        app1.onTileRemoved();
-        assertFalse(
-                prefs.getBoolean(app1.getPrefix() + Constants.PREF_ADDED_SUFFIX, true)
-        );
-    }
-
-    @Test
-    public void testOnClickWithoutAdded() {
-        prefs.edit().putBoolean(app1.getPrefix() + Constants.PREF_ADDED_SUFFIX, false).apply();
-        app1.onClick();
-        Intent startedActivityIntent = shadowOf((Application) context).getNextStartedActivity();
-        assertNotNull(startedActivityIntent);
-        assertEquals(
-                app1.tileNumber(),
-                startedActivityIntent.getIntExtra(PREF_QS_TILE, Integer.MIN_VALUE)
-        );
-        assertNotNull(startedActivityIntent.getComponent());
-        assertTrue(
-                startedActivityIntent
-                        .getComponent()
-                        .getClassName()
-                        .endsWith(PersistentShortcutSelectAppActivity.class.getSimpleName())
-        );
-    }
-
-    @Test
-    public void testOnClickWithAdded() {
-        prefs.edit().putBoolean(app1.getPrefix() + Constants.PREF_ADDED_SUFFIX, true).apply();
-
-        shadowOf(app1).setLocked(true);
-        app1.onClick();
-        assertFalse(app1.isLocked());
-
-        shadowOf(app1).setLocked(false);
-        String testPackageName = TEST_PACKAGE;
-        prefs
-                .edit()
-                .putString(app1.getPrefix() + PREF_PACKAGE_NAME_SUFFIX, testPackageName)
-                .apply();
-        String testComponentName = TEST_COMPONENT;
-        prefs
-                .edit()
-                .putString(app1.getPrefix() + PREF_COMPONENT_NAME_SUFFIX, testComponentName)
-                .apply();
-        String testWindowSize = TEST_WINDOW_SIZE;
-        prefs
-                .edit()
-                .putString(app1.getPrefix() + PREF_WINDOW_SIZE_SUFFIX, testWindowSize)
-                .apply();
-        app1.onClick();
-        Intent startedActivityIntent = shadowOf((Application) context).getNextStartedActivity();
-        assertNotNull(startedActivityIntent);
-        assertNotNull(startedActivityIntent.getComponent());
-        assertTrue(
-                startedActivityIntent
-                        .getComponent()
-                        .getClassName()
-                        .endsWith(PersistentShortcutLaunchActivity.class.getSimpleName())
-        );
-        assertEquals(Intent.ACTION_MAIN, startedActivityIntent.getAction());
-        assertEquals(
-                testPackageName,
-                startedActivityIntent.getStringExtra(EXTRA_PACKAGE_NAME)
-        );
-        assertEquals(
-                testComponentName,
-                startedActivityIntent.getStringExtra(EXTRA_COMPONENT_NAME)
-        );
-        assertEquals(
-                testWindowSize,
-                startedActivityIntent.getStringExtra(EXTRA_WINDOW_SIZE)
-        );
-        UserManager userManager = (UserManager) context.getSystemService(USER_SERVICE);
-        assertEquals(
-                userManager.getSerialNumberForUser(Process.myUserHandle()),
-                startedActivityIntent.getLongExtra(EXTRA_USER_ID, Long.MIN_VALUE)
-        );
-    }
-
-    @Test
-    public void testOnStartListeningWithoutAdded() {
-        prefs.edit().putBoolean(app1.getPrefix() + Constants.PREF_ADDED_SUFFIX, false).apply();
-        app1.onStartListening();
-        Tile tile = app1.getQsTile();
-        assertEquals(Tile.STATE_INACTIVE, tile.getState());
-        assertEquals(app1.getString(R.string.tb_new_shortcut), tile.getLabel());
-    }
-
-    @Test
-    public void testOnStartListeningWithAdded() {
-        prefs.edit().putBoolean(app1.getPrefix() + Constants.PREF_ADDED_SUFFIX, true).apply();
-        String testLabel = TEST_LABEL;
-        prefs.edit().putString(app1.getPrefix() + PREF_LABEL_SUFFIX, testLabel).apply();
-        app1.onStartListening();
-        Tile tile = app1.getQsTile();
-        assertEquals(Tile.STATE_ACTIVE, tile.getState());
-        assertEquals(testLabel, tile.getLabel());
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/FavoriteAppTileServiceTest.kt b/app/src/test/java/com/farmerbb/taskbar/service/FavoriteAppTileServiceTest.kt
new file mode 100644 (file)
index 0000000..be92a41
--- /dev/null
@@ -0,0 +1,168 @@
+package com.farmerbb.taskbar.service
+
+import android.app.Application
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import android.os.Process
+import android.os.UserManager
+import android.service.quicksettings.Tile
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.Constants.TEST_COMPONENT
+import com.farmerbb.taskbar.Constants.TEST_LABEL
+import com.farmerbb.taskbar.Constants.TEST_PACKAGE
+import com.farmerbb.taskbar.Constants.TEST_WINDOW_SIZE
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.activity.PersistentShortcutLaunchActivity
+import com.farmerbb.taskbar.activity.PersistentShortcutSelectAppActivity
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+
+@RunWith(RobolectricTestRunner::class)
+class FavoriteAppTileServiceTest {
+    private var app1: FavoriteApp1? = null
+    private var prefs: SharedPreferences? = null
+    private var context: Context? = null
+
+    @Before
+    fun setUp() {
+        app1 = Robolectric.setupService(FavoriteApp1::class.java)
+        prefs = U.getSharedPreferences(app1)
+        context = ApplicationProvider.getApplicationContext()
+    }
+
+    @Test
+    fun testFavoriteApp1TileNumber() {
+        Assert.assertEquals(1, app1!!.tileNumber().toLong())
+    }
+
+    @Test
+    fun testFavoriteApp2TileNumber() {
+        val app2 = Robolectric.setupService(FavoriteApp2::class.java)
+        Assert.assertEquals(2, app2.tileNumber().toLong())
+    }
+
+    @Test
+    fun testFavoriteApp3TileNumber() {
+        val app3 = Robolectric.setupService(FavoriteApp3::class.java)
+        Assert.assertEquals(3, app3.tileNumber().toLong())
+    }
+
+    @Test
+    fun testFavoriteApp4TileNumber() {
+        val app4 = Robolectric.setupService(FavoriteApp4::class.java)
+        Assert.assertEquals(4, app4.tileNumber().toLong())
+    }
+
+    @Test
+    fun testFavoriteApp5TileNumber() {
+        val app5 = Robolectric.setupService(FavoriteApp5::class.java)
+        Assert.assertEquals(5, app5.tileNumber().toLong())
+    }
+
+    @Test
+    fun testOnTileRemoved() {
+        app1!!.onTileRemoved()
+        Assert.assertFalse(
+                prefs!!.getBoolean(app1!!.prefix + Constants.PREF_ADDED_SUFFIX, true)
+        )
+    }
+
+    @Test
+    fun testOnClickWithoutAdded() {
+        prefs!!.edit().putBoolean(app1!!.prefix + Constants.PREF_ADDED_SUFFIX, false).apply()
+        app1!!.onClick()
+        val startedActivityIntent = Shadows.shadowOf(context as Application?).nextStartedActivity
+        Assert.assertNotNull(startedActivityIntent)
+        Assert.assertEquals(
+                app1!!.tileNumber().toLong(),
+                startedActivityIntent.getIntExtra(Constants.PREF_QS_TILE, Int.MIN_VALUE)
+                        .toLong())
+        Assert.assertNotNull(startedActivityIntent.component)
+        Assert.assertTrue(
+                startedActivityIntent
+                        .component
+                        ?.className
+                        ?.endsWith(PersistentShortcutSelectAppActivity::class.java.simpleName)!!
+        )
+    }
+
+    @Test
+    fun testOnClickWithAdded() {
+        prefs!!.edit().putBoolean(app1!!.prefix + Constants.PREF_ADDED_SUFFIX, true).apply()
+        Shadows.shadowOf(app1).setLocked(true)
+        app1!!.onClick()
+        Assert.assertFalse(app1!!.isLocked)
+        Shadows.shadowOf(app1).setLocked(false)
+        val testPackageName: String = TEST_PACKAGE
+        prefs!!
+                .edit()
+                .putString(app1!!.prefix + Constants.PREF_PACKAGE_NAME_SUFFIX, testPackageName)
+                .apply()
+        val testComponentName: String = TEST_COMPONENT
+        prefs!!
+                .edit()
+                .putString(app1!!.prefix + Constants.PREF_COMPONENT_NAME_SUFFIX, testComponentName)
+                .apply()
+        val testWindowSize: String = TEST_WINDOW_SIZE
+        prefs!!
+                .edit()
+                .putString(app1!!.prefix + Constants.PREF_WINDOW_SIZE_SUFFIX, testWindowSize)
+                .apply()
+        app1!!.onClick()
+        val startedActivityIntent = Shadows.shadowOf(context as Application?).nextStartedActivity
+        Assert.assertNotNull(startedActivityIntent)
+        Assert.assertNotNull(startedActivityIntent.component)
+        Assert.assertTrue(
+                startedActivityIntent
+                        .component
+                        ?.className
+                        ?.endsWith(PersistentShortcutLaunchActivity::class.java.simpleName)!!
+        )
+        Assert.assertEquals(Intent.ACTION_MAIN, startedActivityIntent.action)
+        Assert.assertEquals(
+                testPackageName,
+                startedActivityIntent.getStringExtra(Constants.EXTRA_PACKAGE_NAME)
+        )
+        Assert.assertEquals(
+                testComponentName,
+                startedActivityIntent.getStringExtra(Constants.EXTRA_COMPONENT_NAME)
+        )
+        Assert.assertEquals(
+                testWindowSize,
+                startedActivityIntent.getStringExtra(Constants.EXTRA_WINDOW_SIZE)
+        )
+        val userManager = context!!.getSystemService(Context.USER_SERVICE) as UserManager
+        Assert.assertEquals(
+                userManager.getSerialNumberForUser(Process.myUserHandle()),
+                startedActivityIntent.getLongExtra(Constants.EXTRA_USER_ID, Long.MIN_VALUE)
+        )
+    }
+
+    @Test
+    fun testOnStartListeningWithoutAdded() {
+        prefs!!.edit().putBoolean(app1!!.prefix + Constants.PREF_ADDED_SUFFIX, false).apply()
+        app1!!.onStartListening()
+        val tile = app1!!.qsTile
+        Assert.assertEquals(Tile.STATE_INACTIVE.toLong(), tile.state.toLong())
+        Assert.assertEquals(app1!!.getString(R.string.tb_new_shortcut), tile.label)
+    }
+
+    @Test
+    fun testOnStartListeningWithAdded() {
+        prefs!!.edit().putBoolean(app1!!.prefix + Constants.PREF_ADDED_SUFFIX, true).apply()
+        val testLabel: String = TEST_LABEL
+        prefs!!.edit().putString(app1!!.prefix + Constants.PREF_LABEL_SUFFIX, testLabel).apply()
+        app1!!.onStartListening()
+        val tile = app1!!.qsTile
+        Assert.assertEquals(Tile.STATE_ACTIVE.toLong(), tile.state.toLong())
+        Assert.assertEquals(testLabel, tile.label)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/NotificationCountServiceTest.java b/app/src/test/java/com/farmerbb/taskbar/service/NotificationCountServiceTest.java
deleted file mode 100644 (file)
index 1002919..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.farmerbb.taskbar.service;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-
-import androidx.localbroadcastmanager.content.LocalBroadcastManager;
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-import static android.os.Looper.getMainLooper;
-import static com.farmerbb.taskbar.util.Constants.ACTION_NOTIFICATION_COUNT_CHANGED;
-import static com.farmerbb.taskbar.util.Constants.ACTION_REQUEST_NOTIFICATION_COUNT;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_COUNT;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-public class NotificationCountServiceTest {
-    private NotificationCountReceiver receiver = new NotificationCountReceiver();
-    private Context context;
-    private NotificationCountService service;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        service = Robolectric.setupService(NotificationCountService.class);
-        LocalBroadcastManager
-                .getInstance(context)
-                .registerReceiver(receiver, new IntentFilter(ACTION_NOTIFICATION_COUNT_CHANGED));
-        receiver.reset();
-    }
-
-    @After
-    public void tearDown() {
-        LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
-    }
-
-    @Test
-    public void testOnListenerConnected() {
-        service.onListenerConnected();
-        shadowOf(getMainLooper()).idle();
-        assertTrue(receiver.count >= 0);
-
-        receiver.reset();
-        Intent intent = new Intent();
-        intent.setAction(ACTION_REQUEST_NOTIFICATION_COUNT);
-        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
-        shadowOf(getMainLooper()).idle();
-        assertTrue(receiver.count >= 0);
-    }
-
-    @Test
-    public void testOnListenerDisconnected() {
-        receiver.count = Integer.MAX_VALUE;
-        service.onListenerDisconnected();
-        shadowOf(getMainLooper()).idle();
-        assertEquals(0, receiver.count);
-    }
-
-    @Test
-    public void testOnNotificationPosted() {
-        service.onNotificationPosted(null);
-        shadowOf(getMainLooper()).idle();
-        assertTrue(receiver.count >= 0);
-    }
-
-    @Test
-    public void testOnNotificationRemoved() {
-        service.onNotificationRemoved(null);
-        shadowOf(getMainLooper()).idle();
-        assertTrue(receiver.count >= 0);
-    }
-
-    @Test
-    public void testGetValidCount() {
-        assertEquals(0, service.getValidCount(0));
-        assertEquals(60, service.getValidCount(60));
-        assertEquals(99, service.getValidCount(99));
-        assertEquals(99, service.getValidCount(1000));
-        assertEquals(99, service.getValidCount(Integer.MAX_VALUE));
-    }
-
-    private static class NotificationCountReceiver extends BroadcastReceiver {
-        int count = -1;
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            count = intent.getIntExtra(EXTRA_COUNT, -1);
-        }
-
-        void reset() {
-            count = -1;
-        }
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/NotificationCountServiceTest.kt b/app/src/test/java/com/farmerbb/taskbar/service/NotificationCountServiceTest.kt
new file mode 100644 (file)
index 0000000..d894866
--- /dev/null
@@ -0,0 +1,95 @@
+package com.farmerbb.taskbar.service
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.os.Looper
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.util.Constants
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+
+@RunWith(RobolectricTestRunner::class)
+class NotificationCountServiceTest {
+    private val receiver = NotificationCountReceiver()
+    private var context: Context? = null
+    private var service: NotificationCountService? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        service = Robolectric.setupService(NotificationCountService::class.java)
+        LocalBroadcastManager
+                .getInstance(context!!)
+                .registerReceiver(receiver, IntentFilter(Constants.ACTION_NOTIFICATION_COUNT_CHANGED))
+        receiver.reset()
+    }
+
+    @After
+    fun tearDown() {
+        LocalBroadcastManager.getInstance(context!!).unregisterReceiver(receiver)
+    }
+
+    @Test
+    fun testOnListenerConnected() {
+        service!!.onListenerConnected()
+        Shadows.shadowOf(Looper.getMainLooper()).idle()
+        Assert.assertTrue(receiver.count >= 0)
+        receiver.reset()
+        val intent = Intent()
+        intent.action = Constants.ACTION_REQUEST_NOTIFICATION_COUNT
+        LocalBroadcastManager.getInstance(context!!).sendBroadcast(intent)
+        Shadows.shadowOf(Looper.getMainLooper()).idle()
+        Assert.assertTrue(receiver.count >= 0)
+    }
+
+    @Test
+    fun testOnListenerDisconnected() {
+        receiver.count = Int.MAX_VALUE
+        service!!.onListenerDisconnected()
+        Shadows.shadowOf(Looper.getMainLooper()).idle()
+        Assert.assertEquals(0, receiver.count.toLong())
+    }
+
+    @Test
+    fun testOnNotificationPosted() {
+        service!!.onNotificationPosted(null)
+        Shadows.shadowOf(Looper.getMainLooper()).idle()
+        Assert.assertTrue(receiver.count >= 0)
+    }
+
+    @Test
+    fun testOnNotificationRemoved() {
+        service!!.onNotificationRemoved(null)
+        Shadows.shadowOf(Looper.getMainLooper()).idle()
+        Assert.assertTrue(receiver.count >= 0)
+    }
+
+    @Test
+    fun testGetValidCount() {
+        Assert.assertEquals(0, service!!.getValidCount(0).toLong())
+        Assert.assertEquals(60, service!!.getValidCount(60).toLong())
+        Assert.assertEquals(99, service!!.getValidCount(99).toLong())
+        Assert.assertEquals(99, service!!.getValidCount(1000).toLong())
+        Assert.assertEquals(99, service!!.getValidCount(Int.MAX_VALUE).toLong())
+    }
+
+    private class NotificationCountReceiver : BroadcastReceiver() {
+        var count = -1
+        override fun onReceive(context: Context, intent: Intent) {
+            count = intent.getIntExtra(Constants.EXTRA_COUNT, -1)
+        }
+
+        fun reset() {
+            count = -1
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/PowerMenuServiceTest.java b/app/src/test/java/com/farmerbb/taskbar/service/PowerMenuServiceTest.java
deleted file mode 100644 (file)
index c42be5d..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.farmerbb.taskbar.service;
-
-import android.content.Intent;
-
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.LooperMode;
-import org.robolectric.shadows.ShadowAccessibilityService;
-
-import static com.farmerbb.taskbar.util.Constants.ACTION_ACCESSIBILITY_ACTION;
-import static com.farmerbb.taskbar.util.Constants.EXTRA_ACTION;
-import static org.junit.Assert.assertTrue;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-@LooperMode(LooperMode.Mode.LEGACY)
-public class PowerMenuServiceTest {
-    @Test
-    public void testAccessibilityActionPerforming() {
-        PowerMenuService service = Robolectric.setupService(PowerMenuService.class);
-        Intent intent = new Intent(ACTION_ACCESSIBILITY_ACTION);
-        int testAction = 1000;
-        intent.putExtra(EXTRA_ACTION, testAction);
-        U.sendBroadcast(service, intent);
-        ShadowAccessibilityService shadowService = shadowOf(service);
-        assertTrue(shadowService.getGlobalActionsPerformed().contains(testAction));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/PowerMenuServiceTest.kt b/app/src/test/java/com/farmerbb/taskbar/service/PowerMenuServiceTest.kt
new file mode 100644 (file)
index 0000000..698d690
--- /dev/null
@@ -0,0 +1,27 @@
+package com.farmerbb.taskbar.service
+
+import android.content.Intent
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.annotation.LooperMode
+
+@RunWith(RobolectricTestRunner::class)
+@LooperMode(LooperMode.Mode.LEGACY)
+class PowerMenuServiceTest {
+    @Test
+    fun testAccessibilityActionPerforming() {
+        val service = Robolectric.setupService(PowerMenuService::class.java)
+        val intent = Intent(Constants.ACTION_ACCESSIBILITY_ACTION)
+        val testAction = 1000
+        intent.putExtra(Constants.EXTRA_ACTION, testAction)
+        U.sendBroadcast(service, intent)
+        val shadowService = Shadows.shadowOf(service)
+        Assert.assertTrue(shadowService.globalActionsPerformed.contains(testAction))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/QuickSettingsTileServiceTest.java b/app/src/test/java/com/farmerbb/taskbar/service/QuickSettingsTileServiceTest.java
deleted file mode 100644 (file)
index 05eabc0..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.farmerbb.taskbar.service;
-
-import android.content.SharedPreferences;
-import android.graphics.drawable.Icon;
-import android.service.quicksettings.Tile;
-
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-import static com.farmerbb.taskbar.Constants.UNSUPPORTED;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_BUTTON_IMAGE;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_BUTTON_IMAGE_APP_LOGO;
-import static org.junit.Assert.assertEquals;
-import static org.powermock.api.mockito.PowerMockito.when;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(value = {U.class})
-public class QuickSettingsTileServiceTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private QuickSettingsTileService tileService;
-    private SharedPreferences prefs;
-
-    @Before
-    public void setUp() {
-        tileService = Robolectric.setupService(QuickSettingsTileService.class);
-        prefs = U.getSharedPreferences(tileService);
-    }
-
-    @Test
-    public void testUpdateStateForIcon() {
-        prefs.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_APP_LOGO).apply();
-        tileService.updateState();
-        Icon icon = tileService.getQsTile().getIcon();
-        assertEquals(R.drawable.tb_system, shadowOf(icon).getResId());
-
-        prefs.edit().putString(PREF_START_BUTTON_IMAGE, UNSUPPORTED).apply();
-        tileService.updateState();
-        icon = tileService.getQsTile().getIcon();
-        assertEquals(R.drawable.tb_allapps, shadowOf(icon).getResId());
-    }
-
-    @Test
-    public void testUpdateStateForState() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer canDrawOverlaysAnswer = new BooleanAnswer();
-        when(U.canDrawOverlays(tileService)).thenAnswer(canDrawOverlaysAnswer);
-        BooleanAnswer isServiceRunningAnswer = new BooleanAnswer();
-        when(U.isServiceRunning(tileService, NotificationService.class))
-                .thenAnswer(isServiceRunningAnswer);
-
-        canDrawOverlaysAnswer.answer = true;
-        isServiceRunningAnswer.answer = true;
-        tileService.updateState();
-        assertEquals(Tile.STATE_ACTIVE, tileService.getQsTile().getState());
-
-        canDrawOverlaysAnswer.answer = true;
-        isServiceRunningAnswer.answer = false;
-        tileService.updateState();
-        assertEquals(Tile.STATE_INACTIVE, tileService.getQsTile().getState());
-
-        canDrawOverlaysAnswer.answer = false;
-        isServiceRunningAnswer.answer = true;
-        tileService.updateState();
-        assertEquals(Tile.STATE_UNAVAILABLE, tileService.getQsTile().getState());
-
-        canDrawOverlaysAnswer.answer = false;
-        isServiceRunningAnswer.answer = false;
-        tileService.updateState();
-        assertEquals(Tile.STATE_UNAVAILABLE, tileService.getQsTile().getState());
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/QuickSettingsTileServiceTest.kt b/app/src/test/java/com/farmerbb/taskbar/service/QuickSettingsTileServiceTest.kt
new file mode 100644 (file)
index 0000000..945aa15
--- /dev/null
@@ -0,0 +1,75 @@
+package com.farmerbb.taskbar.service
+
+import android.content.SharedPreferences
+import android.service.quicksettings.Tile
+import com.farmerbb.taskbar.Constants.UNSUPPORTED
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(value = [U::class])
+class QuickSettingsTileServiceTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var tileService: QuickSettingsTileService? = null
+    private var prefs: SharedPreferences? = null
+
+    @Before
+    fun setUp() {
+        tileService = Robolectric.setupService(QuickSettingsTileService::class.java)
+        prefs = U.getSharedPreferences(tileService)
+    }
+
+    @Test
+    fun testUpdateStateForIcon() {
+        prefs!!.edit().putString(Constants.PREF_START_BUTTON_IMAGE, Constants.PREF_START_BUTTON_IMAGE_APP_LOGO).apply()
+        tileService!!.updateState()
+        var icon = tileService!!.qsTile.icon
+        Assert.assertEquals(R.drawable.tb_system.toLong(), Shadows.shadowOf(icon).resId.toLong())
+        prefs!!.edit().putString(Constants.PREF_START_BUTTON_IMAGE, UNSUPPORTED).apply()
+        tileService!!.updateState()
+        icon = tileService!!.qsTile.icon
+        Assert.assertEquals(R.drawable.tb_allapps.toLong(), Shadows.shadowOf(icon).resId.toLong())
+    }
+
+    @Test
+    fun testUpdateStateForState() {
+        PowerMockito.spy(U::class.java)
+        val canDrawOverlaysAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.canDrawOverlays(tileService)).thenAnswer(canDrawOverlaysAnswer)
+        val isServiceRunningAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.isServiceRunning(tileService, NotificationService::class.java))
+                .thenAnswer(isServiceRunningAnswer)
+        canDrawOverlaysAnswer.answer = true
+        isServiceRunningAnswer.answer = true
+        tileService!!.updateState()
+        Assert.assertEquals(Tile.STATE_ACTIVE.toLong(), tileService!!.qsTile.state.toLong())
+        canDrawOverlaysAnswer.answer = true
+        isServiceRunningAnswer.answer = false
+        tileService!!.updateState()
+        Assert.assertEquals(Tile.STATE_INACTIVE.toLong(), tileService!!.qsTile.state.toLong())
+        canDrawOverlaysAnswer.answer = false
+        isServiceRunningAnswer.answer = true
+        tileService!!.updateState()
+        Assert.assertEquals(Tile.STATE_UNAVAILABLE.toLong(), tileService!!.qsTile.state.toLong())
+        canDrawOverlaysAnswer.answer = false
+        isServiceRunningAnswer.answer = false
+        tileService!!.updateState()
+        Assert.assertEquals(Tile.STATE_UNAVAILABLE.toLong(), tileService!!.qsTile.state.toLong())
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/UIHostServiceNewControllerTest.java b/app/src/test/java/com/farmerbb/taskbar/service/UIHostServiceNewControllerTest.java
deleted file mode 100644 (file)
index b1547fc..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.farmerbb.taskbar.service;
-
-import com.farmerbb.taskbar.ui.DashboardController;
-import com.farmerbb.taskbar.ui.StartMenuController;
-import com.farmerbb.taskbar.ui.TaskbarController;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class UIHostServiceNewControllerTest {
-    @Test
-    public void testDashboardService() {
-        DashboardService dashboardService = Robolectric.setupService(DashboardService.class);
-        assertTrue(dashboardService.newController() instanceof DashboardController);
-    }
-
-    @Test
-    public void testStartMenuService() {
-        StartMenuService startMenuService = Robolectric.setupService(StartMenuService.class);
-        assertTrue(startMenuService.newController() instanceof StartMenuController);
-    }
-
-    @Test
-    public void testTaskbarService() {
-        TaskbarService taskbarService = Robolectric.setupService(TaskbarService.class);
-        assertTrue(taskbarService.newController() instanceof TaskbarController);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/service/UIHostServiceNewControllerTest.kt b/app/src/test/java/com/farmerbb/taskbar/service/UIHostServiceNewControllerTest.kt
new file mode 100644 (file)
index 0000000..c6b67e3
--- /dev/null
@@ -0,0 +1,31 @@
+package com.farmerbb.taskbar.service
+
+import com.farmerbb.taskbar.ui.DashboardController
+import com.farmerbb.taskbar.ui.StartMenuController
+import com.farmerbb.taskbar.ui.TaskbarController
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class UIHostServiceNewControllerTest {
+    @Test
+    fun testDashboardService() {
+        val dashboardService = Robolectric.setupService(DashboardService::class.java)
+        Assert.assertTrue(dashboardService.newController() is DashboardController)
+    }
+
+    @Test
+    fun testStartMenuService() {
+        val startMenuService = Robolectric.setupService(StartMenuService::class.java)
+        Assert.assertTrue(startMenuService.newController() is StartMenuController)
+    }
+
+    @Test
+    fun testTaskbarService() {
+        val taskbarService = Robolectric.setupService(TaskbarService::class.java)
+        Assert.assertTrue(taskbarService.newController() is TaskbarController)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowScrollView.java b/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowScrollView.java
deleted file mode 100644 (file)
index aa53806..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.farmerbb.taskbar.shadow;
-
-import android.widget.ScrollView;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowScrollView;
-
-@Implements(ScrollView.class)
-public class TaskbarShadowScrollView extends ShadowScrollView {
-
-    @Implementation
-    public void scrollTo(int x, int y) {
-        super.scrollTo(x, y);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowScrollView.kt b/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowScrollView.kt
new file mode 100644 (file)
index 0000000..71c609b
--- /dev/null
@@ -0,0 +1,14 @@
+package com.farmerbb.taskbar.shadow
+
+import android.widget.ScrollView
+import org.robolectric.annotation.Implementation
+import org.robolectric.annotation.Implements
+import org.robolectric.shadows.ShadowScrollView
+
+@Implements(ScrollView::class)
+class TaskbarShadowScrollView : ShadowScrollView() {
+    @Implementation
+    public override fun scrollTo(x: Int, y: Int) {
+        super.scrollTo(x, y)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.java b/app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.java
deleted file mode 100644 (file)
index fb3304a..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.os.Process;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.Constants;
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.helper.LauncherHelper;
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.util.TaskbarPosition;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.shadows.AppWidgetProviderInfoBuilder;
-import org.robolectric.shadows.ShadowAppWidgetManager;
-import org.robolectric.shadows.ShadowToast;
-
-import static com.farmerbb.taskbar.Constants.DEFAULT_TEST_CELL_ID;
-import static com.farmerbb.taskbar.Constants.TEST_LABEL;
-import static com.farmerbb.taskbar.Constants.TEST_NAME;
-import static com.farmerbb.taskbar.Constants.TEST_PACKAGE;
-import static com.farmerbb.taskbar.Constants.UNSUPPORTED;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_TUTORIAL_SHOWN;
-import static com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PLACEHOLDER_SUFFIX;
-import static com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PREFIX;
-import static com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PROVIDER_SUFFIX;
-import static com.farmerbb.taskbar.util.Constants.PREF_DEFAULT_NULL;
-import static com.farmerbb.taskbar.util.Constants.PREF_DONT_STOP_DASHBOARD;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.powermock.api.mockito.PowerMockito.when;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*",
-        "android.*", "androidx.*", "com.farmerbb.taskbar.shadow.*"
-})
-@PrepareForTest(value = {U.class, TaskbarPosition.class,
-        DashboardController.class, LauncherHelper.class})
-public class DashboardControllerTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private DashboardController uiController;
-    private Context context;
-    private SharedPreferences prefs;
-    private final UIHost host = new MockUIHost();
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        uiController = new DashboardController(context);
-        prefs = U.getSharedPreferences(context);
-
-        uiController.onCreateHost(host);
-    }
-
-    @After
-    public void tearDown() {
-        uiController.onDestroyHost(host);
-        prefs.edit().remove(PREF_DASHBOARD_TUTORIAL_SHOWN).apply();
-    }
-
-    @Test
-    public void testUpdatePaddingSize() {
-        int paddingDefault = Integer.MAX_VALUE;
-        LinearLayout layout = new LinearLayout(context);
-        layout.setPadding(paddingDefault, paddingDefault, paddingDefault, paddingDefault);
-        uiController.updatePaddingSize(context, layout, Constants.UNSUPPORTED);
-        verifyViewPadding(layout, paddingDefault, paddingDefault, paddingDefault, paddingDefault);
-
-        int paddingSize = context.getResources().getDimensionPixelSize(R.dimen.tb_icon_size);
-
-        uiController.updatePaddingSize(context, layout, POSITION_TOP_VERTICAL_LEFT);
-        verifyViewPadding(layout, paddingSize, 0, 0, 0);
-
-        uiController.updatePaddingSize(context, layout, POSITION_BOTTOM_VERTICAL_LEFT);
-        verifyViewPadding(layout, paddingSize, 0, 0, 0);
-
-        uiController.updatePaddingSize(context, layout, POSITION_TOP_LEFT);
-        verifyViewPadding(layout, 0, paddingSize, 0, 0);
-
-        uiController.updatePaddingSize(context, layout, POSITION_TOP_RIGHT);
-        verifyViewPadding(layout, 0, paddingSize, 0, 0);
-
-        uiController.updatePaddingSize(context, layout, POSITION_TOP_VERTICAL_RIGHT);
-        verifyViewPadding(layout, 0, 0, paddingSize, 0);
-
-        uiController.updatePaddingSize(context, layout, POSITION_BOTTOM_VERTICAL_RIGHT);
-        verifyViewPadding(layout, 0, 0, paddingSize, 0);
-
-        uiController.updatePaddingSize(context, layout, POSITION_BOTTOM_LEFT);
-        verifyViewPadding(layout, 0, 0, 0, paddingSize);
-
-        uiController.updatePaddingSize(context, layout, POSITION_BOTTOM_RIGHT);
-        verifyViewPadding(layout, 0, 0, 0, paddingSize);
-    }
-
-    @Test
-    public void testShouldSendDisappearingBroadcast() {
-        LauncherHelper helper = PowerMockito.mock(LauncherHelper.class);
-        BooleanAnswer isOnSecondaryHomeScreenAnswer = new BooleanAnswer();
-        when(helper.isOnSecondaryHomeScreen(context))
-                .thenAnswer(isOnSecondaryHomeScreenAnswer);
-        PowerMockito.mockStatic(LauncherHelper.class);
-        when(LauncherHelper.getInstance()).thenReturn(helper);
-
-        isOnSecondaryHomeScreenAnswer.answer = true;
-        prefs.edit().putBoolean(PREF_DONT_STOP_DASHBOARD, true).apply();
-        assertFalse(uiController.shouldSendDisappearingBroadcast(context, prefs));
-
-        isOnSecondaryHomeScreenAnswer.answer = true;
-        prefs.edit().putBoolean(PREF_DONT_STOP_DASHBOARD, false).apply();
-        assertTrue(uiController.shouldSendDisappearingBroadcast(context, prefs));
-
-        isOnSecondaryHomeScreenAnswer.answer = false;
-        prefs.edit().putBoolean(PREF_DONT_STOP_DASHBOARD, true).apply();
-        assertTrue(uiController.shouldSendDisappearingBroadcast(context, prefs));
-
-        isOnSecondaryHomeScreenAnswer.answer = false;
-        prefs.edit().putBoolean(PREF_DONT_STOP_DASHBOARD, false).apply();
-        assertTrue(uiController.shouldSendDisappearingBroadcast(context, prefs));
-    }
-
-    @Test
-    public void testSaveWidgetInfo() {
-        AppWidgetProviderInfo info = new AppWidgetProviderInfo();
-        info.provider = new ComponentName(TEST_PACKAGE, TEST_NAME);
-        int cellId = DEFAULT_TEST_CELL_ID;
-        int appWidgetId = 100;
-        prefs.edit().putString(uiController.generateProviderPlaceholderPrefKey(cellId), "").apply();
-        uiController.saveWidgetInfo(context, info, cellId, appWidgetId);
-        assertEquals(
-                appWidgetId,
-                prefs.getInt(PREF_DASHBOARD_WIDGET_PREFIX + cellId, -1)
-        );
-        assertEquals(
-                info.provider.flattenToString(),
-                prefs.getString(uiController.generateProviderPrefKey(cellId), "")
-        );
-        assertFalse(prefs.contains(uiController.generateProviderPlaceholderPrefKey(cellId)));
-    }
-
-    @Test
-    public void testShowDashboardTutorialToast() {
-        prefs.edit().putBoolean(PREF_DASHBOARD_TUTORIAL_SHOWN, true).apply();
-        uiController.showDashboardTutorialToast(context);
-        assertNull(ShadowToast.getTextOfLatestToast());
-
-        prefs.edit().putBoolean(PREF_DASHBOARD_TUTORIAL_SHOWN, false).apply();
-        uiController.showDashboardTutorialToast(context);
-        assertTrue(prefs.getBoolean(PREF_DASHBOARD_TUTORIAL_SHOWN, false));
-        String toastText = ShadowToast.getTextOfLatestToast();
-        assertEquals(context.getString(R.string.tb_dashboard_tutorial, toastText), toastText);
-    }
-
-    @Test
-    public void testGenerateProviderPrefKey() {
-        assertEquals(
-                PREF_DASHBOARD_WIDGET_PREFIX
-                        + DEFAULT_TEST_CELL_ID
-                        + PREF_DASHBOARD_WIDGET_PROVIDER_SUFFIX,
-                uiController.generateProviderPrefKey(DEFAULT_TEST_CELL_ID)
-        );
-    }
-
-    @Test
-    public void testGenerateProviderPlaceholderPrefKey() {
-        assertEquals(
-                PREF_DASHBOARD_WIDGET_PREFIX
-                        + DEFAULT_TEST_CELL_ID
-                        + PREF_DASHBOARD_WIDGET_PLACEHOLDER_SUFFIX,
-                uiController.generateProviderPlaceholderPrefKey(DEFAULT_TEST_CELL_ID)
-        );
-    }
-
-    @Test
-    public void testShowPlaceholderToast() {
-        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
-        int cellId = DEFAULT_TEST_CELL_ID;
-        String providerPrefKey = uiController.generateProviderPrefKey(cellId);
-
-        ShadowAppWidgetManager shadowAppWidgetManager = shadowOf(appWidgetManager);
-        ActivityInfo providerInfo = new ActivityInfo();
-        providerInfo.nonLocalizedLabel = TEST_LABEL;
-        AppWidgetProviderInfo info =
-                AppWidgetProviderInfoBuilder.newBuilder().setProviderInfo(providerInfo).build();
-        info.provider = new ComponentName(TEST_PACKAGE, TEST_NAME);
-        shadowAppWidgetManager.addInstalledProvidersForProfile(Process.myUserHandle(), info);
-
-        prefs.edit().putString(providerPrefKey, null).apply();
-        uiController.showPlaceholderToast(context, appWidgetManager, cellId, prefs);
-        assertNull(ShadowToast.getLatestToast());
-
-        prefs.edit().putString(providerPrefKey, PREF_DEFAULT_NULL).apply();
-        uiController.showPlaceholderToast(context, appWidgetManager, cellId, prefs);
-        assertNull(ShadowToast.getLatestToast());
-
-        prefs
-                .edit()
-                .putString(providerPrefKey, info.provider.flattenToString() + UNSUPPORTED)
-                .apply();
-        uiController.showPlaceholderToast(context, appWidgetManager, cellId, prefs);
-        assertNull(ShadowToast.getLatestToast());
-
-        prefs.edit().putString(providerPrefKey, info.provider.flattenToString()).apply();
-        uiController.showPlaceholderToast(context, appWidgetManager, cellId, prefs);
-        String lastToast = ShadowToast.getTextOfLatestToast();
-        assertNotNull(lastToast);
-        String expectedText = context.getString(R.string.tb_widget_restore_toast, TEST_LABEL);
-        assertEquals(expectedText, lastToast);
-    }
-
-    private void verifyViewPadding(View view, int left, int top, int right, int bottom) {
-        assertEquals(left, view.getPaddingLeft());
-        assertEquals(top, view.getPaddingTop());
-        assertEquals(right, view.getPaddingRight());
-        assertEquals(bottom, view.getPaddingBottom());
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.kt b/app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.kt
new file mode 100644 (file)
index 0000000..2f2460e
--- /dev/null
@@ -0,0 +1,195 @@
+package com.farmerbb.taskbar.ui
+
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProviderInfo
+import android.content.ComponentName
+import android.content.Context
+import android.content.SharedPreferences
+import android.content.pm.ActivityInfo
+import android.os.Process
+import android.view.View
+import android.widget.LinearLayout
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.Constants.DEFAULT_TEST_CELL_ID
+import com.farmerbb.taskbar.Constants.TEST_LABEL
+import com.farmerbb.taskbar.Constants.TEST_NAME
+import com.farmerbb.taskbar.Constants.TEST_PACKAGE
+import com.farmerbb.taskbar.Constants.UNSUPPORTED
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.helper.LauncherHelper
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.util.TaskbarPosition
+import com.farmerbb.taskbar.util.U
+import org.junit.*
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.shadows.AppWidgetProviderInfoBuilder
+import org.robolectric.shadows.ShadowToast
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*", "com.farmerbb.taskbar.shadow.*")
+@PrepareForTest(value = [U::class, TaskbarPosition::class, DashboardController::class, LauncherHelper::class])
+class DashboardControllerTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var uiController: DashboardController? = null
+    private var context: Context? = null
+    private var prefs: SharedPreferences? = null
+    private val host: UIHost = MockUIHost()
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        uiController = DashboardController(context)
+        prefs = U.getSharedPreferences(context)
+        uiController!!.onCreateHost(host)
+    }
+
+    @After
+    fun tearDown() {
+        uiController!!.onDestroyHost(host)
+        prefs!!.edit().remove(com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_TUTORIAL_SHOWN).apply()
+    }
+
+    @Test
+    fun testUpdatePaddingSize() {
+        val paddingDefault = Int.MAX_VALUE
+        val layout = LinearLayout(context)
+        layout.setPadding(paddingDefault, paddingDefault, paddingDefault, paddingDefault)
+        uiController!!.updatePaddingSize(context, layout, UNSUPPORTED)
+        verifyViewPadding(layout, paddingDefault, paddingDefault, paddingDefault, paddingDefault)
+        val paddingSize = context!!.resources.getDimensionPixelSize(R.dimen.tb_icon_size)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_LEFT)
+        verifyViewPadding(layout, paddingSize, 0, 0, 0)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+        verifyViewPadding(layout, paddingSize, 0, 0, 0)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_TOP_LEFT)
+        verifyViewPadding(layout, 0, paddingSize, 0, 0)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_TOP_RIGHT)
+        verifyViewPadding(layout, 0, paddingSize, 0, 0)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_RIGHT)
+        verifyViewPadding(layout, 0, 0, paddingSize, 0)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+        verifyViewPadding(layout, 0, 0, paddingSize, 0)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_LEFT)
+        verifyViewPadding(layout, 0, 0, 0, paddingSize)
+        uiController!!.updatePaddingSize(context, layout, com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_RIGHT)
+        verifyViewPadding(layout, 0, 0, 0, paddingSize)
+    }
+
+    @Test
+    fun testShouldSendDisappearingBroadcast() {
+        val helper = PowerMockito.mock(LauncherHelper::class.java)
+        val isOnSecondaryHomeScreenAnswer = BooleanAnswer()
+        PowerMockito.`when`(helper.isOnSecondaryHomeScreen(context))
+                .thenAnswer(isOnSecondaryHomeScreenAnswer)
+        PowerMockito.mockStatic(LauncherHelper::class.java)
+        PowerMockito.`when`(LauncherHelper.getInstance()).thenReturn(helper)
+        isOnSecondaryHomeScreenAnswer.answer = true
+        prefs!!.edit().putBoolean(com.farmerbb.taskbar.util.Constants.PREF_DONT_STOP_DASHBOARD, true).apply()
+        Assert.assertFalse(uiController!!.shouldSendDisappearingBroadcast(context, prefs))
+        isOnSecondaryHomeScreenAnswer.answer = true
+        prefs!!.edit().putBoolean(com.farmerbb.taskbar.util.Constants.PREF_DONT_STOP_DASHBOARD, false).apply()
+        Assert.assertTrue(uiController!!.shouldSendDisappearingBroadcast(context, prefs))
+        isOnSecondaryHomeScreenAnswer.answer = false
+        prefs!!.edit().putBoolean(com.farmerbb.taskbar.util.Constants.PREF_DONT_STOP_DASHBOARD, true).apply()
+        Assert.assertTrue(uiController!!.shouldSendDisappearingBroadcast(context, prefs))
+        isOnSecondaryHomeScreenAnswer.answer = false
+        prefs!!.edit().putBoolean(com.farmerbb.taskbar.util.Constants.PREF_DONT_STOP_DASHBOARD, false).apply()
+        Assert.assertTrue(uiController!!.shouldSendDisappearingBroadcast(context, prefs))
+    }
+
+    @Test
+    fun testSaveWidgetInfo() {
+        val info = AppWidgetProviderInfo()
+        info.provider = ComponentName(TEST_PACKAGE, TEST_NAME)
+        val cellId: Int = DEFAULT_TEST_CELL_ID
+        val appWidgetId = 100
+        prefs!!.edit().putString(uiController!!.generateProviderPlaceholderPrefKey(cellId), "").apply()
+        uiController!!.saveWidgetInfo(context, info, cellId, appWidgetId)
+        Assert.assertEquals(
+                appWidgetId.toLong(),
+                prefs!!.getInt(com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PREFIX + cellId, -1)
+                        .toLong())
+        Assert.assertEquals(
+                info.provider.flattenToString(),
+                prefs!!.getString(uiController!!.generateProviderPrefKey(cellId), "")
+        )
+        Assert.assertFalse(prefs!!.contains(uiController!!.generateProviderPlaceholderPrefKey(cellId)))
+    }
+
+    @Test
+    fun testShowDashboardTutorialToast() {
+        prefs!!.edit().putBoolean(com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_TUTORIAL_SHOWN, true).apply()
+        uiController!!.showDashboardTutorialToast(context)
+        Assert.assertNull(ShadowToast.getTextOfLatestToast())
+        prefs!!.edit().putBoolean(com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_TUTORIAL_SHOWN, false).apply()
+        uiController!!.showDashboardTutorialToast(context)
+        Assert.assertTrue(prefs!!.getBoolean(com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_TUTORIAL_SHOWN, false))
+        val toastText = ShadowToast.getTextOfLatestToast()
+        Assert.assertEquals(context!!.getString(R.string.tb_dashboard_tutorial, toastText), toastText)
+    }
+
+    @Test
+    fun testGenerateProviderPrefKey() {
+        Assert.assertEquals(
+                com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PREFIX
+                        + DEFAULT_TEST_CELL_ID
+                        + com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PROVIDER_SUFFIX,
+                uiController!!.generateProviderPrefKey(DEFAULT_TEST_CELL_ID)
+        )
+    }
+
+    @Test
+    fun testGenerateProviderPlaceholderPrefKey() {
+        Assert.assertEquals(
+                com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PREFIX
+                        + DEFAULT_TEST_CELL_ID
+                        + com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD_WIDGET_PLACEHOLDER_SUFFIX,
+                uiController!!.generateProviderPlaceholderPrefKey(DEFAULT_TEST_CELL_ID)
+        )
+    }
+
+    @Test
+    fun testShowPlaceholderToast() {
+        val appWidgetManager = AppWidgetManager.getInstance(context)
+        val cellId: Int = DEFAULT_TEST_CELL_ID
+        val providerPrefKey = uiController!!.generateProviderPrefKey(cellId)
+        val shadowAppWidgetManager = Shadows.shadowOf(appWidgetManager)
+        val providerInfo = ActivityInfo()
+        providerInfo.nonLocalizedLabel = TEST_LABEL
+        val info = AppWidgetProviderInfoBuilder.newBuilder().setProviderInfo(providerInfo).build()
+        info.provider = ComponentName(TEST_PACKAGE, TEST_NAME)
+        shadowAppWidgetManager.addInstalledProvidersForProfile(Process.myUserHandle(), info)
+        prefs!!.edit().putString(providerPrefKey, null).apply()
+        uiController!!.showPlaceholderToast(context, appWidgetManager, cellId, prefs)
+        Assert.assertNull(ShadowToast.getLatestToast())
+        prefs!!.edit().putString(providerPrefKey, com.farmerbb.taskbar.util.Constants.PREF_DEFAULT_NULL).apply()
+        uiController!!.showPlaceholderToast(context, appWidgetManager, cellId, prefs)
+        Assert.assertNull(ShadowToast.getLatestToast())
+        prefs!!
+                .edit()
+                .putString(providerPrefKey, info.provider.flattenToString() + UNSUPPORTED)
+                .apply()
+        uiController!!.showPlaceholderToast(context, appWidgetManager, cellId, prefs)
+        Assert.assertNull(ShadowToast.getLatestToast())
+        prefs!!.edit().putString(providerPrefKey, info.provider.flattenToString()).apply()
+        uiController!!.showPlaceholderToast(context, appWidgetManager, cellId, prefs)
+        val lastToast = ShadowToast.getTextOfLatestToast()
+        Assert.assertNotNull(lastToast)
+        val expectedText = context!!.getString(R.string.tb_widget_restore_toast, TEST_LABEL)
+        Assert.assertEquals(expectedText, lastToast)
+    }
+
+    private fun verifyViewPadding(view: View, left: Int, top: Int, right: Int, bottom: Int) {
+        Assert.assertEquals(left.toLong(), view.paddingLeft.toLong())
+        Assert.assertEquals(top.toLong(), view.paddingTop.toLong())
+        Assert.assertEquals(right.toLong(), view.paddingRight.toLong())
+        Assert.assertEquals(bottom.toLong(), view.paddingBottom.toLong())
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/MockUIHost.java b/app/src/test/java/com/farmerbb/taskbar/ui/MockUIHost.java
deleted file mode 100644 (file)
index 78e254f..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.view.View;
-
-public class MockUIHost implements UIHost {
-
-    @Override
-    public void addView(View view, ViewParams params) {}
-
-    @Override
-    public void removeView(View view) {}
-
-    @Override
-    public void terminate() {}
-
-    @Override
-    public void updateViewLayout(View view, ViewParams params) {}
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/MockUIHost.kt b/app/src/test/java/com/farmerbb/taskbar/ui/MockUIHost.kt
new file mode 100644 (file)
index 0000000..e40eb2a
--- /dev/null
@@ -0,0 +1,10 @@
+package com.farmerbb.taskbar.ui
+
+import android.view.View
+
+class MockUIHost : UIHost {
+    override fun addView(view: View, params: ViewParams) {}
+    override fun removeView(view: View) {}
+    override fun terminate() {}
+    override fun updateViewLayout(view: View, params: ViewParams) {}
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/StartMenuControllerTest.java b/app/src/test/java/com/farmerbb/taskbar/ui/StartMenuControllerTest.java
deleted file mode 100644 (file)
index 041950c..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.app.SearchManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.LauncherActivityInfo;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.os.UserManager;
-import android.view.Gravity;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.Constants;
-import com.farmerbb.taskbar.LauncherAppsHelper;
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.util.AppEntry;
-import com.farmerbb.taskbar.util.TaskbarPosition;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(value = {U.class, TaskbarPosition.class})
-public class StartMenuControllerTest {
-    private static final String NON_URL_QUERY = "test-query";
-
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private StartMenuController uiController;
-    private Context context;
-    private SharedPreferences prefs;
-    private final UIHost host = new MockUIHost();
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        uiController = new StartMenuController(context);
-        prefs = U.getSharedPreferences(context);
-
-        uiController.onCreateHost(host);
-    }
-
-    @After
-    public void tearDown() {
-        prefs.edit().remove(PREF_SHOW_SEARCH_BAR).apply();
-        uiController.onDestroyHost(host);
-    }
-
-    @Test
-    public void testShouldShowSearchBox() {
-        prefs.edit().remove(PREF_SHOW_SEARCH_BAR).apply();
-        assertTrue(uiController.shouldShowSearchBox(prefs, false));
-
-        prefs.edit().putString(PREF_SHOW_SEARCH_BAR, "always").apply();
-        assertTrue(uiController.shouldShowSearchBox(prefs, false));
-
-        prefs.edit().putString(PREF_SHOW_SEARCH_BAR, "keyboard").apply();
-        assertFalse(uiController.shouldShowSearchBox(prefs, false));
-        assertTrue(uiController.shouldShowSearchBox(prefs, true));
-
-        prefs.edit().putString(PREF_SHOW_SEARCH_BAR, "never").apply();
-        assertFalse(uiController.shouldShowSearchBox(prefs, true));
-
-        prefs.edit().putString(PREF_SHOW_SEARCH_BAR, Constants.UNSUPPORTED).apply();
-        assertFalse(uiController.shouldShowSearchBox(prefs, true));
-    }
-
-    @Test
-    public void testGetStartMenuLayoutId() {
-        assertEquals(
-                R.layout.tb_start_menu_left,
-                uiController.getStartMenuLayoutId(POSITION_BOTTOM_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_right,
-                uiController.getStartMenuLayoutId(POSITION_BOTTOM_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_top_left,
-                uiController.getStartMenuLayoutId(POSITION_TOP_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_vertical_left,
-                uiController.getStartMenuLayoutId(POSITION_TOP_VERTICAL_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_vertical_left,
-                uiController.getStartMenuLayoutId(POSITION_BOTTOM_VERTICAL_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_top_right,
-                uiController.getStartMenuLayoutId(POSITION_TOP_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_vertical_right,
-                uiController.getStartMenuLayoutId(POSITION_TOP_VERTICAL_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_start_menu_vertical_right,
-                uiController.getStartMenuLayoutId(POSITION_BOTTOM_VERTICAL_RIGHT)
-        );
-    }
-
-    @Test
-    public void testGetStartMenuGravity() {
-        assertEquals(
-                Gravity.BOTTOM | Gravity.LEFT,
-                uiController.getStartMenuGravity(POSITION_BOTTOM_LEFT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.LEFT,
-                uiController.getStartMenuGravity(POSITION_BOTTOM_VERTICAL_LEFT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.RIGHT,
-                uiController.getStartMenuGravity(POSITION_BOTTOM_RIGHT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.RIGHT,
-                uiController.getStartMenuGravity(POSITION_BOTTOM_VERTICAL_RIGHT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.LEFT,
-                uiController.getStartMenuGravity(POSITION_TOP_LEFT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.LEFT,
-                uiController.getStartMenuGravity(POSITION_TOP_VERTICAL_LEFT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.RIGHT,
-                uiController.getStartMenuGravity(POSITION_TOP_RIGHT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.RIGHT,
-                uiController.getStartMenuGravity(POSITION_TOP_VERTICAL_RIGHT)
-        );
-    }
-
-    @Test
-    public void testGenerateQueryWebSearchIntent() {
-        Intent intent = uiController.generateQueryWebSearchIntent(NON_URL_QUERY);
-        assertEquals(Intent.ACTION_WEB_SEARCH, intent.getAction());
-        assertEquals(NON_URL_QUERY, intent.getStringExtra(SearchManager.QUERY));
-        assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, intent.getFlags());
-
-        String urlQuery = "https://github.com/farmerbb/Taskbar";
-        intent = uiController.generateQueryWebSearchIntent(urlQuery);
-        assertEquals(Intent.ACTION_VIEW, intent.getAction());
-        assertEquals(Uri.parse(urlQuery), intent.getData());
-        assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, intent.getFlags());
-    }
-
-    @Test
-    public void testGenerateQueryGoogleIntent() {
-        Intent intent = uiController.generateQueryGoogleIntent(NON_URL_QUERY);
-        assertEquals(Intent.ACTION_VIEW, intent.getAction());
-        assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, intent.getFlags());
-        Uri uri = intent.getData();
-        assertEquals("https", uri.getScheme());
-        assertEquals("www.google.com", uri.getAuthority());
-        assertEquals("/search", uri.getPath());
-        assertEquals(NON_URL_QUERY, uri.getQueryParameter("q"));
-    }
-
-    @Test
-    public void testGenerateAppEntries() {
-        List<LauncherActivityInfo> queryList = new ArrayList<>();
-        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        PackageManager packageManager = context.getPackageManager();
-
-        List<AppEntry> appEntries =
-                uiController.generateAppEntries(context, userManager, packageManager, queryList);
-        assertEquals(0, appEntries.size());
-
-        ActivityInfo activityInfo = new ActivityInfo();
-        activityInfo.packageName = Constants.TEST_PACKAGE;
-        activityInfo.name = Constants.TEST_LABEL;
-        activityInfo.nonLocalizedLabel = activityInfo.name;
-        activityInfo.applicationInfo = new ApplicationInfo();
-        activityInfo.applicationInfo.packageName = activityInfo.packageName;
-        LauncherActivityInfo launcherActivityInfo =
-                LauncherAppsHelper
-                        .generateTestLauncherActivityInfo(
-                                context, activityInfo, Constants.DEFAULT_TEST_USER_ID
-                        );
-        queryList.add(launcherActivityInfo);
-        appEntries =
-                uiController.generateAppEntries(context, userManager, packageManager, queryList);
-        assertEquals(1, appEntries.size());
-        verifyAppEntryContent(activityInfo, appEntries.get(0));
-
-        queryList.add(launcherActivityInfo);
-        appEntries =
-                uiController.generateAppEntries(context, userManager, packageManager, queryList);
-        assertEquals(2, appEntries.size());
-
-        verifyAppEntryContent(activityInfo, appEntries.get(0));
-        verifyAppEntryContent(activityInfo, appEntries.get(1));
-    }
-
-    private void verifyAppEntryContent(ActivityInfo activityInfo, AppEntry appEntry) {
-        assertEquals(activityInfo.nonLocalizedLabel, appEntry.getLabel());
-        assertEquals(activityInfo.packageName, appEntry.getPackageName());
-        ComponentName componentNameOne =
-                new ComponentName(activityInfo.packageName, activityInfo.name);
-        assertEquals(componentNameOne.flattenToString(), appEntry.getComponentName());
-        assertEquals(Constants.DEFAULT_TEST_USER_ID, appEntry.getUserId(context));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/StartMenuControllerTest.kt b/app/src/test/java/com/farmerbb/taskbar/ui/StartMenuControllerTest.kt
new file mode 100644 (file)
index 0000000..6747406
--- /dev/null
@@ -0,0 +1,204 @@
+package com.farmerbb.taskbar.ui
+
+import android.app.SearchManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import android.content.pm.ActivityInfo
+import android.content.pm.ApplicationInfo
+import android.content.pm.LauncherActivityInfo
+import android.net.Uri
+import android.os.UserManager
+import android.view.Gravity
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.Constants
+import com.farmerbb.taskbar.LauncherAppsHelper.generateTestLauncherActivityInfo
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.util.AppEntry
+import com.farmerbb.taskbar.util.TaskbarPosition
+import com.farmerbb.taskbar.util.U
+import org.junit.*
+import org.junit.runner.RunWith
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+import java.util.*
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(value = [U::class, TaskbarPosition::class])
+class StartMenuControllerTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var uiController: StartMenuController? = null
+    private var context: Context? = null
+    private var prefs: SharedPreferences? = null
+    private val host: UIHost = MockUIHost()
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        uiController = StartMenuController(context)
+        prefs = U.getSharedPreferences(context)
+        uiController!!.onCreateHost(host)
+    }
+
+    @After
+    fun tearDown() {
+        prefs!!.edit().remove(com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR).apply()
+        uiController!!.onDestroyHost(host)
+    }
+
+    @Test
+    fun testShouldShowSearchBox() {
+        prefs!!.edit().remove(com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR).apply()
+        Assert.assertTrue(uiController!!.shouldShowSearchBox(prefs, false))
+        prefs!!.edit().putString(com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR, "always").apply()
+        Assert.assertTrue(uiController!!.shouldShowSearchBox(prefs, false))
+        prefs!!.edit().putString(com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR, "keyboard").apply()
+        Assert.assertFalse(uiController!!.shouldShowSearchBox(prefs, false))
+        Assert.assertTrue(uiController!!.shouldShowSearchBox(prefs, true))
+        prefs!!.edit().putString(com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR, "never").apply()
+        Assert.assertFalse(uiController!!.shouldShowSearchBox(prefs, true))
+        prefs!!.edit().putString(com.farmerbb.taskbar.util.Constants.PREF_SHOW_SEARCH_BAR, Constants.UNSUPPORTED).apply()
+        Assert.assertFalse(uiController!!.shouldShowSearchBox(prefs, true))
+    }
+
+    @Test
+    fun testGetStartMenuLayoutId() {
+        Assert.assertEquals(
+                R.layout.tb_start_menu_left.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_right.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_top_left.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_TOP_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_vertical_left.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_vertical_left.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_top_right.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_TOP_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_vertical_right.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_start_menu_vertical_right.toLong(),
+                uiController!!.getStartMenuLayoutId(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+                        .toLong())
+    }
+
+    @Test
+    fun testGetStartMenuGravity() {
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.LEFT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.LEFT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.RIGHT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.RIGHT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.LEFT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_TOP_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.LEFT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.RIGHT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_TOP_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.RIGHT).toLong(),
+                uiController!!.getStartMenuGravity(com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_RIGHT)
+                        .toLong())
+    }
+
+    @Test
+    fun testGenerateQueryWebSearchIntent() {
+        var intent = uiController!!.generateQueryWebSearchIntent(NON_URL_QUERY)
+        Assert.assertEquals(Intent.ACTION_WEB_SEARCH, intent.action)
+        Assert.assertEquals(NON_URL_QUERY, intent.getStringExtra(SearchManager.QUERY))
+        Assert.assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK.toLong(), intent.flags.toLong())
+        val urlQuery = "https://github.com/farmerbb/Taskbar"
+        intent = uiController!!.generateQueryWebSearchIntent(urlQuery)
+        Assert.assertEquals(Intent.ACTION_VIEW, intent.action)
+        Assert.assertEquals(Uri.parse(urlQuery), intent.data)
+        Assert.assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK.toLong(), intent.flags.toLong())
+    }
+
+    @Test
+    fun testGenerateQueryGoogleIntent() {
+        val intent = uiController!!.generateQueryGoogleIntent(NON_URL_QUERY)
+        Assert.assertEquals(Intent.ACTION_VIEW, intent.action)
+        Assert.assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK.toLong(), intent.flags.toLong())
+        val uri = intent.data
+        Assert.assertEquals("https", uri!!.scheme)
+        Assert.assertEquals("www.google.com", uri.authority)
+        Assert.assertEquals("/search", uri.path)
+        Assert.assertEquals(NON_URL_QUERY, uri.getQueryParameter("q"))
+    }
+
+    @Test
+    fun testGenerateAppEntries() {
+        val queryList: MutableList<LauncherActivityInfo> = ArrayList()
+        val userManager = context!!.getSystemService(Context.USER_SERVICE) as UserManager
+        val packageManager = context!!.packageManager
+        var appEntries = uiController!!.generateAppEntries(context, userManager, packageManager, queryList)
+        Assert.assertEquals(0, appEntries.size.toLong())
+        val activityInfo = ActivityInfo()
+        activityInfo.packageName = Constants.TEST_PACKAGE
+        activityInfo.name = Constants.TEST_LABEL
+        activityInfo.nonLocalizedLabel = activityInfo.name
+        activityInfo.applicationInfo = ApplicationInfo()
+        activityInfo.applicationInfo.packageName = activityInfo.packageName
+        val launcherActivityInfo = generateTestLauncherActivityInfo(
+                context!!, activityInfo, Constants.DEFAULT_TEST_USER_ID
+        )
+        queryList.add(launcherActivityInfo)
+        appEntries = uiController!!.generateAppEntries(context, userManager, packageManager, queryList)
+        Assert.assertEquals(1, appEntries.size.toLong())
+        verifyAppEntryContent(activityInfo, appEntries[0])
+        queryList.add(launcherActivityInfo)
+        appEntries = uiController!!.generateAppEntries(context, userManager, packageManager, queryList)
+        Assert.assertEquals(2, appEntries.size.toLong())
+        verifyAppEntryContent(activityInfo, appEntries[0])
+        verifyAppEntryContent(activityInfo, appEntries[1])
+    }
+
+    private fun verifyAppEntryContent(activityInfo: ActivityInfo, appEntry: AppEntry) {
+        Assert.assertEquals(activityInfo.nonLocalizedLabel, appEntry.label)
+        Assert.assertEquals(activityInfo.packageName, appEntry.packageName)
+        val componentNameOne = ComponentName(activityInfo.packageName, activityInfo.name)
+        Assert.assertEquals(componentNameOne.flattenToString(), appEntry.componentName)
+        Assert.assertEquals(Constants.DEFAULT_TEST_USER_ID.toLong(), appEntry.getUserId(context))
+    }
+
+    companion object {
+        private const val NON_URL_QUERY = "test-query"
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/TaskbarControllerTest.java b/app/src/test/java/com/farmerbb/taskbar/ui/TaskbarControllerTest.java
deleted file mode 100644 (file)
index 72ee017..0000000
+++ /dev/null
@@ -1,860 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.app.AlarmManager;
-import android.app.usage.UsageEvents;
-import android.app.usage.UsageStatsManager;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.content.pm.LauncherActivityInfo;
-import android.content.pm.LauncherApps;
-import android.content.pm.PackageManager;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.Constants;
-import com.farmerbb.taskbar.LauncherAppsHelper;
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.activity.HomeActivity;
-import com.farmerbb.taskbar.activity.HomeActivityDelegate;
-import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
-import com.farmerbb.taskbar.activity.MainActivity;
-import com.farmerbb.taskbar.activity.SecondaryHomeActivity;
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.mockito.StringAnswer;
-import com.farmerbb.taskbar.shadow.TaskbarShadowScrollView;
-import com.farmerbb.taskbar.util.AppEntry;
-import com.farmerbb.taskbar.util.DisplayInfo;
-import com.farmerbb.taskbar.util.TaskbarPosition;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowLauncherApps;
-import org.robolectric.shadows.ShadowUsageStatsManager.EventBuilder;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static android.app.usage.UsageEvents.Event.MOVE_TO_BACKGROUND;
-import static android.app.usage.UsageEvents.Event.MOVE_TO_FOREGROUND;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_BOTTOM_VERTICAL_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_LEFT;
-import static com.farmerbb.taskbar.util.Constants.POSITION_TOP_VERTICAL_RIGHT;
-import static com.farmerbb.taskbar.util.Constants.PREF_BUTTON_BACK;
-import static com.farmerbb.taskbar.util.Constants.PREF_BUTTON_HOME;
-import static com.farmerbb.taskbar.util.Constants.PREF_BUTTON_RECENTS;
-import static com.farmerbb.taskbar.util.Constants.PREF_DASHBOARD;
-import static com.farmerbb.taskbar.util.Constants.PREF_HIDE_FOREGROUND;
-import static com.farmerbb.taskbar.util.Constants.PREF_RECENTS_AMOUNT;
-import static com.farmerbb.taskbar.util.Constants.PREF_RECENTS_AMOUNT_APP_START;
-import static com.farmerbb.taskbar.util.Constants.PREF_RECENTS_AMOUNT_RUNNING_APPS_ONLY;
-import static com.farmerbb.taskbar.util.Constants.PREF_RECENTS_AMOUNT_SHOW_ALL;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_BUTTON_IMAGE;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_BUTTON_IMAGE_APP_LOGO;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_BUTTON_IMAGE_CUSTOM;
-import static com.farmerbb.taskbar.util.Constants.PREF_START_BUTTON_IMAGE_DEFAULT;
-import static com.farmerbb.taskbar.util.Constants.PREF_TIME_OF_SERVICE_START;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.powermock.api.mockito.PowerMockito.when;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(value = {U.class, TaskbarPosition.class})
-public class TaskbarControllerTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private TaskbarController uiController;
-    private Context context;
-    SharedPreferences prefs;
-
-    private UIHost host = new MockUIHost();
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        uiController = new TaskbarController(context);
-        prefs = U.getSharedPreferences(context);
-
-        uiController.onCreateHost(host);
-    }
-
-    @After
-    public void tearDown() {
-        prefs.edit().remove(PREF_START_BUTTON_IMAGE).apply();
-
-        uiController.onDestroyHost(host);
-    }
-
-    @Test
-    public void testInitialization() {
-        assertNotNull(uiController);
-    }
-
-    @Test
-    public void testDrawStartButtonPadding() {
-        ImageView startButton = new ImageView(context);
-        prefs = U.getSharedPreferences(context);
-        prefs.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_DEFAULT).apply();
-        uiController.drawStartButton(context, startButton, prefs, Color.RED);
-        int padding =
-                context.getResources().getDimensionPixelSize(R.dimen.tb_app_drawer_icon_padding);
-        checkStartButtonPadding(padding, startButton);
-
-        PowerMockito.spy(U.class);
-        // Use bliss os logic to avoid using LauncherApps, that robolectric doesn't support
-        when(U.isBlissOs(context)).thenReturn(true);
-        prefs.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_APP_LOGO).apply();
-        uiController.drawStartButton(context, startButton, prefs, Color.RED);
-        padding =
-                context.getResources().getDimensionPixelSize(R.dimen.tb_app_drawer_icon_padding_alt);
-        checkStartButtonPadding(padding, startButton);
-
-        prefs.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_CUSTOM).apply();
-        uiController.drawStartButton(context, startButton, prefs, Color.RED);
-        padding = context.getResources().getDimensionPixelSize(R.dimen.tb_app_drawer_icon_padding);
-        checkStartButtonPadding(padding, startButton);
-
-        prefs.edit().putString(PREF_START_BUTTON_IMAGE, "non-support").apply();
-        uiController.drawStartButton(context, startButton, prefs, Color.RED);
-        checkStartButtonPadding(0, startButton);
-    }
-
-    @Test
-    public void testGetTaskbarGravity() {
-        assertEquals(
-                Gravity.BOTTOM | Gravity.LEFT,
-                uiController.getTaskbarGravity(POSITION_BOTTOM_LEFT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.LEFT,
-                uiController.getTaskbarGravity(POSITION_BOTTOM_VERTICAL_LEFT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.RIGHT,
-                uiController.getTaskbarGravity(POSITION_BOTTOM_RIGHT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.RIGHT,
-                uiController.getTaskbarGravity(POSITION_BOTTOM_VERTICAL_RIGHT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.LEFT,
-                uiController.getTaskbarGravity(POSITION_TOP_LEFT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.LEFT,
-                uiController.getTaskbarGravity(POSITION_TOP_VERTICAL_LEFT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.RIGHT,
-                uiController.getTaskbarGravity(POSITION_TOP_RIGHT)
-        );
-        assertEquals(
-                Gravity.TOP | Gravity.RIGHT,
-                uiController.getTaskbarGravity(POSITION_TOP_VERTICAL_RIGHT)
-        );
-        assertEquals(
-                Gravity.BOTTOM | Gravity.LEFT,
-                uiController.getTaskbarGravity(Constants.UNSUPPORTED)
-        );
-    }
-
-    @Test
-    public void testGetTaskbarLayoutId() {
-        assertEquals(
-                R.layout.tb_taskbar_left,
-                uiController.getTaskbarLayoutId(POSITION_BOTTOM_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_vertical,
-                uiController.getTaskbarLayoutId(POSITION_BOTTOM_VERTICAL_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_right,
-                uiController.getTaskbarLayoutId(POSITION_BOTTOM_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_vertical,
-                uiController.getTaskbarLayoutId(POSITION_BOTTOM_VERTICAL_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_left,
-                uiController.getTaskbarLayoutId(POSITION_TOP_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_top_vertical,
-                uiController.getTaskbarLayoutId(POSITION_TOP_VERTICAL_LEFT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_right,
-                uiController.getTaskbarLayoutId(POSITION_TOP_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_top_vertical,
-                uiController.getTaskbarLayoutId(POSITION_TOP_VERTICAL_RIGHT)
-        );
-        assertEquals(
-                R.layout.tb_taskbar_left,
-                uiController.getTaskbarLayoutId(Constants.UNSUPPORTED)
-        );
-    }
-
-    @Test
-    public void testDrawDashboardButtonWithDefaultConfig() {
-        prefs.edit().remove(PREF_DASHBOARD).apply();
-        checkDashboardEnabled(false);
-    }
-
-    @Test
-    @Config(qualifiers = "sw540dp")
-    public void testDrawDashboardButtonWithDefaultConfigForSw540dp() {
-        prefs.edit().remove(PREF_DASHBOARD).apply();
-        checkDashboardEnabled(false);
-    }
-
-    @Test
-    @Config(qualifiers = "sw720dp")
-    public void testDrawDashboardButtonWithDefaultConfigForSw720dp() {
-        prefs.edit().remove(PREF_DASHBOARD).apply();
-        checkDashboardEnabled(true);
-    }
-
-    @Test
-    public void testDrawDashboardButtonForDashboardButton() {
-        int accentColor = Color.RED;
-        int layoutId = uiController.getTaskbarLayoutId(POSITION_BOTTOM_LEFT);
-        LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(layoutId, null);
-        FrameLayout dashboardButton = layout.findViewById(R.id.dashboard_button);
-
-        prefs.edit().putBoolean(PREF_DASHBOARD, false).apply();
-        boolean dashboardEnabled =
-                uiController.drawDashboardButton(context, layout, dashboardButton, accentColor);
-        assertFalse(dashboardEnabled);
-        assertEquals(View.GONE, dashboardButton.getVisibility());
-
-        prefs.edit().putBoolean(PREF_DASHBOARD, true).apply();
-        dashboardEnabled =
-                uiController.drawDashboardButton(context, layout, dashboardButton, accentColor);
-        assertTrue(dashboardEnabled);
-        assertTrue(dashboardButton.hasOnClickListeners());
-        assertEquals(View.VISIBLE, dashboardButton.getVisibility());
-        Drawable drawable = layout.findViewById(R.id.square1).getBackground();
-        checkDrawableBackgroundColor(drawable, accentColor);
-        drawable = layout.findViewById(R.id.square2).getBackground();
-        checkDrawableBackgroundColor(drawable, accentColor);
-        drawable = layout.findViewById(R.id.square3).getBackground();
-        checkDrawableBackgroundColor(drawable, accentColor);
-        drawable = layout.findViewById(R.id.square4).getBackground();
-        checkDrawableBackgroundColor(drawable, accentColor);
-        drawable = layout.findViewById(R.id.square5).getBackground();
-        checkDrawableBackgroundColor(drawable, accentColor);
-        drawable = layout.findViewById(R.id.square6).getBackground();
-        checkDrawableBackgroundColor(drawable, accentColor);
-    }
-
-    @Test
-    public void testDrawNavbarButtons() {
-        int layoutId = uiController.getTaskbarLayoutId(POSITION_BOTTOM_LEFT);
-        LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(layoutId, null);
-        prefs.edit()
-                .remove(PREF_BUTTON_BACK)
-                .remove(PREF_BUTTON_HOME)
-                .remove(PREF_BUTTON_RECENTS)
-                .apply();
-        assertFalse(uiController.drawNavbarButtons(context, layout, prefs, Color.RED));
-
-        prefs.edit().putBoolean(PREF_BUTTON_BACK, true).apply();
-        assertTrue(uiController.drawNavbarButtons(context, layout, prefs, Color.RED));
-        assertEquals(View.VISIBLE, layout.findViewById(R.id.button_back).getVisibility());
-        prefs.edit().remove(PREF_BUTTON_BACK).apply();
-
-        prefs.edit().putBoolean(PREF_BUTTON_HOME, true).apply();
-        assertTrue(uiController.drawNavbarButtons(context, layout, prefs, Color.RED));
-        assertEquals(View.VISIBLE, layout.findViewById(R.id.button_home).getVisibility());
-        prefs.edit().remove(PREF_BUTTON_HOME).apply();
-
-        prefs.edit().putBoolean(PREF_BUTTON_RECENTS, true).apply();
-        assertTrue(uiController.drawNavbarButtons(context, layout, prefs, Color.RED));
-        assertEquals(View.VISIBLE, layout.findViewById(R.id.button_recents).getVisibility());
-        prefs.edit().remove(PREF_BUTTON_RECENTS).apply();
-    }
-
-    @Test
-    public void testGetSearchInterval() {
-        long permitTimeDeltaMillis = 100;
-        prefs.edit().remove(PREF_RECENTS_AMOUNT).apply();
-        long searchInterval = uiController.getSearchInterval(prefs);
-        long lastDayTime = System.currentTimeMillis() - AlarmManager.INTERVAL_DAY;
-        assertEquals(lastDayTime, searchInterval, permitTimeDeltaMillis);
-
-        prefs.edit().putString(PREF_RECENTS_AMOUNT, PREF_RECENTS_AMOUNT_APP_START).apply();
-        long deviceStartTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
-        // The service start time is larger than device start time
-        long appStartTime = deviceStartTime * 2;
-        prefs.edit().putLong(PREF_TIME_OF_SERVICE_START, appStartTime).apply();
-        searchInterval = uiController.getSearchInterval(prefs);
-        assertEquals(appStartTime, searchInterval);
-
-        // The service start time is smaller than device start time
-        prefs.edit().putLong(PREF_TIME_OF_SERVICE_START, deviceStartTime - 100).apply();
-        searchInterval = uiController.getSearchInterval(prefs);
-        deviceStartTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
-        assertEquals(deviceStartTime, searchInterval, permitTimeDeltaMillis);
-        prefs.edit().remove(PREF_TIME_OF_SERVICE_START).apply();
-
-        prefs.edit().putString(PREF_RECENTS_AMOUNT, PREF_RECENTS_AMOUNT_SHOW_ALL).apply();
-        searchInterval = uiController.getSearchInterval(prefs);
-        assertEquals(0, searchInterval);
-
-        prefs.edit().putString(PREF_RECENTS_AMOUNT, PREF_RECENTS_AMOUNT_RUNNING_APPS_ONLY).apply();
-        searchInterval = uiController.getSearchInterval(prefs);
-        assertEquals(-1, searchInterval);
-
-        prefs.edit().putString(PREF_RECENTS_AMOUNT, Constants.UNSUPPORTED).apply();
-        searchInterval = uiController.getSearchInterval(prefs);
-        assertEquals(-1, searchInterval);
-
-        prefs.edit().remove(PREF_RECENTS_AMOUNT).apply();
-    }
-
-    @Test
-    public void testDrawSysTrayOnClickListener() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer isLibraryAnswer = new BooleanAnswer();
-        when(U.isLibrary(context)).thenAnswer(isLibraryAnswer);
-
-        isLibraryAnswer.answer = true;
-        LinearLayout sysTrayLayout = initializeSysTrayLayout(POSITION_BOTTOM_RIGHT);
-        assertFalse(sysTrayLayout.hasOnClickListeners());
-
-        isLibraryAnswer.answer = false;
-        sysTrayLayout = initializeSysTrayLayout(POSITION_BOTTOM_RIGHT);
-        assertTrue(sysTrayLayout.hasOnClickListeners());
-    }
-
-    @Test
-    public void testDrawSysTrayParentLayoutVisibility() {
-        LinearLayout sysTrayLayout = initializeSysTrayLayout(POSITION_BOTTOM_RIGHT);
-        ViewGroup parent = (ViewGroup) sysTrayLayout.getParent();
-        assertEquals(View.VISIBLE, parent.getVisibility());
-    }
-
-    @Test
-    public void testDrawSysTrayGravity() {
-        checkDrawSysTrayGravity(POSITION_BOTTOM_LEFT, Gravity.END);
-        checkDrawSysTrayGravity(POSITION_BOTTOM_RIGHT, Gravity.START);
-    }
-
-    @Test
-    public void testDrawSysTrayTime() {
-        checkDrawSysTrayTimeVisibility(POSITION_BOTTOM_LEFT, R.id.time_right);
-        checkDrawSysTrayTimeVisibility(POSITION_BOTTOM_RIGHT, R.id.time_left);
-    }
-
-    @Test
-    public void testCalculateScrollViewParams() {
-        BooleanAnswer isVerticalAnswer = new BooleanAnswer();
-        PowerMockito.spy(TaskbarPosition.class);
-        when(TaskbarPosition.isVertical(context)).thenAnswer(isVerticalAnswer);
-
-        DisplayInfo display = U.getDisplayInfo(context, true);
-        int dividerSize = context.getResources().getDimensionPixelSize(R.dimen.tb_divider_size);
-
-        int defaultSize = -1;
-        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(defaultSize, defaultSize);
-        int iconSize = context.getResources().getDimensionPixelSize(R.dimen.tb_icon_size);
-
-        isVerticalAnswer.answer = true;
-        int maxScreenSize =
-                Math.max(
-                        0,
-                        display.height
-                                - U.getStatusBarHeight(context)
-                                - Math.round(U.getBaseTaskbarSize(context))
-                );
-
-        uiController.calculateScrollViewParams(context, prefs, params, true, 1);
-        assertEquals(defaultSize, params.width);
-        assertEquals(maxScreenSize + dividerSize, params.height);
-        params.height = defaultSize;
-
-        uiController.calculateScrollViewParams(context, prefs, params, false, 1);
-        assertEquals(defaultSize, params.width);
-        assertEquals(iconSize + dividerSize, params.height);
-        params.height = defaultSize;
-
-        uiController.calculateScrollViewParams(context, prefs, params, false, 10000);
-        assertEquals(defaultSize, params.width);
-        assertEquals(maxScreenSize + dividerSize, params.height);
-        params.height = defaultSize;
-
-        isVerticalAnswer.answer = false;
-        maxScreenSize = Math.max(0, display.width - Math.round(U.getBaseTaskbarSize(context)));
-
-        uiController.calculateScrollViewParams(context, prefs, params, true, 1);
-        assertEquals(maxScreenSize + dividerSize, params.width);
-        assertEquals(defaultSize, params.height);
-        params.width = defaultSize;
-
-        uiController.calculateScrollViewParams(context, prefs, params, false, 1);
-        assertEquals(iconSize + dividerSize, params.width);
-        assertEquals(defaultSize, params.height);
-        params.width = defaultSize;
-
-        uiController.calculateScrollViewParams(context, prefs, params, false, 10000);
-        assertEquals(maxScreenSize + dividerSize, params.width);
-        assertEquals(defaultSize, params.height);
-    }
-
-    @Test
-    public void testScrollTaskbarForScrollViewVisibility() {
-        int layoutId = uiController.getTaskbarLayoutId(POSITION_BOTTOM_LEFT);
-        LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(layoutId, null);
-        FrameLayout scrollView = layout.findViewById(R.id.taskbar_scrollview);
-        LinearLayout taskbar = layout.findViewById(R.id.taskbar);
-        uiController.scrollTaskbar(scrollView, taskbar, POSITION_BOTTOM_LEFT, "false", false);
-        assertEquals(View.GONE, scrollView.getVisibility());
-
-        uiController.scrollTaskbar(scrollView, taskbar, POSITION_BOTTOM_LEFT, "false", true);
-        assertEquals(View.VISIBLE, scrollView.getVisibility());
-    }
-
-    @Test
-    @Config(shadows = {TaskbarShadowScrollView.class})
-    public void testScrollTaskbarForScrollViewLocation() {
-        // We only provide enhanced ShadowScrollView with scrollTo supported, so we should
-        // choose the layout uses the ScrollView instead of HorizontalScrollView.
-        String taskbarPosition = POSITION_BOTTOM_VERTICAL_LEFT;
-        int layoutId = uiController.getTaskbarLayoutId(taskbarPosition);
-        LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(layoutId, null);
-        FrameLayout scrollView = layout.findViewById(R.id.taskbar_scrollview);
-        LinearLayout taskbar = layout.findViewById(R.id.taskbar);
-        int taskbarWidth = 200;
-        int taskbarHeight = 50;
-        // Change LayoutParams doesn't work with robolectric, so we should use reflection
-        // to change the location directly.
-        ReflectionHelpers.setField(taskbar, "mLeft", 0);
-        ReflectionHelpers.setField(taskbar, "mTop", 0);
-        ReflectionHelpers.setField(taskbar, "mRight", taskbarWidth);
-        ReflectionHelpers.setField(taskbar, "mBottom", taskbarHeight);
-
-        BooleanAnswer isVerticalAnswer = new BooleanAnswer();
-        PowerMockito.spy(TaskbarPosition.class);
-        when(TaskbarPosition.isVertical(taskbarPosition)).thenAnswer(isVerticalAnswer);
-
-        isVerticalAnswer.answer = false;
-        uiController.scrollTaskbar(scrollView, taskbar, taskbarPosition, "false", true);
-        assertEquals(0, scrollView.getScrollX());
-        assertEquals(0, scrollView.getScrollY());
-        uiController.scrollTaskbar(scrollView, taskbar, taskbarPosition, "true", true);
-        assertEquals(taskbarWidth, scrollView.getScrollX());
-        assertEquals(taskbarHeight, scrollView.getScrollY());
-
-        isVerticalAnswer.answer = true;
-        uiController.scrollTaskbar(scrollView, taskbar, taskbarPosition, "true", true);
-        assertEquals(0, scrollView.getScrollX());
-        assertEquals(0, scrollView.getScrollY());
-        uiController.scrollTaskbar(scrollView, taskbar, taskbarPosition, "false", true);
-        assertEquals(taskbarWidth, scrollView.getScrollX());
-        assertEquals(taskbarHeight, scrollView.getScrollY());
-    }
-
-    @Test
-    public void testFilterForegroundApp() {
-        prefs.edit().putBoolean(PREF_HIDE_FOREGROUND, true).apply();
-
-        long searchInterval = 0L;
-        List<String> applicationIdsToRemove = new ArrayList<>();
-        UsageStatsManager usageStatsManager =
-                (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
-        final String entryTestPackage1 = Constants.TEST_PACKAGE + "-1";
-        UsageEvents.Event event =
-                EventBuilder
-                        .buildEvent()
-                        .setEventType(MOVE_TO_FOREGROUND)
-                        .setTimeStamp(100L)
-                        .setPackage(entryTestPackage1)
-                        .build();
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(entryTestPackage1, applicationIdsToRemove.remove(0));
-
-        event =
-                EventBuilder
-                        .buildEvent()
-                        .setEventType(MOVE_TO_BACKGROUND)
-                        .setTimeStamp(200L)
-                        .setPackage(Constants.TEST_PACKAGE + "-2")
-                        .build();
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(entryTestPackage1, applicationIdsToRemove.remove(0));
-
-        event = buildTaskbarForegroundAppEvent(MainActivity.class.getCanonicalName(), 300L);
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(MainActivity.class.getCanonicalName(), applicationIdsToRemove.remove(0));
-
-        event = buildTaskbarForegroundAppEvent(HomeActivity.class.getCanonicalName(), 400L);
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(HomeActivity.class.getCanonicalName(), applicationIdsToRemove.remove(0));
-
-        event = buildTaskbarForegroundAppEvent(HomeActivityDelegate.class.getCanonicalName(), 500L);
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(HomeActivityDelegate.class.getCanonicalName(), applicationIdsToRemove.remove(0));
-
-        event = buildTaskbarForegroundAppEvent(SecondaryHomeActivity.class.getCanonicalName(), 600L);
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(SecondaryHomeActivity.class.getCanonicalName(), applicationIdsToRemove.remove(0));
-
-        event = buildTaskbarForegroundAppEvent(InvisibleActivityFreeform.class.getCanonicalName(), 700L);
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(InvisibleActivityFreeform.class.getCanonicalName(), applicationIdsToRemove.remove(0));
-
-        event = buildTaskbarForegroundAppEvent(Constants.UNSUPPORTED, 800L);
-        shadowOf(usageStatsManager).addEvent(event);
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(Constants.UNSUPPORTED, applicationIdsToRemove.remove(0));
-
-        prefs.edit().remove(PREF_HIDE_FOREGROUND).apply();
-        uiController.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove);
-        assertEquals(0, applicationIdsToRemove.size());
-    }
-
-    @Test
-    public void testNeedToReverseOrder() {
-        PowerMockito.spy(TaskbarPosition.class);
-        StringAnswer positionAnswer = new StringAnswer();
-        when(TaskbarPosition.getTaskbarPosition(context)).thenAnswer(positionAnswer);
-
-        List<String> positions = new ArrayList<>();
-        positions.add(POSITION_BOTTOM_LEFT);
-        positions.add(POSITION_BOTTOM_RIGHT);
-        positions.add(POSITION_BOTTOM_VERTICAL_LEFT);
-        positions.add(POSITION_BOTTOM_VERTICAL_RIGHT);
-        positions.add(POSITION_TOP_LEFT);
-        positions.add(POSITION_TOP_RIGHT);
-        positions.add(POSITION_TOP_VERTICAL_LEFT);
-        positions.add(POSITION_TOP_VERTICAL_RIGHT);
-        positions.add(Constants.UNSUPPORTED);
-
-        String sortOrder = "false";
-        for (String position : positions) {
-            positionAnswer.answer = position;
-            if (POSITION_BOTTOM_RIGHT.equals(position) || POSITION_TOP_RIGHT.equals(position)) {
-                assertTrue(uiController.needToReverseOrder(context, sortOrder));
-            } else {
-                assertFalse(uiController.needToReverseOrder(context, sortOrder));
-            }
-        }
-
-        sortOrder = "true";
-        for (String position : positions) {
-            positionAnswer.answer = position;
-            if (POSITION_BOTTOM_RIGHT.equals(position) || POSITION_TOP_RIGHT.equals(position)) {
-                assertFalse(uiController.needToReverseOrder(context, sortOrder));
-            } else {
-                assertTrue(uiController.needToReverseOrder(context, sortOrder));
-            }
-        }
-
-        sortOrder = Constants.UNSUPPORTED;
-        for (String position : positions) {
-            positionAnswer.answer = position;
-            assertFalse(uiController.needToReverseOrder(context, sortOrder));
-        }
-    }
-
-    @Test
-    public void testFilterRealPinnedApps() {
-        List<AppEntry> pinnedApps = new ArrayList<>();
-        List<AppEntry> entries = new ArrayList<>();
-        List<String> applicationIdsToRemove = new ArrayList<>();
-
-        int realNumOfPinnedApps = uiController.filterRealPinnedApps(
-                context, pinnedApps, entries, applicationIdsToRemove
-        );
-        assertEquals(0, realNumOfPinnedApps);
-
-        LauncherApps launcherApps =
-                (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
-        ShadowLauncherApps shadowLauncherApps = shadowOf(launcherApps);
-        AppEntry appEntry = generateTestAppEntry(1);
-        pinnedApps.add(appEntry);
-        shadowLauncherApps
-                .addEnabledPackage(
-                        UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_ID),
-                        appEntry.getPackageName()
-                );
-        realNumOfPinnedApps = uiController.filterRealPinnedApps(
-                context, pinnedApps, entries, applicationIdsToRemove
-        );
-        assertEquals(1, realNumOfPinnedApps);
-        assertEquals(appEntry.getPackageName(), applicationIdsToRemove.get(0));
-        assertEquals(appEntry, entries.get(0));
-        applicationIdsToRemove.clear();
-        entries.clear();
-
-        appEntry = generateTestAppEntry(2);
-        pinnedApps.add(appEntry);
-        realNumOfPinnedApps = uiController.filterRealPinnedApps(
-                context, pinnedApps, entries, applicationIdsToRemove
-        );
-        assertEquals(1, realNumOfPinnedApps);
-        assertEquals(2, applicationIdsToRemove.size());
-        assertEquals(1, entries.size());
-    }
-
-    @Test
-    public void testGenerateAppEntries() {
-        List<AppEntry> usageStatsList = new ArrayList<>();
-        List<AppEntry> entries = new ArrayList<>();
-        List<LauncherActivityInfo> launcherAppCache = new ArrayList<>();
-
-        uiController.generateAppEntries(context, -1, usageStatsList, entries, launcherAppCache);
-        assertEquals(0, entries.size());
-
-        uiController.generateAppEntries(context, 0, usageStatsList, entries, launcherAppCache);
-        assertEquals(0, entries.size());
-
-        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        shadowOf(userManager)
-                .addUserProfile(UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_ID));
-        shadowOf(userManager)
-                .addUserProfile(
-                        UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_PROFILE_ID)
-                );
-        LauncherApps launcherApps =
-                (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
-        ShadowLauncherApps shadowLauncherApps = Shadows.shadowOf(launcherApps);
-
-        AppEntry appEntry = generateTestAppEntry(0);
-        usageStatsList.add(appEntry);
-        uiController.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache);
-        assertEquals(0, entries.size());
-
-        ActivityInfo info = new ActivityInfo();
-        info.packageName = appEntry.getPackageName();
-        info.name = appEntry.getLabel();
-        info.nonLocalizedLabel = appEntry.getLabel();
-        LauncherActivityInfo launcherActivityInfo =
-                LauncherAppsHelper
-                        .generateTestLauncherActivityInfo(
-                                context, info, Constants.DEFAULT_TEST_USER_ID
-                        );
-        shadowLauncherApps.addActivity(launcherActivityInfo.getUser(), launcherActivityInfo);
-
-        uiController.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache);
-        assertEquals(1, entries.size());
-        assertEquals(1, launcherAppCache.size());
-        assertEquals(appEntry.getPackageName(), entries.get(0).getPackageName());
-        assertSame(launcherActivityInfo, launcherAppCache.get(0));
-        entries.clear();
-        launcherAppCache.clear();
-
-        LauncherActivityInfo launcherActivityInfoForProfile =
-                LauncherAppsHelper
-                        .generateTestLauncherActivityInfo(
-                                context, info, Constants.DEFAULT_TEST_USER_PROFILE_ID
-                        );
-        shadowLauncherApps.addActivity(
-                UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_PROFILE_ID),
-                launcherActivityInfoForProfile
-        );
-        uiController.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache);
-        assertEquals(1, launcherAppCache.size());
-        assertEquals(1, entries.size());
-        assertEquals(appEntry.getPackageName(), entries.get(0).getPackageName());
-        assertSame(launcherActivityInfo, launcherAppCache.get(0));
-        entries.clear();
-        launcherAppCache.clear();
-
-        usageStatsList.clear();
-        appEntry =
-                new AppEntry(
-                        "com.google.android.googlequicksearchbox",
-                        Constants.TEST_COMPONENT,
-                        Constants.TEST_LABEL,
-                        null,
-                        false
-                );
-        usageStatsList.add(appEntry);
-        ActivityInfo thirdInfo = new ActivityInfo();
-        thirdInfo.packageName = appEntry.getPackageName();
-        thirdInfo.name = appEntry.getLabel();
-        thirdInfo.nonLocalizedLabel = appEntry.getLabel();
-        LauncherActivityInfo thirdLauncherActivityInfo =
-                LauncherAppsHelper
-                        .generateTestLauncherActivityInfo(
-                                context, thirdInfo, Constants.DEFAULT_TEST_USER_ID
-                        );
-        shadowLauncherApps
-                .addActivity(thirdLauncherActivityInfo.getUser(), thirdLauncherActivityInfo);
-        uiController.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache);
-        assertSame(thirdLauncherActivityInfo, launcherAppCache.get(0));
-        entries.clear();
-        launcherAppCache.clear();
-
-        ActivityInfo forthInfo = new ActivityInfo(thirdInfo);
-        forthInfo.name = "com.google.android.googlequicksearchbox.SearchActivity";
-        LauncherActivityInfo forthLauncherActivityInfo =
-                LauncherAppsHelper
-                        .generateTestLauncherActivityInfo(
-                                context, forthInfo, Constants.DEFAULT_TEST_USER_ID
-                        );
-        shadowLauncherApps
-                .addActivity(forthLauncherActivityInfo.getUser(), forthLauncherActivityInfo);
-        uiController.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache);
-        assertSame(forthLauncherActivityInfo, launcherAppCache.get(0));
-    }
-
-    @Test
-    public void testPopulateAppEntries() {
-        List<AppEntry> entries = new ArrayList<>();
-        PackageManager pm = context.getPackageManager();
-        List<LauncherActivityInfo> launcherAppCache = new ArrayList<>();
-
-        uiController.populateAppEntries(context, pm, entries, launcherAppCache);
-        assertEquals(0, entries.size());
-
-        AppEntry appEntry = generateTestAppEntry(1);
-        entries.add(appEntry);
-        uiController.populateAppEntries(context, pm, entries, launcherAppCache);
-        assertEquals(1, entries.size());
-        assertSame(appEntry, entries.get(0));
-
-        AppEntry firstEntry = appEntry;
-        appEntry = new AppEntry(Constants.TEST_PACKAGE, null, null, null, false);
-        appEntry.setLastTimeUsed(System.currentTimeMillis());
-        entries.add(appEntry);
-        ActivityInfo info = new ActivityInfo();
-        info.packageName = appEntry.getPackageName();
-        info.name = Constants.TEST_NAME;
-        info.nonLocalizedLabel = Constants.TEST_LABEL;
-        LauncherActivityInfo launcherActivityInfo =
-                LauncherAppsHelper
-                        .generateTestLauncherActivityInfo(
-                                context, info, Constants.DEFAULT_TEST_USER_ID
-                        );
-        launcherAppCache.add(launcherActivityInfo);
-        uiController.populateAppEntries(context, pm, entries, launcherAppCache);
-        assertEquals(2, entries.size());
-        assertSame(firstEntry, entries.get(0));
-        AppEntry populatedEntry = entries.get(1);
-        assertEquals(info.packageName, populatedEntry.getPackageName());
-        assertEquals(
-                launcherActivityInfo.getComponentName().flattenToString(),
-                populatedEntry.getComponentName()
-        );
-        assertEquals(info.nonLocalizedLabel.toString(), populatedEntry.getLabel());
-        assertEquals(Constants.DEFAULT_TEST_USER_ID, populatedEntry.getUserId(context));
-        assertEquals(appEntry.getLastTimeUsed(), populatedEntry.getLastTimeUsed());
-    }
-
-    private AppEntry generateTestAppEntry(int index) {
-        AppEntry appEntry =
-                new AppEntry(
-                        Constants.TEST_PACKAGE + "-" + index,
-                        Constants.TEST_COMPONENT + "-" + index,
-                        Constants.TEST_LABEL + "-" + index,
-                        null,
-                        false
-                );
-        appEntry.setUserId(Constants.DEFAULT_TEST_USER_ID);
-        return appEntry;
-    }
-
-    private UsageEvents.Event buildTaskbarForegroundAppEvent(String className, long timestamp) {
-        return EventBuilder
-                .buildEvent()
-                .setPackage(className)
-                .setTimeStamp(timestamp)
-                .setClass(className)
-                .setEventType(MOVE_TO_FOREGROUND)
-                .build();
-    }
-
-    private void checkDrawableBackgroundColor(Drawable drawable, int color) {
-        assertTrue(drawable instanceof ColorDrawable);
-        ColorDrawable colorDrawable = (ColorDrawable) drawable;
-        assertEquals(color, colorDrawable.getColor());
-    }
-
-    private void checkDashboardEnabled(boolean expectedDashboardEnabled) {
-        int layoutId = uiController.getTaskbarLayoutId(POSITION_BOTTOM_LEFT);
-        LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(layoutId, null);
-        FrameLayout dashboardButton = layout.findViewById(R.id.dashboard_button);
-        boolean dashboardEnabled =
-                uiController.drawDashboardButton(context, layout, dashboardButton, Color.RED);
-        assertEquals(expectedDashboardEnabled, dashboardEnabled);
-    }
-
-    private void checkDrawSysTrayTimeVisibility(String position, int timeId) {
-        LinearLayout sysTrayLayout = initializeSysTrayLayout(position);
-        assertEquals(View.VISIBLE, sysTrayLayout.findViewById(timeId).getVisibility());
-    }
-
-    private void checkDrawSysTrayGravity(String position, int gravity) {
-        LinearLayout sysTrayLayout = initializeSysTrayLayout(position);
-        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) sysTrayLayout.getLayoutParams();
-        assertEquals(gravity, params.gravity);
-    }
-
-    private LinearLayout initializeSysTrayLayout(String position) {
-        int layoutId = uiController.getTaskbarLayoutId(position);
-        LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(layoutId, null);
-        uiController.drawSysTray(context, layoutId, layout);
-        return getFieldSysTrayLayout(uiController);
-    }
-
-    private LinearLayout getFieldSysTrayLayout(TaskbarController uiController) {
-        return ReflectionHelpers.getField(uiController, "sysTrayLayout");
-    }
-
-    private void checkStartButtonPadding(int padding, ImageView startButton) {
-        assertEquals(padding, startButton.getPaddingLeft());
-        assertEquals(padding, startButton.getPaddingTop());
-        assertEquals(padding, startButton.getPaddingRight());
-        assertEquals(padding, startButton.getPaddingBottom());
-    }
-}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/TaskbarControllerTest.kt b/app/src/test/java/com/farmerbb/taskbar/ui/TaskbarControllerTest.kt
new file mode 100644 (file)
index 0000000..c23d91e
--- /dev/null
@@ -0,0 +1,730 @@
+package com.farmerbb.taskbar.ui
+
+import android.app.AlarmManager
+import android.app.usage.UsageEvents
+import android.app.usage.UsageStatsManager
+import android.content.Context
+import android.content.SharedPreferences
+import android.content.pm.ActivityInfo
+import android.content.pm.LauncherActivityInfo
+import android.content.pm.LauncherApps
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
+import android.os.SystemClock
+import android.os.UserHandle
+import android.os.UserManager
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.ImageView
+import android.widget.LinearLayout
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.Constants
+import com.farmerbb.taskbar.LauncherAppsHelper.generateTestLauncherActivityInfo
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.activity.*
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.mockito.StringAnswer
+import com.farmerbb.taskbar.shadow.TaskbarShadowScrollView
+import com.farmerbb.taskbar.util.AppEntry
+import com.farmerbb.taskbar.util.Constants.*
+import com.farmerbb.taskbar.util.TaskbarPosition
+import com.farmerbb.taskbar.util.U
+import org.junit.*
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.annotation.Config
+import org.robolectric.shadows.ShadowUsageStatsManager
+import org.robolectric.util.ReflectionHelpers
+import java.util.*
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(value = [U::class, TaskbarPosition::class])
+class TaskbarControllerTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var uiController: TaskbarController? = null
+    private var context: Context? = null
+    var prefs: SharedPreferences? = null
+    private val host: UIHost = MockUIHost()
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        uiController = TaskbarController(context)
+        prefs = U.getSharedPreferences(context)
+        uiController!!.onCreateHost(host)
+    }
+
+    @After
+    fun tearDown() {
+        prefs!!.edit().remove(PREF_START_BUTTON_IMAGE).apply()
+        uiController!!.onDestroyHost(host)
+    }
+
+    @Test
+    fun testInitialization() {
+        Assert.assertNotNull(uiController)
+    }
+
+    @Test
+    fun testDrawStartButtonPadding() {
+        val startButton = ImageView(context)
+        prefs = U.getSharedPreferences(context)
+        prefs!!.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_DEFAULT).apply()
+        uiController!!.drawStartButton(context, startButton, prefs, Color.RED)
+        var padding = context!!.resources.getDimensionPixelSize(R.dimen.tb_app_drawer_icon_padding)
+        checkStartButtonPadding(padding, startButton)
+        PowerMockito.spy(U::class.java)
+        // Use bliss os logic to avoid using LauncherApps, that robolectric doesn't support
+        PowerMockito.`when`(U.isBlissOs(context)).thenReturn(true)
+        prefs!!.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_APP_LOGO).apply()
+        uiController!!.drawStartButton(context, startButton, prefs, Color.RED)
+        padding = context!!.resources.getDimensionPixelSize(R.dimen.tb_app_drawer_icon_padding_alt)
+        checkStartButtonPadding(padding, startButton)
+        prefs!!.edit().putString(PREF_START_BUTTON_IMAGE, PREF_START_BUTTON_IMAGE_CUSTOM).apply()
+        uiController!!.drawStartButton(context, startButton, prefs, Color.RED)
+        padding = context!!.resources.getDimensionPixelSize(R.dimen.tb_app_drawer_icon_padding)
+        checkStartButtonPadding(padding, startButton)
+        prefs!!.edit().putString(PREF_START_BUTTON_IMAGE, "non-support").apply()
+        uiController!!.drawStartButton(context, startButton, prefs, Color.RED)
+        checkStartButtonPadding(0, startButton)
+    }
+
+    @Test
+    fun testGetTaskbarGravity() {
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.LEFT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_BOTTOM_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.LEFT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_BOTTOM_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.RIGHT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_BOTTOM_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.RIGHT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_BOTTOM_VERTICAL_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.LEFT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_TOP_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.LEFT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_TOP_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.RIGHT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_TOP_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.TOP or Gravity.RIGHT).toLong(),
+                uiController!!.getTaskbarGravity(POSITION_TOP_VERTICAL_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                (Gravity.BOTTOM or Gravity.LEFT).toLong(),
+                uiController!!.getTaskbarGravity(Constants.UNSUPPORTED)
+                        .toLong())
+    }
+
+    @Test
+    fun testGetTaskbarLayoutId() {
+        Assert.assertEquals(
+                R.layout.tb_taskbar_left.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_vertical.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_right.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_vertical.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_VERTICAL_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_left.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_TOP_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_top_vertical.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_TOP_VERTICAL_LEFT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_right.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_TOP_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_top_vertical.toLong(),
+                uiController!!.getTaskbarLayoutId(POSITION_TOP_VERTICAL_RIGHT)
+                        .toLong())
+        Assert.assertEquals(
+                R.layout.tb_taskbar_left.toLong(),
+                uiController!!.getTaskbarLayoutId(Constants.UNSUPPORTED)
+                        .toLong())
+    }
+
+    @Test
+    fun testDrawDashboardButtonWithDefaultConfig() {
+        prefs!!.edit().remove(PREF_DASHBOARD).apply()
+        checkDashboardEnabled(false)
+    }
+
+    @Test
+    @Config(qualifiers = "sw540dp")
+    fun testDrawDashboardButtonWithDefaultConfigForSw540dp() {
+        prefs!!.edit().remove(PREF_DASHBOARD).apply()
+        checkDashboardEnabled(false)
+    }
+
+    @Test
+    @Config(qualifiers = "sw720dp")
+    fun testDrawDashboardButtonWithDefaultConfigForSw720dp() {
+        prefs!!.edit().remove(PREF_DASHBOARD).apply()
+        checkDashboardEnabled(true)
+    }
+
+    @Test
+    fun testDrawDashboardButtonForDashboardButton() {
+        val accentColor = Color.RED
+        val layoutId = uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_LEFT)
+        val layout = LayoutInflater.from(context).inflate(layoutId, null) as LinearLayout
+        val dashboardButton = layout.findViewById<FrameLayout>(R.id.dashboard_button)
+        prefs!!.edit().putBoolean(PREF_DASHBOARD, false).apply()
+        var dashboardEnabled = uiController!!.drawDashboardButton(context, layout, dashboardButton, accentColor)
+        Assert.assertFalse(dashboardEnabled)
+        Assert.assertEquals(View.GONE.toLong(), dashboardButton.visibility.toLong())
+        prefs!!.edit().putBoolean(PREF_DASHBOARD, true).apply()
+        dashboardEnabled = uiController!!.drawDashboardButton(context, layout, dashboardButton, accentColor)
+        Assert.assertTrue(dashboardEnabled)
+        Assert.assertTrue(dashboardButton.hasOnClickListeners())
+        Assert.assertEquals(View.VISIBLE.toLong(), dashboardButton.visibility.toLong())
+        var drawable = layout.findViewById<View>(R.id.square1).background
+        checkDrawableBackgroundColor(drawable, accentColor)
+        drawable = layout.findViewById<View>(R.id.square2).background
+        checkDrawableBackgroundColor(drawable, accentColor)
+        drawable = layout.findViewById<View>(R.id.square3).background
+        checkDrawableBackgroundColor(drawable, accentColor)
+        drawable = layout.findViewById<View>(R.id.square4).background
+        checkDrawableBackgroundColor(drawable, accentColor)
+        drawable = layout.findViewById<View>(R.id.square5).background
+        checkDrawableBackgroundColor(drawable, accentColor)
+        drawable = layout.findViewById<View>(R.id.square6).background
+        checkDrawableBackgroundColor(drawable, accentColor)
+    }
+
+    @Test
+    fun testDrawNavbarButtons() {
+        val layoutId = uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_LEFT)
+        val layout = LayoutInflater.from(context).inflate(layoutId, null) as LinearLayout
+        prefs!!.edit()
+                .remove(PREF_BUTTON_BACK)
+                .remove(PREF_BUTTON_HOME)
+                .remove(PREF_BUTTON_RECENTS)
+                .apply()
+        Assert.assertFalse(uiController!!.drawNavbarButtons(context, layout, prefs, Color.RED))
+        prefs!!.edit().putBoolean(PREF_BUTTON_BACK, true).apply()
+        Assert.assertTrue(uiController!!.drawNavbarButtons(context, layout, prefs, Color.RED))
+        Assert.assertEquals(View.VISIBLE.toLong(), layout.findViewById<View>(R.id.button_back).visibility.toLong())
+        prefs!!.edit().remove(PREF_BUTTON_BACK).apply()
+        prefs!!.edit().putBoolean(PREF_BUTTON_HOME, true).apply()
+        Assert.assertTrue(uiController!!.drawNavbarButtons(context, layout, prefs, Color.RED))
+        Assert.assertEquals(View.VISIBLE.toLong(), layout.findViewById<View>(R.id.button_home).visibility.toLong())
+        prefs!!.edit().remove(PREF_BUTTON_HOME).apply()
+        prefs!!.edit().putBoolean(PREF_BUTTON_RECENTS, true).apply()
+        Assert.assertTrue(uiController!!.drawNavbarButtons(context, layout, prefs, Color.RED))
+        Assert.assertEquals(View.VISIBLE.toLong(), layout.findViewById<View>(R.id.button_recents).visibility.toLong())
+        prefs!!.edit().remove(PREF_BUTTON_RECENTS).apply()
+    }
+
+    @Test
+    fun testGetSearchInterval() {
+        val permitTimeDeltaMillis: Long = 100
+        prefs!!.edit().remove(PREF_RECENTS_AMOUNT).apply()
+        var searchInterval = uiController!!.getSearchInterval(prefs)
+        val lastDayTime = System.currentTimeMillis() - AlarmManager.INTERVAL_DAY
+        Assert.assertEquals(lastDayTime.toFloat(), searchInterval.toFloat(), permitTimeDeltaMillis.toFloat())
+        prefs!!.edit().putString(PREF_RECENTS_AMOUNT, PREF_RECENTS_AMOUNT_APP_START).apply()
+        var deviceStartTime = System.currentTimeMillis() - SystemClock.elapsedRealtime()
+        // The service start time is larger than device start time
+        val appStartTime = deviceStartTime * 2
+        prefs!!.edit().putLong(PREF_TIME_OF_SERVICE_START, appStartTime).apply()
+        searchInterval = uiController!!.getSearchInterval(prefs)
+        Assert.assertEquals(appStartTime, searchInterval)
+
+        // The service start time is smaller than device start time
+        prefs!!.edit().putLong(PREF_TIME_OF_SERVICE_START, deviceStartTime - 100).apply()
+        searchInterval = uiController!!.getSearchInterval(prefs)
+        deviceStartTime = System.currentTimeMillis() - SystemClock.elapsedRealtime()
+        Assert.assertEquals(deviceStartTime.toFloat(), searchInterval.toFloat(), permitTimeDeltaMillis.toFloat())
+        prefs!!.edit().remove(PREF_TIME_OF_SERVICE_START).apply()
+        prefs!!.edit().putString(PREF_RECENTS_AMOUNT, PREF_RECENTS_AMOUNT_SHOW_ALL).apply()
+        searchInterval = uiController!!.getSearchInterval(prefs)
+        Assert.assertEquals(0, searchInterval)
+        prefs!!.edit().putString(PREF_RECENTS_AMOUNT, PREF_RECENTS_AMOUNT_RUNNING_APPS_ONLY).apply()
+        searchInterval = uiController!!.getSearchInterval(prefs)
+        Assert.assertEquals(-1, searchInterval)
+        prefs!!.edit().putString(PREF_RECENTS_AMOUNT, Constants.UNSUPPORTED).apply()
+        searchInterval = uiController!!.getSearchInterval(prefs)
+        Assert.assertEquals(-1, searchInterval)
+        prefs!!.edit().remove(PREF_RECENTS_AMOUNT).apply()
+    }
+
+    @Test
+    fun testDrawSysTrayOnClickListener() {
+        PowerMockito.spy(U::class.java)
+        val isLibraryAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.isLibrary(context)).thenAnswer(isLibraryAnswer)
+        isLibraryAnswer.answer = true
+        var sysTrayLayout = initializeSysTrayLayout(POSITION_BOTTOM_RIGHT)
+        Assert.assertFalse(sysTrayLayout.hasOnClickListeners())
+        isLibraryAnswer.answer = false
+        sysTrayLayout = initializeSysTrayLayout(POSITION_BOTTOM_RIGHT)
+        Assert.assertTrue(sysTrayLayout.hasOnClickListeners())
+    }
+
+    @Test
+    fun testDrawSysTrayParentLayoutVisibility() {
+        val sysTrayLayout = initializeSysTrayLayout(POSITION_BOTTOM_RIGHT)
+        val parent = sysTrayLayout.parent as ViewGroup
+        Assert.assertEquals(View.VISIBLE.toLong(), parent.visibility.toLong())
+    }
+
+    @Test
+    fun testDrawSysTrayGravity() {
+        checkDrawSysTrayGravity(POSITION_BOTTOM_LEFT, Gravity.END)
+        checkDrawSysTrayGravity(POSITION_BOTTOM_RIGHT, Gravity.START)
+    }
+
+    @Test
+    fun testDrawSysTrayTime() {
+        checkDrawSysTrayTimeVisibility(POSITION_BOTTOM_LEFT, R.id.time_right)
+        checkDrawSysTrayTimeVisibility(POSITION_BOTTOM_RIGHT, R.id.time_left)
+    }
+
+    @Test
+    fun testCalculateScrollViewParams() {
+        val isVerticalAnswer = BooleanAnswer()
+        PowerMockito.spy(TaskbarPosition::class.java)
+        PowerMockito.`when`(TaskbarPosition.isVertical(context)).thenAnswer(isVerticalAnswer)
+        val display = U.getDisplayInfo(context, true)
+        val dividerSize = context!!.resources.getDimensionPixelSize(R.dimen.tb_divider_size)
+        val defaultSize = -1
+        val params = ViewGroup.LayoutParams(defaultSize, defaultSize)
+        val iconSize = context!!.resources.getDimensionPixelSize(R.dimen.tb_icon_size)
+        isVerticalAnswer.answer = true
+        var maxScreenSize = Math.max(
+                0,
+                display.height
+                        - U.getStatusBarHeight(context)
+                        - Math.round(U.getBaseTaskbarSize(context))
+        )
+        uiController!!.calculateScrollViewParams(context, prefs, params, true, 1)
+        Assert.assertEquals(defaultSize.toLong(), params.width.toLong())
+        Assert.assertEquals(maxScreenSize + dividerSize.toLong(), params.height.toLong())
+        params.height = defaultSize
+        uiController!!.calculateScrollViewParams(context, prefs, params, false, 1)
+        Assert.assertEquals(defaultSize.toLong(), params.width.toLong())
+        Assert.assertEquals(iconSize + dividerSize.toLong(), params.height.toLong())
+        params.height = defaultSize
+        uiController!!.calculateScrollViewParams(context, prefs, params, false, 10000)
+        Assert.assertEquals(defaultSize.toLong(), params.width.toLong())
+        Assert.assertEquals(maxScreenSize + dividerSize.toLong(), params.height.toLong())
+        params.height = defaultSize
+        isVerticalAnswer.answer = false
+        maxScreenSize = Math.max(0, display.width - Math.round(U.getBaseTaskbarSize(context)))
+        uiController!!.calculateScrollViewParams(context, prefs, params, true, 1)
+        Assert.assertEquals(maxScreenSize + dividerSize.toLong(), params.width.toLong())
+        Assert.assertEquals(defaultSize.toLong(), params.height.toLong())
+        params.width = defaultSize
+        uiController!!.calculateScrollViewParams(context, prefs, params, false, 1)
+        Assert.assertEquals(iconSize + dividerSize.toLong(), params.width.toLong())
+        Assert.assertEquals(defaultSize.toLong(), params.height.toLong())
+        params.width = defaultSize
+        uiController!!.calculateScrollViewParams(context, prefs, params, false, 10000)
+        Assert.assertEquals(maxScreenSize + dividerSize.toLong(), params.width.toLong())
+        Assert.assertEquals(defaultSize.toLong(), params.height.toLong())
+    }
+
+    @Test
+    fun testScrollTaskbarForScrollViewVisibility() {
+        val layoutId = uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_LEFT)
+        val layout = LayoutInflater.from(context).inflate(layoutId, null) as LinearLayout
+        val scrollView = layout.findViewById<FrameLayout>(R.id.taskbar_scrollview)
+        val taskbar = layout.findViewById<LinearLayout>(R.id.taskbar)
+        uiController!!.scrollTaskbar(scrollView, taskbar, POSITION_BOTTOM_LEFT, "false", false)
+        Assert.assertEquals(View.GONE.toLong(), scrollView.visibility.toLong())
+        uiController!!.scrollTaskbar(scrollView, taskbar, POSITION_BOTTOM_LEFT, "false", true)
+        Assert.assertEquals(View.VISIBLE.toLong(), scrollView.visibility.toLong())
+    }
+
+    @Test
+    @Config(shadows = [TaskbarShadowScrollView::class])
+    fun testScrollTaskbarForScrollViewLocation() {
+        // We only provide enhanced ShadowScrollView with scrollTo supported, so we should
+        // choose the layout uses the ScrollView instead of HorizontalScrollView.
+        val taskbarPosition = POSITION_BOTTOM_VERTICAL_LEFT
+        val layoutId = uiController!!.getTaskbarLayoutId(taskbarPosition)
+        val layout = LayoutInflater.from(context).inflate(layoutId, null) as LinearLayout
+        val scrollView = layout.findViewById<FrameLayout>(R.id.taskbar_scrollview)
+        val taskbar = layout.findViewById<LinearLayout>(R.id.taskbar)
+        val taskbarWidth = 200
+        val taskbarHeight = 50
+        // Change LayoutParams doesn't work with robolectric, so we should use reflection
+        // to change the location directly.
+        ReflectionHelpers.setField(taskbar, "mLeft", 0)
+        ReflectionHelpers.setField(taskbar, "mTop", 0)
+        ReflectionHelpers.setField(taskbar, "mRight", taskbarWidth)
+        ReflectionHelpers.setField(taskbar, "mBottom", taskbarHeight)
+        val isVerticalAnswer = BooleanAnswer()
+        PowerMockito.spy(TaskbarPosition::class.java)
+        PowerMockito.`when`(TaskbarPosition.isVertical(taskbarPosition)).thenAnswer(isVerticalAnswer)
+        isVerticalAnswer.answer = false
+        uiController!!.scrollTaskbar(scrollView, taskbar, taskbarPosition, "false", true)
+        Assert.assertEquals(0, scrollView.scrollX.toLong())
+        Assert.assertEquals(0, scrollView.scrollY.toLong())
+        uiController!!.scrollTaskbar(scrollView, taskbar, taskbarPosition, "true", true)
+        Assert.assertEquals(taskbarWidth.toLong(), scrollView.scrollX.toLong())
+        Assert.assertEquals(taskbarHeight.toLong(), scrollView.scrollY.toLong())
+        isVerticalAnswer.answer = true
+        uiController!!.scrollTaskbar(scrollView, taskbar, taskbarPosition, "true", true)
+        Assert.assertEquals(0, scrollView.scrollX.toLong())
+        Assert.assertEquals(0, scrollView.scrollY.toLong())
+        uiController!!.scrollTaskbar(scrollView, taskbar, taskbarPosition, "false", true)
+        Assert.assertEquals(taskbarWidth.toLong(), scrollView.scrollX.toLong())
+        Assert.assertEquals(taskbarHeight.toLong(), scrollView.scrollY.toLong())
+    }
+
+    @Test
+    fun testFilterForegroundApp() {
+        prefs!!.edit().putBoolean(PREF_HIDE_FOREGROUND, true).apply()
+        val searchInterval = 0L
+        val applicationIdsToRemove: MutableList<String> = ArrayList()
+        val usageStatsManager = context!!.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
+        val entryTestPackage1 = Constants.TEST_PACKAGE + "-1"
+        var event = ShadowUsageStatsManager.EventBuilder
+                .buildEvent()
+                .setEventType(UsageEvents.Event.MOVE_TO_FOREGROUND)
+                .setTimeStamp(100L)
+                .setPackage(entryTestPackage1)
+                .build()
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(entryTestPackage1, applicationIdsToRemove.removeAt(0))
+        event = ShadowUsageStatsManager.EventBuilder
+                .buildEvent()
+                .setEventType(UsageEvents.Event.MOVE_TO_BACKGROUND)
+                .setTimeStamp(200L)
+                .setPackage(Constants.TEST_PACKAGE + "-2")
+                .build()
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(entryTestPackage1, applicationIdsToRemove.removeAt(0))
+        event = buildTaskbarForegroundAppEvent(MainActivity::class.java.canonicalName, 300L)
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(MainActivity::class.java.canonicalName, applicationIdsToRemove.removeAt(0))
+        event = buildTaskbarForegroundAppEvent(HomeActivity::class.java.canonicalName, 400L)
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(HomeActivity::class.java.canonicalName, applicationIdsToRemove.removeAt(0))
+        event = buildTaskbarForegroundAppEvent(HomeActivityDelegate::class.java.canonicalName, 500L)
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(HomeActivityDelegate::class.java.canonicalName, applicationIdsToRemove.removeAt(0))
+        event = buildTaskbarForegroundAppEvent(SecondaryHomeActivity::class.java.canonicalName, 600L)
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(SecondaryHomeActivity::class.java.canonicalName, applicationIdsToRemove.removeAt(0))
+        event = buildTaskbarForegroundAppEvent(InvisibleActivityFreeform::class.java.canonicalName, 700L)
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(InvisibleActivityFreeform::class.java.canonicalName, applicationIdsToRemove.removeAt(0))
+        event = buildTaskbarForegroundAppEvent(Constants.UNSUPPORTED, 800L)
+        Shadows.shadowOf(usageStatsManager).addEvent(event)
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(Constants.UNSUPPORTED, applicationIdsToRemove.removeAt(0))
+        prefs!!.edit().remove(PREF_HIDE_FOREGROUND).apply()
+        uiController!!.filterForegroundApp(context, prefs, searchInterval, applicationIdsToRemove)
+        Assert.assertEquals(0, applicationIdsToRemove.size.toLong())
+    }
+
+    @Test
+    fun testNeedToReverseOrder() {
+        PowerMockito.spy(TaskbarPosition::class.java)
+        val positionAnswer = StringAnswer()
+        PowerMockito.`when`(TaskbarPosition.getTaskbarPosition(context)).thenAnswer(positionAnswer)
+        val positions: MutableList<String> = ArrayList()
+        positions.add(POSITION_BOTTOM_LEFT)
+        positions.add(POSITION_BOTTOM_RIGHT)
+        positions.add(POSITION_BOTTOM_VERTICAL_LEFT)
+        positions.add(POSITION_BOTTOM_VERTICAL_RIGHT)
+        positions.add(POSITION_TOP_LEFT)
+        positions.add(POSITION_TOP_RIGHT)
+        positions.add(POSITION_TOP_VERTICAL_LEFT)
+        positions.add(POSITION_TOP_VERTICAL_RIGHT)
+        positions.add(Constants.UNSUPPORTED)
+        var sortOrder = "false"
+        for (position in positions) {
+            positionAnswer.answer = position
+            if (POSITION_BOTTOM_RIGHT == position || POSITION_TOP_RIGHT == position) {
+                Assert.assertTrue(uiController!!.needToReverseOrder(context, sortOrder))
+            } else {
+                Assert.assertFalse(uiController!!.needToReverseOrder(context, sortOrder))
+            }
+        }
+        sortOrder = "true"
+        for (position in positions) {
+            positionAnswer.answer = position
+            if (POSITION_BOTTOM_RIGHT == position || POSITION_TOP_RIGHT == position) {
+                Assert.assertFalse(uiController!!.needToReverseOrder(context, sortOrder))
+            } else {
+                Assert.assertTrue(uiController!!.needToReverseOrder(context, sortOrder))
+            }
+        }
+        sortOrder = Constants.UNSUPPORTED
+        for (position in positions) {
+            positionAnswer.answer = position
+            Assert.assertFalse(uiController!!.needToReverseOrder(context, sortOrder))
+        }
+    }
+
+    @Test
+    fun testFilterRealPinnedApps() {
+        val pinnedApps: MutableList<AppEntry> = ArrayList()
+        val entries: MutableList<AppEntry> = ArrayList()
+        val applicationIdsToRemove: MutableList<String> = ArrayList()
+        var realNumOfPinnedApps = uiController!!.filterRealPinnedApps(
+                context, pinnedApps, entries, applicationIdsToRemove
+        )
+        Assert.assertEquals(0, realNumOfPinnedApps.toLong())
+        val launcherApps = context!!.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
+        val shadowLauncherApps = Shadows.shadowOf(launcherApps)
+        var appEntry = generateTestAppEntry(1)
+        pinnedApps.add(appEntry)
+        shadowLauncherApps
+                .addEnabledPackage(
+                        UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_ID),
+                        appEntry.packageName
+                )
+        realNumOfPinnedApps = uiController!!.filterRealPinnedApps(
+                context, pinnedApps, entries, applicationIdsToRemove
+        )
+        Assert.assertEquals(1, realNumOfPinnedApps.toLong())
+        Assert.assertEquals(appEntry.packageName, applicationIdsToRemove[0])
+        Assert.assertEquals(appEntry, entries[0])
+        applicationIdsToRemove.clear()
+        entries.clear()
+        appEntry = generateTestAppEntry(2)
+        pinnedApps.add(appEntry)
+        realNumOfPinnedApps = uiController!!.filterRealPinnedApps(
+                context, pinnedApps, entries, applicationIdsToRemove
+        )
+        Assert.assertEquals(1, realNumOfPinnedApps.toLong())
+        Assert.assertEquals(2, applicationIdsToRemove.size.toLong())
+        Assert.assertEquals(1, entries.size.toLong())
+    }
+
+    @Test
+    fun testGenerateAppEntries() {
+        val usageStatsList: MutableList<AppEntry> = ArrayList()
+        val entries: MutableList<AppEntry> = ArrayList()
+        val launcherAppCache: MutableList<LauncherActivityInfo> = ArrayList()
+        uiController!!.generateAppEntries(context, -1, usageStatsList, entries, launcherAppCache)
+        Assert.assertEquals(0, entries.size.toLong())
+        uiController!!.generateAppEntries(context, 0, usageStatsList, entries, launcherAppCache)
+        Assert.assertEquals(0, entries.size.toLong())
+        val userManager = context!!.getSystemService(Context.USER_SERVICE) as UserManager
+        Shadows.shadowOf(userManager)
+                .addUserProfile(UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_ID))
+        Shadows.shadowOf(userManager)
+                .addUserProfile(
+                        UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_PROFILE_ID)
+                )
+        val launcherApps = context!!.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
+        val shadowLauncherApps = Shadows.shadowOf(launcherApps)
+        var appEntry = generateTestAppEntry(0)
+        usageStatsList.add(appEntry)
+        uiController!!.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache)
+        Assert.assertEquals(0, entries.size.toLong())
+        val info = ActivityInfo()
+        info.packageName = appEntry.packageName
+        info.name = appEntry.label
+        info.nonLocalizedLabel = appEntry.label
+        val launcherActivityInfo = generateTestLauncherActivityInfo(
+                context!!, info, Constants.DEFAULT_TEST_USER_ID
+        )
+        shadowLauncherApps.addActivity(launcherActivityInfo.user, launcherActivityInfo)
+        uiController!!.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache)
+        Assert.assertEquals(1, entries.size.toLong())
+        Assert.assertEquals(1, launcherAppCache.size.toLong())
+        Assert.assertEquals(appEntry.packageName, entries[0].packageName)
+        Assert.assertSame(launcherActivityInfo, launcherAppCache[0])
+        entries.clear()
+        launcherAppCache.clear()
+        val launcherActivityInfoForProfile = generateTestLauncherActivityInfo(
+                context!!, info, Constants.DEFAULT_TEST_USER_PROFILE_ID
+        )
+        shadowLauncherApps.addActivity(
+                UserHandle.getUserHandleForUid(Constants.DEFAULT_TEST_USER_PROFILE_ID),
+                launcherActivityInfoForProfile
+        )
+        uiController!!.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache)
+        Assert.assertEquals(1, launcherAppCache.size.toLong())
+        Assert.assertEquals(1, entries.size.toLong())
+        Assert.assertEquals(appEntry.packageName, entries[0].packageName)
+        Assert.assertSame(launcherActivityInfo, launcherAppCache[0])
+        entries.clear()
+        launcherAppCache.clear()
+        usageStatsList.clear()
+        appEntry = AppEntry(
+                "com.google.android.googlequicksearchbox",
+                Constants.TEST_COMPONENT,
+                Constants.TEST_LABEL,
+                null,
+                false
+        )
+        usageStatsList.add(appEntry)
+        val thirdInfo = ActivityInfo()
+        thirdInfo.packageName = appEntry.packageName
+        thirdInfo.name = appEntry.label
+        thirdInfo.nonLocalizedLabel = appEntry.label
+        val thirdLauncherActivityInfo = generateTestLauncherActivityInfo(
+                context!!, thirdInfo, Constants.DEFAULT_TEST_USER_ID
+        )
+        shadowLauncherApps
+                .addActivity(thirdLauncherActivityInfo.user, thirdLauncherActivityInfo)
+        uiController!!.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache)
+        Assert.assertSame(thirdLauncherActivityInfo, launcherAppCache[0])
+        entries.clear()
+        launcherAppCache.clear()
+        val forthInfo = ActivityInfo(thirdInfo)
+        forthInfo.name = "com.google.android.googlequicksearchbox.SearchActivity"
+        val forthLauncherActivityInfo = generateTestLauncherActivityInfo(
+                context!!, forthInfo, Constants.DEFAULT_TEST_USER_ID
+        )
+        shadowLauncherApps
+                .addActivity(forthLauncherActivityInfo.user, forthLauncherActivityInfo)
+        uiController!!.generateAppEntries(context, 1, usageStatsList, entries, launcherAppCache)
+        Assert.assertSame(forthLauncherActivityInfo, launcherAppCache[0])
+    }
+
+    @Test
+    fun testPopulateAppEntries() {
+        val entries: MutableList<AppEntry> = ArrayList()
+        val pm = context!!.packageManager
+        val launcherAppCache: MutableList<LauncherActivityInfo> = ArrayList()
+        uiController!!.populateAppEntries(context, pm, entries, launcherAppCache)
+        Assert.assertEquals(0, entries.size.toLong())
+        var appEntry = generateTestAppEntry(1)
+        entries.add(appEntry)
+        uiController!!.populateAppEntries(context, pm, entries, launcherAppCache)
+        Assert.assertEquals(1, entries.size.toLong())
+        Assert.assertSame(appEntry, entries[0])
+        val firstEntry = appEntry
+        appEntry = AppEntry(Constants.TEST_PACKAGE, null, null, null, false)
+        appEntry.lastTimeUsed = System.currentTimeMillis()
+        entries.add(appEntry)
+        val info = ActivityInfo()
+        info.packageName = appEntry.packageName
+        info.name = Constants.TEST_NAME
+        info.nonLocalizedLabel = Constants.TEST_LABEL
+        val launcherActivityInfo = generateTestLauncherActivityInfo(
+                context!!, info, Constants.DEFAULT_TEST_USER_ID
+        )
+        launcherAppCache.add(launcherActivityInfo)
+        uiController!!.populateAppEntries(context, pm, entries, launcherAppCache)
+        Assert.assertEquals(2, entries.size.toLong())
+        Assert.assertSame(firstEntry, entries[0])
+        val populatedEntry = entries[1]
+        Assert.assertEquals(info.packageName, populatedEntry.packageName)
+        Assert.assertEquals(
+                launcherActivityInfo.componentName.flattenToString(),
+                populatedEntry.componentName
+        )
+        Assert.assertEquals(info.nonLocalizedLabel.toString(), populatedEntry.label)
+        Assert.assertEquals(Constants.DEFAULT_TEST_USER_ID.toLong(), populatedEntry.getUserId(context))
+        Assert.assertEquals(appEntry.lastTimeUsed, populatedEntry.lastTimeUsed)
+    }
+
+    private fun generateTestAppEntry(index: Int): AppEntry {
+        val appEntry = AppEntry(
+                Constants.TEST_PACKAGE + "-" + index,
+                Constants.TEST_COMPONENT + "-" + index,
+                Constants.TEST_LABEL + "-" + index,
+                null,
+                false
+        )
+        appEntry.setUserId(Constants.DEFAULT_TEST_USER_ID.toLong())
+        return appEntry
+    }
+
+    private fun buildTaskbarForegroundAppEvent(className: String, timestamp: Long): UsageEvents.Event {
+        return ShadowUsageStatsManager.EventBuilder
+                .buildEvent()
+                .setPackage(className)
+                .setTimeStamp(timestamp)
+                .setClass(className)
+                .setEventType(UsageEvents.Event.MOVE_TO_FOREGROUND)
+                .build()
+    }
+
+    private fun checkDrawableBackgroundColor(drawable: Drawable, color: Int) {
+        Assert.assertTrue(drawable is ColorDrawable)
+        val colorDrawable = drawable as ColorDrawable
+        Assert.assertEquals(color.toLong(), colorDrawable.color.toLong())
+    }
+
+    private fun checkDashboardEnabled(expectedDashboardEnabled: Boolean) {
+        val layoutId = uiController!!.getTaskbarLayoutId(POSITION_BOTTOM_LEFT)
+        val layout = LayoutInflater.from(context).inflate(layoutId, null) as LinearLayout
+        val dashboardButton = layout.findViewById<FrameLayout>(R.id.dashboard_button)
+        val dashboardEnabled = uiController!!.drawDashboardButton(context, layout, dashboardButton, Color.RED)
+        Assert.assertEquals(expectedDashboardEnabled, dashboardEnabled)
+    }
+
+    private fun checkDrawSysTrayTimeVisibility(position: String, timeId: Int) {
+        val sysTrayLayout = initializeSysTrayLayout(position)
+        Assert.assertEquals(View.VISIBLE.toLong(), sysTrayLayout.findViewById<View>(timeId).visibility.toLong())
+    }
+
+    private fun checkDrawSysTrayGravity(position: String, gravity: Int) {
+        val sysTrayLayout = initializeSysTrayLayout(position)
+        val params = sysTrayLayout.layoutParams as FrameLayout.LayoutParams
+        Assert.assertEquals(gravity.toLong(), params.gravity.toLong())
+    }
+
+    private fun initializeSysTrayLayout(position: String): LinearLayout {
+        val layoutId = uiController!!.getTaskbarLayoutId(position)
+        val layout = LayoutInflater.from(context).inflate(layoutId, null) as LinearLayout
+        uiController!!.drawSysTray(context, layoutId, layout)
+        return getFieldSysTrayLayout(uiController)
+    }
+
+    private fun getFieldSysTrayLayout(uiController: TaskbarController?): LinearLayout {
+        return ReflectionHelpers.getField(uiController, "sysTrayLayout")
+    }
+
+    private fun checkStartButtonPadding(padding: Int, startButton: ImageView) {
+        Assert.assertEquals(padding.toLong(), startButton.paddingLeft.toLong())
+        Assert.assertEquals(padding.toLong(), startButton.paddingTop.toLong())
+        Assert.assertEquals(padding.toLong(), startButton.paddingRight.toLong())
+        Assert.assertEquals(padding.toLong(), startButton.paddingBottom.toLong())
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/TestUIController.java b/app/src/test/java/com/farmerbb/taskbar/ui/TestUIController.java
deleted file mode 100644 (file)
index 4d3a8de..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.content.Context;
-
-public class TestUIController extends UIController {
-    UIHost onCreateHost;
-    UIHost onRecreateHost;
-    UIHost onDestroyHost;
-
-    public TestUIController(Context context) {
-        super(context);
-    }
-
-    @Override
-    void onCreateHost(UIHost host) {
-        onCreateHost = host;
-    }
-
-    @Override
-    void onRecreateHost(UIHost host) {
-        onRecreateHost = host;
-    }
-
-    @Override
-    void onDestroyHost(UIHost host) {
-        onDestroyHost = host;
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/TestUIController.kt b/app/src/test/java/com/farmerbb/taskbar/ui/TestUIController.kt
new file mode 100644 (file)
index 0000000..d3b411b
--- /dev/null
@@ -0,0 +1,20 @@
+package com.farmerbb.taskbar.ui
+
+import android.content.Context
+
+class TestUIController(context: Context?) : UIController(context) {
+    var onCreateHost: UIHost? = null
+    var onRecreateHost: UIHost? = null
+    var onDestroyHost: UIHost? = null
+    public override fun onCreateHost(host: UIHost) {
+        onCreateHost = host
+    }
+
+    public override fun onRecreateHost(host: UIHost) {
+        onRecreateHost = host
+    }
+
+    public override fun onDestroyHost(host: UIHost) {
+        onDestroyHost = host
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/TestUIHostService.java b/app/src/test/java/com/farmerbb/taskbar/ui/TestUIHostService.java
deleted file mode 100644 (file)
index ab5f4e4..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import androidx.test.core.app.ApplicationProvider;
-
-public class TestUIHostService extends UIHostService {
-    TestUIController controller;
-
-    @Override
-    public UIController newController() {
-        if (controller == null) {
-            controller = new TestUIController(ApplicationProvider.getApplicationContext());
-        }
-        return controller;
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/TestUIHostService.kt b/app/src/test/java/com/farmerbb/taskbar/ui/TestUIHostService.kt
new file mode 100644 (file)
index 0000000..53c6f93
--- /dev/null
@@ -0,0 +1,13 @@
+package com.farmerbb.taskbar.ui
+
+import androidx.test.core.app.ApplicationProvider
+
+class TestUIHostService : UIHostService() {
+    var controller: TestUIController? = null
+    override fun newController(): UIController {
+        if (controller == null) {
+            controller = TestUIController(ApplicationProvider.getApplicationContext())
+        }
+        return controller!!
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/UIControllerTest.java b/app/src/test/java/com/farmerbb/taskbar/ui/UIControllerTest.java
deleted file mode 100644 (file)
index fa6b7a0..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.helper.LauncherHelper;
-import com.farmerbb.taskbar.util.U;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.android.controller.ServiceController;
-import org.robolectric.shadows.ShadowService;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.powermock.api.mockito.PowerMockito.when;
-
-import static com.farmerbb.taskbar.util.Constants.*;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(U.class)
-public class UIControllerTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private ServiceController<TestUIHostService> controller;
-    private TestUIHostService hostService;
-    private TestUIController uiController;
-    private Context context;
-
-    @Before
-    public void setUp() {
-        controller = Robolectric.buildService(TestUIHostService.class);
-        hostService = controller.create().get();
-        uiController = hostService.controller;
-        context = ApplicationProvider.getApplicationContext();
-    }
-
-    @After
-    public void tearDown() {
-        setTaskbarActive(false);
-    }
-
-    @Test
-    public void testInitWithoutProceed() {
-        LauncherHelper.getInstance().setOnSecondaryHomeScreen(true, 1);
-        TestRunnable runnable = new TestRunnable();
-        Context context = ApplicationProvider.getApplicationContext();
-        uiController.init(context, hostService, runnable);
-        ShadowService shadowService = Shadows.shadowOf(hostService);
-        assertTrue(shadowService.isStoppedBySelf());
-    }
-
-    @Test
-    public void testInitWithProceedAndTaskbarActive() {
-        setTaskbarActive(true);
-        testInitWithProceed();
-    }
-
-    @Test
-    public void testInitWithProceedAndOnHomeScreen() {
-        testInitWithoutProceed();
-    }
-
-    private void testInitWithProceed() {
-        LauncherHelper.getInstance().setOnPrimaryHomeScreen(true);
-        PowerMockito.spy(U.class);
-        BooleanAnswer canDrawOverlaysAnswer = new BooleanAnswer();
-        when(U.canDrawOverlays(context)).thenAnswer(canDrawOverlaysAnswer);
-        canDrawOverlaysAnswer.answer = true;
-        TestRunnable runnable = new TestRunnable();
-        Context context = ApplicationProvider.getApplicationContext();
-        uiController.init(context, hostService, runnable);
-        assertTrue(runnable.hasRun);
-        runnable.hasRun = false;
-        canDrawOverlaysAnswer.answer = false;
-        uiController.init(context, hostService, runnable);
-        ShadowService shadowService = Shadows.shadowOf(hostService);
-        assertTrue(shadowService.isStoppedBySelf());
-        assertFalse(
-                U.getSharedPreferences(context).getBoolean(PREF_TASKBAR_ACTIVE, true)
-        );
-    }
-
-    private void setTaskbarActive(boolean active) {
-        U.getSharedPreferences(context)
-                .edit()
-                .putBoolean(PREF_TASKBAR_ACTIVE, active)
-                .apply();
-    }
-
-    private static final class TestRunnable implements Runnable {
-        boolean hasRun = false;
-
-        @Override
-        public void run() {
-            hasRun = true;
-        }
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/UIControllerTest.kt b/app/src/test/java/com/farmerbb/taskbar/ui/UIControllerTest.kt
new file mode 100644 (file)
index 0000000..a8330d3
--- /dev/null
@@ -0,0 +1,98 @@
+package com.farmerbb.taskbar.ui
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.helper.LauncherHelper
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.util.Constants
+import com.farmerbb.taskbar.util.U
+import org.junit.*
+import org.junit.runner.RunWith
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.android.controller.ServiceController
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(U::class)
+class UIControllerTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var controller: ServiceController<TestUIHostService>? = null
+    private var hostService: TestUIHostService? = null
+    private var uiController: TestUIController? = null
+    private var context: Context? = null
+
+    @Before
+    fun setUp() {
+        controller = Robolectric.buildService(TestUIHostService::class.java)
+        hostService = controller!!.create().get()
+        uiController = hostService!!.controller
+        context = ApplicationProvider.getApplicationContext()
+    }
+
+    @After
+    fun tearDown() {
+        setTaskbarActive(false)
+    }
+
+    @Test
+    fun testInitWithoutProceed() {
+        LauncherHelper.getInstance().setOnSecondaryHomeScreen(true, 1)
+        val runnable = TestRunnable()
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        uiController!!.init(context, hostService, runnable)
+        val shadowService = Shadows.shadowOf(hostService)
+        Assert.assertTrue(shadowService.isStoppedBySelf)
+    }
+
+    @Test
+    fun testInitWithProceedAndTaskbarActive() {
+        setTaskbarActive(true)
+        testInitWithProceed()
+    }
+
+    @Test
+    fun testInitWithProceedAndOnHomeScreen() {
+        testInitWithoutProceed()
+    }
+
+    private fun testInitWithProceed() {
+        LauncherHelper.getInstance().setOnPrimaryHomeScreen(true)
+        PowerMockito.spy(U::class.java)
+        val canDrawOverlaysAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.canDrawOverlays(context)).thenAnswer(canDrawOverlaysAnswer)
+        canDrawOverlaysAnswer.answer = true
+        val runnable = TestRunnable()
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        uiController!!.init(context, hostService, runnable)
+        Assert.assertTrue(runnable.hasRun)
+        runnable.hasRun = false
+        canDrawOverlaysAnswer.answer = false
+        uiController!!.init(context, hostService, runnable)
+        val shadowService = Shadows.shadowOf(hostService)
+        Assert.assertTrue(shadowService.isStoppedBySelf)
+        Assert.assertFalse(
+                U.getSharedPreferences(context).getBoolean(Constants.PREF_TASKBAR_ACTIVE, true)
+        )
+    }
+
+    private fun setTaskbarActive(active: Boolean) {
+        U.getSharedPreferences(context)
+                .edit()
+                .putBoolean(Constants.PREF_TASKBAR_ACTIVE, active)
+                .apply()
+    }
+
+    private class TestRunnable : Runnable {
+        var hasRun = false
+        override fun run() {
+            hasRun = true
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/UIHostServiceTest.java b/app/src/test/java/com/farmerbb/taskbar/ui/UIHostServiceTest.java
deleted file mode 100644 (file)
index 7724a4f..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.content.res.Configuration;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.android.controller.ServiceController;
-import org.robolectric.shadows.ShadowService;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class UIHostServiceTest {
-    private ServiceController<TestUIHostService> controller;
-    private TestUIHostService hostService;
-    private TestUIController uiController;
-
-    @Before
-    public void setUp() {
-        controller = Robolectric.buildService(TestUIHostService.class);
-        hostService = controller.create().get();
-        uiController = hostService.controller;
-    }
-
-    @After
-    public void tearDown() {
-        uiController.onCreateHost = null;
-        uiController.onRecreateHost = null;
-        uiController.onDestroyHost = null;
-    }
-
-    @Test
-    public void testOnCreate() {
-        assertEquals(uiController.onCreateHost, hostService);
-    }
-
-    @Test
-    public void testOnConfigurationChanged() {
-        assertNull(uiController.onRecreateHost);
-        hostService.onConfigurationChanged(new Configuration());
-        assertEquals(hostService, uiController.onRecreateHost);
-    }
-
-    @Test
-    public void testOnDestroy() {
-        assertNull(uiController.onDestroyHost);
-        controller.destroy();
-        assertEquals(hostService, uiController.onDestroyHost);
-    }
-
-    @Test
-    public void testTerminate() {
-        ShadowService shadowService = Shadows.shadowOf(hostService);
-        assertFalse(shadowService.isStoppedBySelf());
-        hostService.terminate();
-        assertTrue(shadowService.isStoppedBySelf());
-    }
-
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/UIHostServiceTest.kt b/app/src/test/java/com/farmerbb/taskbar/ui/UIHostServiceTest.kt
new file mode 100644 (file)
index 0000000..df062a3
--- /dev/null
@@ -0,0 +1,60 @@
+package com.farmerbb.taskbar.ui
+
+import android.content.res.Configuration
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.android.controller.ServiceController
+
+@RunWith(RobolectricTestRunner::class)
+class UIHostServiceTest {
+    private var controller: ServiceController<TestUIHostService>? = null
+    private var hostService: TestUIHostService? = null
+    private var uiController: TestUIController? = null
+
+    @Before
+    fun setUp() {
+        controller = Robolectric.buildService(TestUIHostService::class.java)
+        hostService = controller!!.create().get()
+        uiController = hostService!!.controller
+    }
+
+    @After
+    fun tearDown() {
+        uiController!!.onCreateHost = null
+        uiController!!.onRecreateHost = null
+        uiController!!.onDestroyHost = null
+    }
+
+    @Test
+    fun testOnCreate() {
+        Assert.assertEquals(uiController!!.onCreateHost, hostService)
+    }
+
+    @Test
+    fun testOnConfigurationChanged() {
+        Assert.assertNull(uiController!!.onRecreateHost)
+        hostService!!.onConfigurationChanged(Configuration())
+        Assert.assertEquals(hostService, uiController!!.onRecreateHost)
+    }
+
+    @Test
+    fun testOnDestroy() {
+        Assert.assertNull(uiController!!.onDestroyHost)
+        controller!!.destroy()
+        Assert.assertEquals(hostService, uiController!!.onDestroyHost)
+    }
+
+    @Test
+    fun testTerminate() {
+        val shadowService = Shadows.shadowOf(hostService)
+        Assert.assertFalse(shadowService.isStoppedBySelf)
+        hostService!!.terminate()
+        Assert.assertTrue(shadowService.isStoppedBySelf)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/ViewParamsTest.java b/app/src/test/java/com/farmerbb/taskbar/ui/ViewParamsTest.java
deleted file mode 100644 (file)
index 7c7ac94..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.farmerbb.taskbar.ui;
-
-import android.graphics.PixelFormat;
-import android.view.Gravity;
-import android.view.WindowManager;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(RobolectricTestRunner.class)
-public class ViewParamsTest {
-    @Test
-    public void testToWindowManagerParams() {
-        int width = 100;
-        int height = 101;
-        int gravity = Gravity.BOTTOM;
-        int flags = 1001;
-        int bottomMargin = 102;
-        ViewParams params = new ViewParams(width, height, gravity, flags, bottomMargin);
-        WindowManager.LayoutParams generatedParams = params.toWindowManagerParams();
-        assertEquals(width, generatedParams.width);
-        assertEquals(height, generatedParams.height);
-        assertEquals(gravity, generatedParams.gravity);
-        assertEquals(flags, generatedParams.flags);
-        assertEquals(bottomMargin, generatedParams.y);
-        assertEquals(PixelFormat.TRANSLUCENT, generatedParams.format);
-        assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, generatedParams.type);
-        params.gravity = -1;
-        generatedParams = params.toWindowManagerParams();
-        assertEquals(0, generatedParams.gravity);
-        params.bottomMargin = -1;
-        generatedParams = params.toWindowManagerParams();
-        assertEquals(0, generatedParams.y);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/ui/ViewParamsTest.kt b/app/src/test/java/com/farmerbb/taskbar/ui/ViewParamsTest.kt
new file mode 100644 (file)
index 0000000..74ca6a7
--- /dev/null
@@ -0,0 +1,36 @@
+package com.farmerbb.taskbar.ui
+
+import android.graphics.PixelFormat
+import android.view.Gravity
+import android.view.WindowManager
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class ViewParamsTest {
+    @Test
+    fun testToWindowManagerParams() {
+        val width = 100
+        val height = 101
+        val gravity = Gravity.BOTTOM
+        val flags = 1001
+        val bottomMargin = 102
+        val params = ViewParams(width, height, gravity, flags, bottomMargin)
+        var generatedParams = params.toWindowManagerParams()
+        Assert.assertEquals(width.toLong(), generatedParams.width.toLong())
+        Assert.assertEquals(height.toLong(), generatedParams.height.toLong())
+        Assert.assertEquals(gravity.toLong(), generatedParams.gravity.toLong())
+        Assert.assertEquals(flags.toLong(), generatedParams.flags.toLong())
+        Assert.assertEquals(bottomMargin.toLong(), generatedParams.y.toLong())
+        Assert.assertEquals(PixelFormat.TRANSLUCENT.toLong(), generatedParams.format.toLong())
+        Assert.assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY.toLong(), generatedParams.type.toLong())
+        params.gravity = -1
+        generatedParams = params.toWindowManagerParams()
+        Assert.assertEquals(0, generatedParams.gravity.toLong())
+        params.bottomMargin = -1
+        generatedParams = params.toWindowManagerParams()
+        Assert.assertEquals(0, generatedParams.y.toLong())
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/AppEntryTest.java b/app/src/test/java/com/farmerbb/taskbar/util/AppEntryTest.java
deleted file mode 100644 (file)
index 4acae52..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Process;
-import android.os.UserManager;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.activity.MainActivity;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(RobolectricTestRunner.class)
-public class AppEntryTest {
-    private Context context;
-    private AppEntry appEntry;
-    private ComponentName componentName;
-    private Drawable icon;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        componentName = new ComponentName(context, MainActivity.class);
-        icon = context.getResources().getDrawable(R.drawable.tb_apps);
-        appEntry = new AppEntry(
-                context.getPackageName(),
-                componentName.flattenToString(),
-                context.getPackageName(),
-                icon,
-                true
-        );
-    }
-
-    @Test
-    public void testGetComponentName() {
-        assertEquals(componentName.flattenToString(), appEntry.getComponentName());
-    }
-
-    @Test
-    public void testGetPackageName() {
-        assertEquals(context.getPackageName(), appEntry.getPackageName());
-    }
-
-    @Test
-    public void testGetLabel() {
-        assertEquals(context.getPackageName(), appEntry.getLabel());
-    }
-
-    @Test
-    public void testGetUserId() {
-        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        long currentUser = userManager.getSerialNumberForUser(Process.myUserHandle());
-        assertEquals(currentUser, appEntry.getUserId(context));
-        appEntry.setUserId(currentUser + 1);
-        assertEquals(currentUser + 1, appEntry.getUserId(context));
-        appEntry.setUserId(currentUser);
-    }
-
-    @Test
-    public void testGetIcon() {
-        assertEquals(icon, appEntry.getIcon(context));
-    }
-
-    @Test
-    public void testSetLastTimeUsed() {
-        assertEquals(0, appEntry.getLastTimeUsed());
-        appEntry.setLastTimeUsed(100);
-        assertEquals(100, appEntry.getLastTimeUsed());
-        appEntry.setLastTimeUsed(0);
-    }
-
-    @Test
-    public void testSetTotalTimeInForeground() {
-        assertEquals(0, appEntry.getTotalTimeInForeground());
-        appEntry.setTotalTimeInForeground(100);
-        assertEquals(100, appEntry.getTotalTimeInForeground());
-        appEntry.setTotalTimeInForeground(0);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/AppEntryTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/AppEntryTest.kt
new file mode 100644 (file)
index 0000000..db7aef7
--- /dev/null
@@ -0,0 +1,83 @@
+package com.farmerbb.taskbar.util
+
+import android.content.ComponentName
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.os.Process
+import android.os.UserManager
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.activity.MainActivity
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class AppEntryTest {
+    private var context: Context? = null
+    private var appEntry: AppEntry? = null
+    private var componentName: ComponentName? = null
+    private var icon: Drawable? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        componentName = ComponentName(context!!, MainActivity::class.java)
+        icon = context!!.resources.getDrawable(R.drawable.tb_apps)
+        appEntry = AppEntry(
+                context!!.packageName,
+                componentName!!.flattenToString(),
+                context!!.packageName,
+                icon,
+                true
+        )
+    }
+
+    @Test
+    fun testGetComponentName() {
+        Assert.assertEquals(componentName!!.flattenToString(), appEntry!!.componentName)
+    }
+
+    @Test
+    fun testGetPackageName() {
+        Assert.assertEquals(context!!.packageName, appEntry!!.packageName)
+    }
+
+    @Test
+    fun testGetLabel() {
+        Assert.assertEquals(context!!.packageName, appEntry!!.label)
+    }
+
+    @Test
+    fun testGetUserId() {
+        val userManager = context!!.getSystemService(Context.USER_SERVICE) as UserManager
+        val currentUser = userManager.getSerialNumberForUser(Process.myUserHandle())
+        Assert.assertEquals(currentUser, appEntry!!.getUserId(context))
+        appEntry!!.setUserId(currentUser + 1)
+        Assert.assertEquals(currentUser + 1, appEntry!!.getUserId(context))
+        appEntry!!.setUserId(currentUser)
+    }
+
+    @Test
+    fun testGetIcon() {
+        Assert.assertEquals(icon, appEntry!!.getIcon(context))
+    }
+
+    @Test
+    fun testSetLastTimeUsed() {
+        Assert.assertEquals(0, appEntry!!.lastTimeUsed)
+        appEntry!!.lastTimeUsed = 100
+        Assert.assertEquals(100, appEntry!!.lastTimeUsed)
+        appEntry!!.lastTimeUsed = 0
+    }
+
+    @Test
+    fun testSetTotalTimeInForeground() {
+        Assert.assertEquals(0, appEntry!!.totalTimeInForeground)
+        appEntry!!.totalTimeInForeground = 100
+        Assert.assertEquals(100, appEntry!!.totalTimeInForeground)
+        appEntry!!.totalTimeInForeground = 0
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/BlacklistTest.java b/app/src/test/java/com/farmerbb/taskbar/util/BlacklistTest.java
deleted file mode 100644 (file)
index f10c1a3..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class BlacklistTest {
-    private Context context;
-    private Blacklist blacklist;
-    private BlacklistEntry entry;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        blacklist = Blacklist.getInstance(context);
-        entry = new BlacklistEntry(context.getPackageName(), context.getPackageName());
-    }
-
-    @After
-    public void tearDown() {
-        blacklist.clear(context);
-    }
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(blacklist);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(blacklist, Blacklist.getInstance(context));
-        }
-    }
-
-    @Test
-    public void testAddBlockedApp() {
-        assertEquals(0, blacklist.getBlockedApps().size());
-        blacklist.addBlockedApp(context, entry);
-        assertEquals(1, blacklist.getBlockedApps().size());
-        assertTrue(blacklist.isBlocked(context.getPackageName()));
-    }
-
-    @Test
-    public void testRemoveBlockedApp() {
-        blacklist.addBlockedApp(context, entry);
-        blacklist.removeBlockedApp(context, context.getPackageName());
-        assertEquals(0, blacklist.getBlockedApps().size());
-    }
-
-    @Test
-    public void testClear() {
-        blacklist.addBlockedApp(context, entry);
-        blacklist.clear(context);
-        assertEquals(0, blacklist.getBlockedApps().size());
-    }
-
-    @Test
-    public void testSerializable() {
-        blacklist.addBlockedApp(context, entry);
-        Blacklist newBlacklist =
-                SerializationUtils.deserialize(SerializationUtils.serialize(blacklist));
-        assertTrue(newBlacklist.isBlocked(context.getPackageName()));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/BlacklistTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/BlacklistTest.kt
new file mode 100644 (file)
index 0000000..6726daf
--- /dev/null
@@ -0,0 +1,67 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import org.apache.commons.lang3.SerializationUtils
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class BlacklistTest {
+    private var context: Context? = null
+    private var blacklist: Blacklist? = null
+    private var entry: BlacklistEntry? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        blacklist = Blacklist.getInstance(context)
+        entry = BlacklistEntry(context!!.packageName, context!!.packageName)
+    }
+
+    @After
+    fun tearDown() {
+        blacklist!!.clear(context)
+    }
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(blacklist)
+        for (i in 1..20) {
+            Assert.assertEquals(blacklist, Blacklist.getInstance(context))
+        }
+    }
+
+    @Test
+    fun testAddBlockedApp() {
+        Assert.assertEquals(0, blacklist!!.blockedApps.size.toLong())
+        blacklist!!.addBlockedApp(context, entry)
+        Assert.assertEquals(1, blacklist!!.blockedApps.size.toLong())
+        Assert.assertTrue(blacklist!!.isBlocked(context!!.packageName))
+    }
+
+    @Test
+    fun testRemoveBlockedApp() {
+        blacklist!!.addBlockedApp(context, entry)
+        blacklist!!.removeBlockedApp(context, context!!.packageName)
+        Assert.assertEquals(0, blacklist!!.blockedApps.size.toLong())
+    }
+
+    @Test
+    fun testClear() {
+        blacklist!!.addBlockedApp(context, entry)
+        blacklist!!.clear(context)
+        Assert.assertEquals(0, blacklist!!.blockedApps.size.toLong())
+    }
+
+    @Test
+    fun testSerializable() {
+        blacklist!!.addBlockedApp(context, entry)
+        val newBlacklist = SerializationUtils.deserialize<Blacklist>(SerializationUtils.serialize(blacklist))
+        Assert.assertTrue(newBlacklist.isBlocked(context!!.packageName))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/DesktopIconInfoTest.java b/app/src/test/java/com/farmerbb/taskbar/util/DesktopIconInfoTest.java
deleted file mode 100644 (file)
index 1ef2597..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.LauncherApps;
-import android.graphics.drawable.Drawable;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.activity.MainActivity;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.util.ReflectionHelpers;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-@RunWith(RobolectricTestRunner.class)
-public class DesktopIconInfoTest {
-    private Context context;
-    private AppEntry appEntry;
-    private DesktopIconInfo desktopIconInfo;
-    private int defaultColumn = 3;
-    private int defaultRow = 3;
-    private String packageName;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        packageName = context.getPackageName();
-        Drawable icon = context.getResources().getDrawable(R.drawable.tb_apps);
-        ComponentName componentName = new ComponentName(context, MainActivity.class);
-        appEntry =
-                new AppEntry(
-                        packageName,
-                        componentName.flattenToString(),
-                        packageName,
-                        icon,
-                        false
-                );
-        desktopIconInfo = new DesktopIconInfo(defaultColumn, defaultRow, appEntry);
-    }
-
-    @Test
-    public void testFromJson() {
-        DesktopIconInfo newDesktopIconInfo =
-                DesktopIconInfo.fromJson(desktopIconInfo.toJson(context));
-        testNewDesktopIconInfo(newDesktopIconInfo);
-    }
-
-    @Test
-    public void testSerializable() {
-        DesktopIconInfo newDesktopIconInfo =
-                SerializationUtils.deserialize(SerializationUtils.serialize(desktopIconInfo));
-        testNewDesktopIconInfo(newDesktopIconInfo);
-    }
-
-    private void testNewDesktopIconInfo(DesktopIconInfo newDesktopIconInfo) {
-        assertNotNull(newDesktopIconInfo);
-        assertEquals(desktopIconInfo.column, newDesktopIconInfo.column);
-        assertEquals(desktopIconInfo.row, newDesktopIconInfo.row);
-        assertEquals(
-                desktopIconInfo.entry.getComponentName(),
-                newDesktopIconInfo.entry.getComponentName()
-        );
-        assertEquals(
-                desktopIconInfo.entry.getPackageName(),
-                newDesktopIconInfo.entry.getPackageName()
-        );
-        assertEquals(
-                desktopIconInfo.entry.getLabel(),
-                newDesktopIconInfo.entry.getLabel()
-        );
-        assertNotNull(ReflectionHelpers.getField(desktopIconInfo.entry, "icon"));
-        assertNull(ReflectionHelpers.getField(newDesktopIconInfo.entry, "icon"));
-    }
-}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/DesktopIconInfoTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/DesktopIconInfoTest.kt
new file mode 100644 (file)
index 0000000..7a11ff3
--- /dev/null
@@ -0,0 +1,72 @@
+package com.farmerbb.taskbar.util
+
+import android.content.ComponentName
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.activity.MainActivity
+import org.apache.commons.lang3.SerializationUtils
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.util.ReflectionHelpers
+
+@RunWith(RobolectricTestRunner::class)
+class DesktopIconInfoTest {
+    private var context: Context? = null
+    private var appEntry: AppEntry? = null
+    private var desktopIconInfo: DesktopIconInfo? = null
+    private val defaultColumn = 3
+    private val defaultRow = 3
+    private var packageName: String? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        packageName = context!!.packageName
+        val icon = context!!.resources.getDrawable(R.drawable.tb_apps)
+        val componentName = ComponentName(context!!, MainActivity::class.java)
+        appEntry = AppEntry(
+                packageName,
+                componentName.flattenToString(),
+                packageName,
+                icon,
+                false
+        )
+        desktopIconInfo = DesktopIconInfo(defaultColumn, defaultRow, appEntry)
+    }
+
+    @Test
+    fun testFromJson() {
+        val newDesktopIconInfo = DesktopIconInfo.fromJson(desktopIconInfo!!.toJson(context))
+        testNewDesktopIconInfo(newDesktopIconInfo)
+    }
+
+    @Test
+    fun testSerializable() {
+        val newDesktopIconInfo = SerializationUtils.deserialize<DesktopIconInfo>(SerializationUtils.serialize(desktopIconInfo))
+        testNewDesktopIconInfo(newDesktopIconInfo)
+    }
+
+    private fun testNewDesktopIconInfo(newDesktopIconInfo: DesktopIconInfo) {
+        Assert.assertNotNull(newDesktopIconInfo)
+        Assert.assertEquals(desktopIconInfo!!.column.toLong(), newDesktopIconInfo.column.toLong())
+        Assert.assertEquals(desktopIconInfo!!.row.toLong(), newDesktopIconInfo.row.toLong())
+        Assert.assertEquals(
+                desktopIconInfo!!.entry.componentName,
+                newDesktopIconInfo.entry.componentName
+        )
+        Assert.assertEquals(
+                desktopIconInfo!!.entry.packageName,
+                newDesktopIconInfo.entry.packageName
+        )
+        Assert.assertEquals(
+                desktopIconInfo!!.entry.label,
+                newDesktopIconInfo.entry.label
+        )
+        Assert.assertNotNull(ReflectionHelpers.getField(desktopIconInfo!!.entry, "icon"))
+        Assert.assertNull(ReflectionHelpers.getField(newDesktopIconInfo.entry, "icon"))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/FABWrapperTest.java b/app/src/test/java/com/farmerbb/taskbar/util/FABWrapperTest.java
deleted file mode 100644 (file)
index 17ad837..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-import android.view.View;
-
-import androidx.core.content.ContextCompat;
-import androidx.lifecycle.Lifecycle;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.activity.HomeActivity;
-import com.farmerbb.taskbar.activity.MainActivity;
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class FABWrapperTest {
-    private Context context;
-    private FABWrapper wrapper;
-    private ActivityScenario<MainActivity> scenario;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        scenario = ActivityScenario.launch(MainActivity.class);
-        scenario.moveToState(Lifecycle.State.RESUMED);
-        scenario.onActivity(activity -> wrapper = new FABWrapper(activity));
-    }
-
-    @After
-    public void tearDown() {
-        scenario.moveToState(Lifecycle.State.DESTROYED);
-    }
-
-    @Test
-    public void testViewForNonAndroidX86Version() {
-        assertTrue(wrapper.view instanceof FloatingActionButton);
-        int padding = context.getResources().getDimensionPixelSize(R.dimen.tb_fake_fab_padding);
-        assertEquals(padding, wrapper.view.getPaddingLeft());
-        assertEquals(padding, wrapper.view.getPaddingTop());
-        assertEquals(padding, wrapper.view.getPaddingRight());
-        assertEquals(padding, wrapper.view.getPaddingBottom());
-    }
-
-    @Test
-    public void testShow() {
-        wrapper.show();
-        assertEquals(View.VISIBLE, wrapper.view.getVisibility());
-    }
-
-    @Test
-    public void testHide() {
-        wrapper.show();
-        wrapper.hide();
-        assertEquals(View.GONE, wrapper.view.getVisibility());
-    }
-}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/FABWrapperTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/FABWrapperTest.kt
new file mode 100644 (file)
index 0000000..ad042a8
--- /dev/null
@@ -0,0 +1,59 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import android.view.View
+import androidx.lifecycle.Lifecycle
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.activity.MainActivity
+import com.google.android.material.floatingactionbutton.FloatingActionButton
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class FABWrapperTest {
+    private var context: Context? = null
+    private var wrapper: FABWrapper? = null
+    private var scenario: ActivityScenario<MainActivity>? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        scenario = ActivityScenario.launch(MainActivity::class.java)
+        scenario!!.moveToState(Lifecycle.State.RESUMED)
+        scenario!!.onActivity { activity: MainActivity? -> wrapper = FABWrapper(activity) }
+    }
+
+    @After
+    fun tearDown() {
+        scenario!!.moveToState(Lifecycle.State.DESTROYED)
+    }
+
+    @Test
+    fun testViewForNonAndroidX86Version() {
+        Assert.assertTrue(wrapper!!.view is FloatingActionButton)
+        val padding = context!!.resources.getDimensionPixelSize(R.dimen.tb_fake_fab_padding)
+        Assert.assertEquals(padding.toLong(), wrapper!!.view.paddingLeft.toLong())
+        Assert.assertEquals(padding.toLong(), wrapper!!.view.paddingTop.toLong())
+        Assert.assertEquals(padding.toLong(), wrapper!!.view.paddingRight.toLong())
+        Assert.assertEquals(padding.toLong(), wrapper!!.view.paddingBottom.toLong())
+    }
+
+    @Test
+    fun testShow() {
+        wrapper!!.show()
+        Assert.assertEquals(View.VISIBLE.toLong(), wrapper!!.view.visibility.toLong())
+    }
+
+    @Test
+    fun testHide() {
+        wrapper!!.show()
+        wrapper!!.hide()
+        Assert.assertEquals(View.GONE.toLong(), wrapper!!.view.visibility.toLong())
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/IconPackManagerTest.java b/app/src/test/java/com/farmerbb/taskbar/util/IconPackManagerTest.java
deleted file mode 100644 (file)
index 14323d9..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowPackageManager;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-
-@RunWith(RobolectricTestRunner.class)
-public class IconPackManagerTest {
-    private IconPackManager iconPackManager = IconPackManager.getInstance();
-    private Context context;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-    }
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(iconPackManager);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(iconPackManager, IconPackManager.getInstance());
-        }
-    }
-
-    @Test
-    public void testGetAvailableIconPacks() throws PackageManager.NameNotFoundException {
-        List<IconPack> iconPacks = iconPackManager.getAvailableIconPacks(context);
-        assertEquals(0, iconPacks.size());
-
-        String testPackageName = "com.test.package";
-        PackageManager packageManager = context.getPackageManager();
-        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(packageManager);
-        int testIconPackSize = 20;
-        for (int i = 1; i <= testIconPackSize; i++) {
-            ComponentName componentName =
-                    new ComponentName(testPackageName + i, testPackageName + i);
-            IntentFilter intentFilter = new IntentFilter("org.adw.launcher.THEMES");
-            shadowPackageManager.addActivityIfNotPresent(componentName);
-            shadowPackageManager.addIntentFilterForActivity(componentName, intentFilter);
-            iconPacks = iconPackManager.getAvailableIconPacks(context);
-        }
-        assertEquals(testIconPackSize, iconPacks.size());
-        Set<String> fetchedIconPackPackages = new HashSet<>();
-        iconPacks.forEach(iconPack -> fetchedIconPackPackages.add(iconPack.getPackageName()));
-        assertEquals(testIconPackSize, fetchedIconPackPackages.size());
-        Set<String> expectedIconPackPackages = new HashSet<>();
-        for (int i = 1; i <= testIconPackSize; i++) {
-            expectedIconPackPackages.add(testPackageName + i);
-            shadowPackageManager.removeActivity(
-                    new ComponentName(testPackageName + i, testPackageName + i)
-            );
-        }
-        assertEquals(expectedIconPackPackages, fetchedIconPackPackages);
-    }
-
-    @Test
-    public void testGetIconPack() {
-        IconPack iconPack = iconPackManager.getIconPack(context.getPackageName());
-        assertNotNull(iconPack);
-        assertEquals(context.getPackageName(), iconPack.getPackageName());
-        assertSame(iconPack, iconPackManager.getIconPack(context.getPackageName()));
-        iconPackManager.nullify();
-        IconPack newIconPack = iconPackManager.getIconPack(context.getPackageName());
-        assertEquals(context.getPackageName(), newIconPack.getPackageName());
-        assertNotSame(iconPack, newIconPack);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/IconPackManagerTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/IconPackManagerTest.kt
new file mode 100644 (file)
index 0000000..f0564b7
--- /dev/null
@@ -0,0 +1,76 @@
+package com.farmerbb.taskbar.util
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.IntentFilter
+import android.content.pm.PackageManager
+import androidx.test.core.app.ApplicationProvider
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import java.util.*
+import java.util.function.Consumer
+
+@RunWith(RobolectricTestRunner::class)
+class IconPackManagerTest {
+    private val iconPackManager = IconPackManager.getInstance()
+    private var context: Context? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+    }
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(iconPackManager)
+        for (i in 1..20) {
+            Assert.assertEquals(iconPackManager, IconPackManager.getInstance())
+        }
+    }
+
+    @Test
+    @Throws(PackageManager.NameNotFoundException::class)
+    fun testGetAvailableIconPacks() {
+        var iconPacks = iconPackManager.getAvailableIconPacks(context)
+        Assert.assertEquals(0, iconPacks.size.toLong())
+        val testPackageName = "com.test.package"
+        val packageManager = context!!.packageManager
+        val shadowPackageManager = Shadows.shadowOf(packageManager)
+        val testIconPackSize = 20
+        for (i in 1..testIconPackSize) {
+            val componentName = ComponentName(testPackageName + i, testPackageName + i)
+            val intentFilter = IntentFilter("org.adw.launcher.THEMES")
+            shadowPackageManager.addActivityIfNotPresent(componentName)
+            shadowPackageManager.addIntentFilterForActivity(componentName, intentFilter)
+            iconPacks = iconPackManager.getAvailableIconPacks(context)
+        }
+        Assert.assertEquals(testIconPackSize.toLong(), iconPacks.size.toLong())
+        val fetchedIconPackPackages: MutableSet<String> = HashSet()
+        iconPacks.forEach(Consumer { iconPack: IconPack -> fetchedIconPackPackages.add(iconPack.packageName) })
+        Assert.assertEquals(testIconPackSize.toLong(), fetchedIconPackPackages.size.toLong())
+        val expectedIconPackPackages: MutableSet<String> = HashSet()
+        for (i in 1..testIconPackSize) {
+            expectedIconPackPackages.add(testPackageName + i)
+            shadowPackageManager.removeActivity(
+                    ComponentName(testPackageName + i, testPackageName + i)
+            )
+        }
+        Assert.assertEquals(expectedIconPackPackages, fetchedIconPackPackages)
+    }
+
+    @Test
+    fun testGetIconPack() {
+        val iconPack = iconPackManager.getIconPack(context!!.packageName)
+        Assert.assertNotNull(iconPack)
+        Assert.assertEquals(context!!.packageName, iconPack.packageName)
+        Assert.assertSame(iconPack, iconPackManager.getIconPack(context!!.packageName))
+        iconPackManager.nullify()
+        val newIconPack = iconPackManager.getIconPack(context!!.packageName)
+        Assert.assertEquals(context!!.packageName, newIconPack.packageName)
+        Assert.assertNotSame(iconPack, newIconPack)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/PinnedBlockedAppsTest.java b/app/src/test/java/com/farmerbb/taskbar/util/PinnedBlockedAppsTest.java
deleted file mode 100644 (file)
index 6e61e50..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class PinnedBlockedAppsTest {
-    private Context context;
-    private String packageName;
-    private PinnedBlockedApps pinnedBlockedApps;
-    private AppEntry appEntry;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        pinnedBlockedApps = PinnedBlockedApps.getInstance(context);
-        packageName = context.getPackageName();
-        appEntry = new AppEntry(packageName, packageName, packageName, null, false);
-    }
-
-    @After
-    public void tearDown() {
-        pinnedBlockedApps.getBlockedApps().clear();
-        pinnedBlockedApps.getPinnedApps().clear();
-    }
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(pinnedBlockedApps);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(pinnedBlockedApps, PinnedBlockedApps.getInstance(context));
-        }
-    }
-
-    @Test
-    public void testAddPinnedApp() {
-        List<AppEntry> pinnedApps = pinnedBlockedApps.getPinnedApps();
-        assertEquals(0, pinnedApps.size());
-        pinnedBlockedApps.addPinnedApp(context, appEntry);
-        pinnedApps = pinnedBlockedApps.getPinnedApps();
-        assertEquals(1, pinnedApps.size());
-        assertEquals(appEntry, pinnedApps.get(0));
-    }
-
-    @Test
-    public void testRemovePinnedApp() {
-        pinnedBlockedApps.addPinnedApp(context, appEntry);
-        pinnedBlockedApps.removePinnedApp(context, packageName);
-        assertEquals(0, pinnedBlockedApps.getPinnedApps().size());
-    }
-
-    @Test
-    public void testAddBlockedApp() {
-        List<AppEntry> blockedApps = pinnedBlockedApps.getBlockedApps();
-        assertEquals(0, blockedApps.size());
-        pinnedBlockedApps.addBlockedApp(context, appEntry);
-        blockedApps = pinnedBlockedApps.getBlockedApps();
-        assertEquals(1, blockedApps.size());
-        assertEquals(appEntry, blockedApps.get(0));
-    }
-
-    @Test
-    public void testRemoveBlockedApp() {
-        pinnedBlockedApps.addBlockedApp(context, appEntry);
-        pinnedBlockedApps.removeBlockedApp(context, packageName);
-        assertEquals(0, pinnedBlockedApps.getBlockedApps().size());
-    }
-
-    @Test
-    public void testIsPinned() {
-        assertFalse(pinnedBlockedApps.isPinned(packageName));
-        pinnedBlockedApps.addPinnedApp(context, appEntry);
-        assertTrue(pinnedBlockedApps.isPinned(packageName));
-    }
-
-    @Test
-    public void testIsBlocked() {
-        assertFalse(pinnedBlockedApps.isBlocked(packageName));
-        pinnedBlockedApps.addBlockedApp(context, appEntry);
-        assertTrue(pinnedBlockedApps.isBlocked(packageName));
-    }
-
-    @Test
-    public void testClear() {
-        pinnedBlockedApps.addPinnedApp(context, appEntry);
-        pinnedBlockedApps.addBlockedApp(context, appEntry);
-        pinnedBlockedApps.clear(context);
-        assertEquals(0, pinnedBlockedApps.getPinnedApps().size());
-        assertEquals(0, pinnedBlockedApps.getBlockedApps().size());
-    }
-
-    @Test
-    public void testSerializable() {
-        pinnedBlockedApps.addPinnedApp(context, appEntry);
-        pinnedBlockedApps.addBlockedApp(context, appEntry);
-        PinnedBlockedApps newPinnedBlockedApps =
-                SerializationUtils.deserialize(SerializationUtils.serialize(pinnedBlockedApps));
-        assertTrue(newPinnedBlockedApps.isPinned(packageName));
-        assertTrue(newPinnedBlockedApps.isBlocked(packageName));
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/PinnedBlockedAppsTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/PinnedBlockedAppsTest.kt
new file mode 100644 (file)
index 0000000..09ec5ef
--- /dev/null
@@ -0,0 +1,107 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import org.apache.commons.lang3.SerializationUtils
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class PinnedBlockedAppsTest {
+    private var context: Context? = null
+    private var packageName: String? = null
+    private var pinnedBlockedApps: PinnedBlockedApps? = null
+    private var appEntry: AppEntry? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        pinnedBlockedApps = PinnedBlockedApps.getInstance(context)
+        packageName = context!!.packageName
+        appEntry = AppEntry(packageName, packageName, packageName, null, false)
+    }
+
+    @After
+    fun tearDown() {
+        pinnedBlockedApps!!.blockedApps.clear()
+        pinnedBlockedApps!!.pinnedApps.clear()
+    }
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(pinnedBlockedApps)
+        for (i in 1..20) {
+            Assert.assertEquals(pinnedBlockedApps, PinnedBlockedApps.getInstance(context))
+        }
+    }
+
+    @Test
+    fun testAddPinnedApp() {
+        var pinnedApps = pinnedBlockedApps!!.pinnedApps
+        Assert.assertEquals(0, pinnedApps.size.toLong())
+        pinnedBlockedApps!!.addPinnedApp(context, appEntry)
+        pinnedApps = pinnedBlockedApps!!.pinnedApps
+        Assert.assertEquals(1, pinnedApps.size.toLong())
+        Assert.assertEquals(appEntry, pinnedApps[0])
+    }
+
+    @Test
+    fun testRemovePinnedApp() {
+        pinnedBlockedApps!!.addPinnedApp(context, appEntry)
+        pinnedBlockedApps!!.removePinnedApp(context, packageName)
+        Assert.assertEquals(0, pinnedBlockedApps!!.pinnedApps.size.toLong())
+    }
+
+    @Test
+    fun testAddBlockedApp() {
+        var blockedApps = pinnedBlockedApps!!.blockedApps
+        Assert.assertEquals(0, blockedApps.size.toLong())
+        pinnedBlockedApps!!.addBlockedApp(context, appEntry)
+        blockedApps = pinnedBlockedApps!!.blockedApps
+        Assert.assertEquals(1, blockedApps.size.toLong())
+        Assert.assertEquals(appEntry, blockedApps[0])
+    }
+
+    @Test
+    fun testRemoveBlockedApp() {
+        pinnedBlockedApps!!.addBlockedApp(context, appEntry)
+        pinnedBlockedApps!!.removeBlockedApp(context, packageName)
+        Assert.assertEquals(0, pinnedBlockedApps!!.blockedApps.size.toLong())
+    }
+
+    @Test
+    fun testIsPinned() {
+        Assert.assertFalse(pinnedBlockedApps!!.isPinned(packageName))
+        pinnedBlockedApps!!.addPinnedApp(context, appEntry)
+        Assert.assertTrue(pinnedBlockedApps!!.isPinned(packageName))
+    }
+
+    @Test
+    fun testIsBlocked() {
+        Assert.assertFalse(pinnedBlockedApps!!.isBlocked(packageName))
+        pinnedBlockedApps!!.addBlockedApp(context, appEntry)
+        Assert.assertTrue(pinnedBlockedApps!!.isBlocked(packageName))
+    }
+
+    @Test
+    fun testClear() {
+        pinnedBlockedApps!!.addPinnedApp(context, appEntry)
+        pinnedBlockedApps!!.addBlockedApp(context, appEntry)
+        pinnedBlockedApps!!.clear(context)
+        Assert.assertEquals(0, pinnedBlockedApps!!.pinnedApps.size.toLong())
+        Assert.assertEquals(0, pinnedBlockedApps!!.blockedApps.size.toLong())
+    }
+
+    @Test
+    fun testSerializable() {
+        pinnedBlockedApps!!.addPinnedApp(context, appEntry)
+        pinnedBlockedApps!!.addBlockedApp(context, appEntry)
+        val newPinnedBlockedApps = SerializationUtils.deserialize<PinnedBlockedApps>(SerializationUtils.serialize(pinnedBlockedApps))
+        Assert.assertTrue(newPinnedBlockedApps.isPinned(packageName))
+        Assert.assertTrue(newPinnedBlockedApps.isBlocked(packageName))
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/RunnableHooker.java b/app/src/test/java/com/farmerbb/taskbar/util/RunnableHooker.java
deleted file mode 100644 (file)
index 9eb760d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-/**
- * {@link RunnableHooker} for test.
- * <p>
- * It provides method to check whether the {@link Runnable#run} method has been invoked.
- * <p>
- * Also, the powermock can't process the code likes:
- *
- * <pre>
- *     Runnable runnable = new Runnable() {
- *         @Override
- *         public void run() {}
- *     }
- * </pre>
- * <p>
- * or
- *
- * <pre>
- *     Runnable runnable = () -> {}
- * </pre>
- * <p>
- * So we create a implementation to avoid powermock exception.
- */
-public class RunnableHooker implements Runnable {
-    private boolean hasRun = false;
-
-    @Override
-    public void run() {
-        hasRun = true;
-    }
-
-    public boolean hasRun() {
-        return hasRun;
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/RunnableHooker.kt b/app/src/test/java/com/farmerbb/taskbar/util/RunnableHooker.kt
new file mode 100644 (file)
index 0000000..a97f5bf
--- /dev/null
@@ -0,0 +1,38 @@
+package com.farmerbb.taskbar.util
+
+/**
+ * [RunnableHooker] for test.
+ *
+ *
+ * It provides method to check whether the [Runnable.run] method has been invoked.
+ *
+ *
+ * Also, the powermock can't process the code likes:
+ *
+ * <pre>
+ * Runnable runnable = new Runnable() {
+ * @Override
+ * public void run() {}
+ * }
+</pre> *
+ *
+ *
+ * or
+ *
+ * <pre>
+ * Runnable runnable = () -> {}
+</pre> *
+ *
+ *
+ * So we create a implementation to avoid powermock exception.
+ */
+class RunnableHooker : Runnable {
+    private var hasRun = false
+    override fun run() {
+        hasRun = true
+    }
+
+    fun hasRun(): Boolean {
+        return hasRun
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizeEntryTest.java b/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizeEntryTest.java
deleted file mode 100644 (file)
index c4e8f17..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(RobolectricTestRunner.class)
-public class SavedWindowSizeEntryTest {
-    private static final String COMPONENT_NAME = "test-component-name";
-    private static final String WINDOW_SIZE = "test-window-size";
-    private SavedWindowSizesEntry entry = new SavedWindowSizesEntry(COMPONENT_NAME, WINDOW_SIZE);
-
-    @Test
-    public void testGetComponentName() {
-        assertEquals(COMPONENT_NAME, entry.getComponentName());
-    }
-
-    @Test
-    public void testGetWindowSize() {
-        assertEquals(WINDOW_SIZE, entry.getWindowSize());
-    }
-
-    @Test
-    public void testSerializable() {
-        SavedWindowSizesEntry newEntry =
-                SerializationUtils.deserialize(SerializationUtils.serialize(entry));
-        assertEquals(entry.getComponentName(), newEntry.getComponentName());
-        assertEquals(entry.getWindowSize(), newEntry.getWindowSize());
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizeEntryTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizeEntryTest.kt
new file mode 100644 (file)
index 0000000..137bbdf
--- /dev/null
@@ -0,0 +1,34 @@
+package com.farmerbb.taskbar.util
+
+import org.apache.commons.lang3.SerializationUtils
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class SavedWindowSizeEntryTest {
+    private val entry = SavedWindowSizesEntry(COMPONENT_NAME, WINDOW_SIZE)
+
+    @Test
+    fun testGetComponentName() {
+        Assert.assertEquals(COMPONENT_NAME, entry.componentName)
+    }
+
+    @Test
+    fun testGetWindowSize() {
+        Assert.assertEquals(WINDOW_SIZE, entry.windowSize)
+    }
+
+    @Test
+    fun testSerializable() {
+        val newEntry = SerializationUtils.deserialize<SavedWindowSizesEntry>(SerializationUtils.serialize(entry))
+        Assert.assertEquals(entry.componentName, newEntry.componentName)
+        Assert.assertEquals(entry.windowSize, newEntry.windowSize)
+    }
+
+    companion object {
+        private const val COMPONENT_NAME = "test-component-name"
+        private const val WINDOW_SIZE = "test-window-size"
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizesTest.java b/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizesTest.java
deleted file mode 100644 (file)
index 86070c6..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertNotEquals;
-
-import static com.farmerbb.taskbar.util.Constants.*;
-
-@RunWith(RobolectricTestRunner.class)
-public class SavedWindowSizesTest {
-    private static final String CUSTOM_WINDOW_SIZE = "custom-window-size";
-    private Context context;
-    private SavedWindowSizes savedWindowSizes;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        savedWindowSizes = SavedWindowSizes.getInstance(context);
-    }
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(savedWindowSizes);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(savedWindowSizes, SavedWindowSizes.getInstance(context));
-        }
-    }
-
-    @Test
-    public void testGetWindowSize() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        String defaultWindowSize = prefs.getString(PREF_WINDOW_SIZE, "standard");
-        assertEquals(
-                defaultWindowSize,
-                savedWindowSizes.getWindowSize(context, context.getPackageName())
-        );
-        String newWindowSize = defaultWindowSize + "-new";
-        prefs.edit().putString(PREF_WINDOW_SIZE, newWindowSize).apply();
-        assertEquals(
-                newWindowSize,
-                savedWindowSizes.getWindowSize(context, context.getPackageName())
-        );
-        prefs.edit().remove(PREF_WINDOW_SIZE).apply();
-        savedWindowSizes.setWindowSize(context, context.getPackageName(), CUSTOM_WINDOW_SIZE);
-        assertEquals(
-                CUSTOM_WINDOW_SIZE,
-                savedWindowSizes.getWindowSize(context, context.getPackageName())
-        );
-        savedWindowSizes.clear(context);
-    }
-
-    @Test
-    public void testClear() {
-        savedWindowSizes.setWindowSize(context, context.getPackageName(), CUSTOM_WINDOW_SIZE);
-        savedWindowSizes.clear(context);
-        assertNotEquals(
-                CUSTOM_WINDOW_SIZE,
-                savedWindowSizes.getWindowSize(context, context.getPackageName())
-        );
-    }
-
-    @Test
-    public void testSerializable() {
-        savedWindowSizes.setWindowSize(context, context.getPackageName(), CUSTOM_WINDOW_SIZE);
-        SavedWindowSizes newSavedWindowSizes =
-                SerializationUtils.deserialize(SerializationUtils.serialize(savedWindowSizes));
-        assertEquals(
-                CUSTOM_WINDOW_SIZE,
-                newSavedWindowSizes.getWindowSize(context, context.getPackageName())
-        );
-        savedWindowSizes.clear(context);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizesTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/SavedWindowSizesTest.kt
new file mode 100644 (file)
index 0000000..ad28db4
--- /dev/null
@@ -0,0 +1,78 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import junit.framework.Assert
+import org.apache.commons.lang3.SerializationUtils
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class SavedWindowSizesTest {
+    private var context: Context? = null
+    private var savedWindowSizes: SavedWindowSizes? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        savedWindowSizes = SavedWindowSizes.getInstance(context)
+    }
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(savedWindowSizes)
+        for (i in 1..20) {
+            Assert.assertEquals(savedWindowSizes, SavedWindowSizes.getInstance(context))
+        }
+    }
+
+    @Test
+    fun testGetWindowSize() {
+        val prefs = U.getSharedPreferences(context)
+        val defaultWindowSize = prefs.getString(Constants.PREF_WINDOW_SIZE, "standard")
+        Assert.assertEquals(
+                defaultWindowSize,
+                savedWindowSizes!!.getWindowSize(context, context!!.packageName)
+        )
+        val newWindowSize = "$defaultWindowSize-new"
+        prefs.edit().putString(Constants.PREF_WINDOW_SIZE, newWindowSize).apply()
+        Assert.assertEquals(
+                newWindowSize,
+                savedWindowSizes!!.getWindowSize(context, context!!.packageName)
+        )
+        prefs.edit().remove(Constants.PREF_WINDOW_SIZE).apply()
+        savedWindowSizes!!.setWindowSize(context, context!!.packageName, CUSTOM_WINDOW_SIZE)
+        Assert.assertEquals(
+                CUSTOM_WINDOW_SIZE,
+                savedWindowSizes!!.getWindowSize(context, context!!.packageName)
+        )
+        savedWindowSizes!!.clear(context)
+    }
+
+    @Test
+    fun testClear() {
+        savedWindowSizes!!.setWindowSize(context, context!!.packageName, CUSTOM_WINDOW_SIZE)
+        savedWindowSizes!!.clear(context)
+        org.junit.Assert.assertNotEquals(
+                CUSTOM_WINDOW_SIZE,
+                savedWindowSizes!!.getWindowSize(context, context!!.packageName)
+        )
+    }
+
+    @Test
+    fun testSerializable() {
+        savedWindowSizes!!.setWindowSize(context, context!!.packageName, CUSTOM_WINDOW_SIZE)
+        val newSavedWindowSizes = SerializationUtils.deserialize<SavedWindowSizes>(SerializationUtils.serialize(savedWindowSizes))
+        Assert.assertEquals(
+                CUSTOM_WINDOW_SIZE,
+                newSavedWindowSizes.getWindowSize(context, context!!.packageName)
+        )
+        savedWindowSizes!!.clear(context)
+    }
+
+    companion object {
+        private const val CUSTOM_WINDOW_SIZE = "custom-window-size"
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/TaskbarPositionTest.java b/app/src/test/java/com/farmerbb/taskbar/util/TaskbarPositionTest.java
deleted file mode 100644 (file)
index 8eacc40..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-import android.view.Display;
-import android.view.Surface;
-import android.view.WindowManager;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowDisplay;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Predicate;
-
-import static com.farmerbb.taskbar.util.TaskbarPosition.isBottom;
-import static com.farmerbb.taskbar.util.TaskbarPosition.isLeft;
-import static com.farmerbb.taskbar.util.TaskbarPosition.isRight;
-import static com.farmerbb.taskbar.util.TaskbarPosition.isVertical;
-import static com.farmerbb.taskbar.util.TaskbarPosition.isVerticalLeft;
-import static com.farmerbb.taskbar.util.TaskbarPosition.isVerticalRight;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import static com.farmerbb.taskbar.util.Constants.*;
-
-@RunWith(RobolectricTestRunner.class)
-public class TaskbarPositionTest {
-    private Context context;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        assertNotNull(context);
-    }
-
-    @Test
-    public void testIsVertical() {
-        assertFalse(isVertical(POSITION_BOTTOM_LEFT));
-        assertFalse(isVertical(POSITION_BOTTOM_RIGHT));
-        assertTrue(isVertical(POSITION_BOTTOM_VERTICAL_LEFT));
-        assertTrue(isVertical(POSITION_BOTTOM_VERTICAL_RIGHT));
-        assertFalse(isVertical(POSITION_TOP_LEFT));
-        assertFalse(isVertical(POSITION_TOP_RIGHT));
-        assertTrue(isVertical(POSITION_TOP_VERTICAL_LEFT));
-        assertTrue(isVertical(POSITION_TOP_VERTICAL_RIGHT));
-    }
-
-    @Test
-    public void testIsVerticalWithContext() {
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_LEFT, TaskbarPosition::isVertical, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_RIGHT, TaskbarPosition::isVertical, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_LEFT, TaskbarPosition::isVertical, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_RIGHT, TaskbarPosition::isVertical, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_LEFT, TaskbarPosition::isVertical, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_RIGHT, TaskbarPosition::isVertical, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_LEFT, TaskbarPosition::isVertical, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_RIGHT, TaskbarPosition::isVertical, true
-        );
-    }
-
-    @Test
-    public void testIsLeft() {
-        assertTrue(isLeft(POSITION_BOTTOM_LEFT));
-        assertFalse(isLeft(POSITION_BOTTOM_RIGHT));
-        assertTrue(isLeft(POSITION_BOTTOM_VERTICAL_LEFT));
-        assertFalse(isLeft(POSITION_BOTTOM_VERTICAL_RIGHT));
-        assertTrue(isLeft(POSITION_TOP_LEFT));
-        assertFalse(isLeft(POSITION_TOP_RIGHT));
-        assertTrue(isLeft(POSITION_TOP_VERTICAL_LEFT));
-        assertFalse(isLeft(POSITION_TOP_VERTICAL_RIGHT));
-    }
-
-    @Test
-    public void testIsLeftWithContext() {
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_LEFT, TaskbarPosition::isLeft, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_RIGHT, TaskbarPosition::isLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_LEFT, TaskbarPosition::isLeft, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_RIGHT, TaskbarPosition::isLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_LEFT, TaskbarPosition::isLeft, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_RIGHT, TaskbarPosition::isLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_LEFT, TaskbarPosition::isLeft, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_RIGHT, TaskbarPosition::isLeft, false
-        );
-    }
-
-    @Test
-    public void testIsRight() {
-        assertFalse(isRight(POSITION_BOTTOM_LEFT));
-        assertTrue(isRight(POSITION_BOTTOM_RIGHT));
-        assertFalse(isRight(POSITION_BOTTOM_VERTICAL_LEFT));
-        assertTrue(isRight(POSITION_BOTTOM_VERTICAL_RIGHT));
-        assertFalse(isRight(POSITION_TOP_LEFT));
-        assertTrue(isRight(POSITION_TOP_RIGHT));
-        assertFalse(isRight(POSITION_TOP_VERTICAL_LEFT));
-        assertTrue(isRight(POSITION_TOP_VERTICAL_RIGHT));
-    }
-
-    @Test
-    public void testIsRightWithContext() {
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_LEFT, TaskbarPosition::isRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_RIGHT, TaskbarPosition::isRight, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_LEFT, TaskbarPosition::isRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_RIGHT, TaskbarPosition::isRight, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_LEFT, TaskbarPosition::isRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_RIGHT, TaskbarPosition::isRight, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_LEFT, TaskbarPosition::isRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_RIGHT, TaskbarPosition::isRight, true
-        );
-    }
-
-    @Test
-    public void testIsBottom() {
-        assertTrue(isBottom(POSITION_BOTTOM_LEFT));
-        assertTrue(isBottom(POSITION_BOTTOM_RIGHT));
-        assertTrue(isBottom(POSITION_BOTTOM_VERTICAL_LEFT));
-        assertTrue(isBottom(POSITION_BOTTOM_VERTICAL_RIGHT));
-        assertFalse(isBottom(POSITION_TOP_LEFT));
-        assertFalse(isBottom(POSITION_TOP_RIGHT));
-        assertFalse(isBottom(POSITION_TOP_VERTICAL_LEFT));
-        assertFalse(isBottom(POSITION_TOP_VERTICAL_RIGHT));
-    }
-
-    @Test
-    public void testIsBottomWithContext() {
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_LEFT, TaskbarPosition::isBottom, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_RIGHT, TaskbarPosition::isBottom, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_LEFT, TaskbarPosition::isBottom, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_RIGHT, TaskbarPosition::isBottom, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_LEFT, TaskbarPosition::isBottom, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_RIGHT, TaskbarPosition::isBottom, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_LEFT, TaskbarPosition::isBottom, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_RIGHT, TaskbarPosition::isBottom, false
-        );
-    }
-
-    @Test
-    public void testIsVerticalLeft() {
-        assertFalse(isVerticalLeft(POSITION_BOTTOM_LEFT));
-        assertFalse(isVerticalLeft(POSITION_BOTTOM_RIGHT));
-        assertTrue(isVerticalLeft(POSITION_BOTTOM_VERTICAL_LEFT));
-        assertFalse(isVerticalLeft(POSITION_BOTTOM_VERTICAL_RIGHT));
-        assertFalse(isVerticalLeft(POSITION_TOP_LEFT));
-        assertFalse(isVerticalLeft(POSITION_TOP_RIGHT));
-        assertTrue(isVerticalLeft(POSITION_TOP_VERTICAL_LEFT));
-        assertFalse(isVerticalLeft(POSITION_TOP_VERTICAL_RIGHT));
-    }
-
-    @Test
-    public void testIsVerticalLeftWithContext() {
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_LEFT, TaskbarPosition::isVerticalLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_RIGHT, TaskbarPosition::isVerticalLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_LEFT, TaskbarPosition::isVerticalLeft, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_RIGHT, TaskbarPosition::isVerticalLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_LEFT, TaskbarPosition::isVerticalLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_RIGHT, TaskbarPosition::isVerticalLeft, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_LEFT, TaskbarPosition::isVerticalLeft, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_RIGHT, TaskbarPosition::isVerticalLeft, false
-        );
-    }
-
-    @Test
-    public void testIsVerticalRight() {
-        assertFalse(isVerticalRight(POSITION_BOTTOM_LEFT));
-        assertFalse(isVerticalRight(POSITION_BOTTOM_RIGHT));
-        assertFalse(isVerticalRight(POSITION_BOTTOM_VERTICAL_LEFT));
-        assertTrue(isVerticalRight(POSITION_BOTTOM_VERTICAL_RIGHT));
-        assertFalse(isVerticalRight(POSITION_TOP_LEFT));
-        assertFalse(isVerticalRight(POSITION_TOP_RIGHT));
-        assertFalse(isVerticalRight(POSITION_TOP_VERTICAL_LEFT));
-        assertTrue(isVerticalRight(POSITION_TOP_VERTICAL_RIGHT));
-    }
-
-    @Test
-    public void testIsVerticalRightWithContext() {
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_LEFT, TaskbarPosition::isVerticalRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_RIGHT, TaskbarPosition::isVerticalRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_LEFT, TaskbarPosition::isVerticalRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_BOTTOM_VERTICAL_RIGHT, TaskbarPosition::isVerticalRight, true
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_LEFT, TaskbarPosition::isVerticalRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_RIGHT, TaskbarPosition::isVerticalRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_LEFT, TaskbarPosition::isVerticalRight, false
-        );
-        checkTaskbarPositionGroup(
-                POSITION_TOP_VERTICAL_RIGHT, TaskbarPosition::isVerticalRight, true
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithoutAnchor() {
-        String position = TaskbarPosition.getTaskbarPosition(context);
-        // The default position is bottom_left
-        assertEquals(POSITION_BOTTOM_LEFT, position);
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionBottomLeft() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_BOTTOM_LEFT,
-                new ArrayList<String>() {{
-                    add(POSITION_BOTTOM_LEFT);
-                    add(POSITION_BOTTOM_VERTICAL_RIGHT);
-                    add(POSITION_TOP_RIGHT);
-                    add(POSITION_TOP_VERTICAL_LEFT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionBottomVerticalLeft() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_BOTTOM_VERTICAL_LEFT,
-                new ArrayList<String>() {{
-                    add(POSITION_BOTTOM_VERTICAL_LEFT);
-                    add(POSITION_BOTTOM_RIGHT);
-                    add(POSITION_TOP_VERTICAL_RIGHT);
-                    add(POSITION_TOP_LEFT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionBottomRight() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_BOTTOM_RIGHT,
-                new ArrayList<String>() {{
-                    add(POSITION_BOTTOM_RIGHT);
-                    add(POSITION_TOP_VERTICAL_RIGHT);
-                    add(POSITION_TOP_LEFT);
-                    add(POSITION_BOTTOM_VERTICAL_LEFT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionBottomVerticalRight() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_BOTTOM_VERTICAL_RIGHT,
-                new ArrayList<String>() {{
-                    add(POSITION_BOTTOM_VERTICAL_RIGHT);
-                    add(POSITION_TOP_RIGHT);
-                    add(POSITION_TOP_VERTICAL_LEFT);
-                    add(POSITION_BOTTOM_LEFT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionTopLeft() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_TOP_LEFT,
-                new ArrayList<String>() {{
-                    add(POSITION_TOP_LEFT);
-                    add(POSITION_BOTTOM_VERTICAL_LEFT);
-                    add(POSITION_BOTTOM_RIGHT);
-                    add(POSITION_TOP_VERTICAL_RIGHT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionTopVerticalLeft() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_TOP_VERTICAL_LEFT,
-                new ArrayList<String>() {{
-                    add(POSITION_TOP_VERTICAL_LEFT);
-                    add(POSITION_BOTTOM_LEFT);
-                    add(POSITION_BOTTOM_VERTICAL_RIGHT);
-                    add(POSITION_TOP_RIGHT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionTopRight() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_TOP_RIGHT,
-                new ArrayList<String>() {{
-                    add(POSITION_TOP_RIGHT);
-                    add(POSITION_TOP_VERTICAL_LEFT);
-                    add(POSITION_BOTTOM_LEFT);
-                    add(POSITION_BOTTOM_VERTICAL_RIGHT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndPositionTopVerticalRight() {
-        checkTaskbarPositionWithDifferentRotation(
-                POSITION_TOP_VERTICAL_RIGHT,
-                new ArrayList<String>() {{
-                    add(POSITION_TOP_VERTICAL_RIGHT);
-                    add(POSITION_TOP_LEFT);
-                    add(POSITION_BOTTOM_VERTICAL_LEFT);
-                    add(POSITION_BOTTOM_RIGHT);
-                }}
-        );
-    }
-
-    @Test
-    public void testGetTaskbarPositionWithAnchorAndInvalidPosition() {
-        checkTaskbarPositionWithDifferentRotation(
-                "invalid-position",
-                new ArrayList<String>() {{
-                    add(POSITION_BOTTOM_LEFT);
-                    add(POSITION_BOTTOM_LEFT);
-                    add(POSITION_BOTTOM_LEFT);
-                    add(POSITION_BOTTOM_LEFT);
-                }}
-        );
-    }
-
-    private void checkTaskbarPositionWithDifferentRotation(String originPosition,
-                                                           List<String> changedPositions) {
-        assertEquals(4, changedPositions.size());
-        String oldPosition =
-                U.getSharedPreferences(context).getString(PREF_POSITION, POSITION_BOTTOM_LEFT);
-        boolean oldAnchor =
-                U.getSharedPreferences(context).getBoolean(PREF_ANCHOR, false);
-        initializeTaskbarPosition(originPosition);
-        initializeRotation(Surface.ROTATION_0);
-        assertEquals(changedPositions.get(0), TaskbarPosition.getTaskbarPosition(context));
-        initializeRotation(Surface.ROTATION_90);
-        assertEquals(changedPositions.get(1), TaskbarPosition.getTaskbarPosition(context));
-        initializeRotation(Surface.ROTATION_180);
-        assertEquals(changedPositions.get(2), TaskbarPosition.getTaskbarPosition(context));
-        initializeRotation(Surface.ROTATION_270);
-        assertEquals(changedPositions.get(3), TaskbarPosition.getTaskbarPosition(context));
-        U.getSharedPreferences(context).edit().putBoolean(PREF_ANCHOR, oldAnchor).apply();
-        U.getSharedPreferences(context).edit().putString(PREF_POSITION, oldPosition).apply();
-    }
-
-    private void checkTaskbarPositionGroup(String originPosition,
-                                           Predicate<Context> predicate,
-                                           boolean expectedResult) {
-        String oldPosition =
-                U.getSharedPreferences(context).getString(PREF_POSITION, POSITION_BOTTOM_LEFT);
-        boolean oldAnchor =
-                U.getSharedPreferences(context).getBoolean(PREF_ANCHOR, false);
-        initializeTaskbarPosition(originPosition);
-        assertEquals(expectedResult, predicate.test(context));
-        U.getSharedPreferences(context).edit().putBoolean(PREF_ANCHOR, oldAnchor).apply();
-        U.getSharedPreferences(context).edit().putString(PREF_POSITION, oldPosition).apply();
-    }
-
-    private void initializeTaskbarPosition(String position) {
-        U.getSharedPreferences(context).edit().putBoolean(PREF_ANCHOR, true).apply();
-        U.getSharedPreferences(context).edit().putString(PREF_POSITION, position).apply();
-    }
-
-    private void initializeRotation(int rotation) {
-        WindowManager windowManager =
-                (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
-        Display display = windowManager.getDefaultDisplay();
-        ShadowDisplay shadowDisplay = Shadows.shadowOf(display);
-        shadowDisplay.setRotation(rotation);
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/TaskbarPositionTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/TaskbarPositionTest.kt
new file mode 100644 (file)
index 0000000..5e555cc
--- /dev/null
@@ -0,0 +1,448 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import android.view.Surface
+import android.view.WindowManager
+import androidx.test.core.app.ApplicationProvider
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import java.util.*
+import java.util.function.Predicate
+
+@RunWith(RobolectricTestRunner::class)
+class TaskbarPositionTest {
+    private var context: Context? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        Assert.assertNotNull(context)
+    }
+
+    @Test
+    fun testIsVertical() {
+        Assert.assertFalse(TaskbarPosition.isVertical(Constants.POSITION_BOTTOM_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVertical(Constants.POSITION_BOTTOM_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isVertical(Constants.POSITION_BOTTOM_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isVertical(Constants.POSITION_BOTTOM_VERTICAL_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isVertical(Constants.POSITION_TOP_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVertical(Constants.POSITION_TOP_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isVertical(Constants.POSITION_TOP_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isVertical(Constants.POSITION_TOP_VERTICAL_RIGHT))
+    }
+
+    @Test
+    fun testIsVerticalWithContext() {
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_LEFT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_LEFT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVertical(context) }, true
+        )
+    }
+
+    @Test
+    fun testIsLeft() {
+        Assert.assertTrue(TaskbarPosition.isLeft(Constants.POSITION_BOTTOM_LEFT))
+        Assert.assertFalse(TaskbarPosition.isLeft(Constants.POSITION_BOTTOM_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isLeft(Constants.POSITION_BOTTOM_VERTICAL_LEFT))
+        Assert.assertFalse(TaskbarPosition.isLeft(Constants.POSITION_BOTTOM_VERTICAL_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isLeft(Constants.POSITION_TOP_LEFT))
+        Assert.assertFalse(TaskbarPosition.isLeft(Constants.POSITION_TOP_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isLeft(Constants.POSITION_TOP_VERTICAL_LEFT))
+        Assert.assertFalse(TaskbarPosition.isLeft(Constants.POSITION_TOP_VERTICAL_RIGHT))
+    }
+
+    @Test
+    fun testIsLeftWithContext() {
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_LEFT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_RIGHT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_LEFT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_RIGHT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isLeft(context) }, false
+        )
+    }
+
+    @Test
+    fun testIsRight() {
+        Assert.assertFalse(TaskbarPosition.isRight(Constants.POSITION_BOTTOM_LEFT))
+        Assert.assertTrue(TaskbarPosition.isRight(Constants.POSITION_BOTTOM_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isRight(Constants.POSITION_BOTTOM_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isRight(Constants.POSITION_BOTTOM_VERTICAL_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isRight(Constants.POSITION_TOP_LEFT))
+        Assert.assertTrue(TaskbarPosition.isRight(Constants.POSITION_TOP_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isRight(Constants.POSITION_TOP_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isRight(Constants.POSITION_TOP_VERTICAL_RIGHT))
+    }
+
+    @Test
+    fun testIsRightWithContext() {
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_LEFT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_RIGHT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_LEFT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_RIGHT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isRight(context) }, true
+        )
+    }
+
+    @Test
+    fun testIsBottom() {
+        Assert.assertTrue(TaskbarPosition.isBottom(Constants.POSITION_BOTTOM_LEFT))
+        Assert.assertTrue(TaskbarPosition.isBottom(Constants.POSITION_BOTTOM_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isBottom(Constants.POSITION_BOTTOM_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isBottom(Constants.POSITION_BOTTOM_VERTICAL_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isBottom(Constants.POSITION_TOP_LEFT))
+        Assert.assertFalse(TaskbarPosition.isBottom(Constants.POSITION_TOP_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isBottom(Constants.POSITION_TOP_VERTICAL_LEFT))
+        Assert.assertFalse(TaskbarPosition.isBottom(Constants.POSITION_TOP_VERTICAL_RIGHT))
+    }
+
+    @Test
+    fun testIsBottomWithContext() {
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_LEFT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_RIGHT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_LEFT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_RIGHT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isBottom(context) }, false
+        )
+    }
+
+    @Test
+    fun testIsVerticalLeft() {
+        Assert.assertFalse(TaskbarPosition.isVerticalLeft(Constants.POSITION_BOTTOM_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVerticalLeft(Constants.POSITION_BOTTOM_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isVerticalLeft(Constants.POSITION_BOTTOM_VERTICAL_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVerticalLeft(Constants.POSITION_BOTTOM_VERTICAL_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isVerticalLeft(Constants.POSITION_TOP_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVerticalLeft(Constants.POSITION_TOP_RIGHT))
+        Assert.assertTrue(TaskbarPosition.isVerticalLeft(Constants.POSITION_TOP_VERTICAL_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVerticalLeft(Constants.POSITION_TOP_VERTICAL_RIGHT))
+    }
+
+    @Test
+    fun testIsVerticalLeftWithContext() {
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalLeft(context) }, false
+        )
+    }
+
+    @Test
+    fun testIsVerticalRight() {
+        Assert.assertFalse(TaskbarPosition.isVerticalRight(Constants.POSITION_BOTTOM_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVerticalRight(Constants.POSITION_BOTTOM_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isVerticalRight(Constants.POSITION_BOTTOM_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isVerticalRight(Constants.POSITION_BOTTOM_VERTICAL_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isVerticalRight(Constants.POSITION_TOP_LEFT))
+        Assert.assertFalse(TaskbarPosition.isVerticalRight(Constants.POSITION_TOP_RIGHT))
+        Assert.assertFalse(TaskbarPosition.isVerticalRight(Constants.POSITION_TOP_VERTICAL_LEFT))
+        Assert.assertTrue(TaskbarPosition.isVerticalRight(Constants.POSITION_TOP_VERTICAL_RIGHT))
+    }
+
+    @Test
+    fun testIsVerticalRightWithContext() {
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, true
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_LEFT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, false
+        )
+        checkTaskbarPositionGroup(
+                Constants.POSITION_TOP_VERTICAL_RIGHT, Predicate { context: Context? -> TaskbarPosition.isVerticalRight(context) }, true
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithoutAnchor() {
+        val position = TaskbarPosition.getTaskbarPosition(context)
+        // The default position is bottom_left
+        Assert.assertEquals(Constants.POSITION_BOTTOM_LEFT, position)
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionBottomLeft() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_BOTTOM_LEFT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                        add(Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+                        add(Constants.POSITION_TOP_RIGHT)
+                        add(Constants.POSITION_TOP_VERTICAL_LEFT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionBottomVerticalLeft() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_BOTTOM_VERTICAL_LEFT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                        add(Constants.POSITION_BOTTOM_RIGHT)
+                        add(Constants.POSITION_TOP_VERTICAL_RIGHT)
+                        add(Constants.POSITION_TOP_LEFT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionBottomRight() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_BOTTOM_RIGHT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_BOTTOM_RIGHT)
+                        add(Constants.POSITION_TOP_VERTICAL_RIGHT)
+                        add(Constants.POSITION_TOP_LEFT)
+                        add(Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionBottomVerticalRight() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_BOTTOM_VERTICAL_RIGHT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+                        add(Constants.POSITION_TOP_RIGHT)
+                        add(Constants.POSITION_TOP_VERTICAL_LEFT)
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionTopLeft() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_TOP_LEFT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_TOP_LEFT)
+                        add(Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                        add(Constants.POSITION_BOTTOM_RIGHT)
+                        add(Constants.POSITION_TOP_VERTICAL_RIGHT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionTopVerticalLeft() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_TOP_VERTICAL_LEFT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_TOP_VERTICAL_LEFT)
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                        add(Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+                        add(Constants.POSITION_TOP_RIGHT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionTopRight() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_TOP_RIGHT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_TOP_RIGHT)
+                        add(Constants.POSITION_TOP_VERTICAL_LEFT)
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                        add(Constants.POSITION_BOTTOM_VERTICAL_RIGHT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndPositionTopVerticalRight() {
+        checkTaskbarPositionWithDifferentRotation(
+                Constants.POSITION_TOP_VERTICAL_RIGHT,
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_TOP_VERTICAL_RIGHT)
+                        add(Constants.POSITION_TOP_LEFT)
+                        add(Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                        add(Constants.POSITION_BOTTOM_RIGHT)
+                    }
+                }
+        )
+    }
+
+    @Test
+    fun testGetTaskbarPositionWithAnchorAndInvalidPosition() {
+        checkTaskbarPositionWithDifferentRotation(
+                "invalid-position",
+                object : ArrayList<String>() {
+                    init {
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                        add(Constants.POSITION_BOTTOM_LEFT)
+                    }
+                }
+        )
+    }
+
+    private fun checkTaskbarPositionWithDifferentRotation(originPosition: String,
+                                                          changedPositions: List<String>) {
+        Assert.assertEquals(4, changedPositions.size.toLong())
+        val oldPosition = U.getSharedPreferences(context).getString(Constants.PREF_POSITION, Constants.POSITION_BOTTOM_LEFT)
+        val oldAnchor = U.getSharedPreferences(context).getBoolean(Constants.PREF_ANCHOR, false)
+        initializeTaskbarPosition(originPosition)
+        initializeRotation(Surface.ROTATION_0)
+        Assert.assertEquals(changedPositions[0], TaskbarPosition.getTaskbarPosition(context))
+        initializeRotation(Surface.ROTATION_90)
+        Assert.assertEquals(changedPositions[1], TaskbarPosition.getTaskbarPosition(context))
+        initializeRotation(Surface.ROTATION_180)
+        Assert.assertEquals(changedPositions[2], TaskbarPosition.getTaskbarPosition(context))
+        initializeRotation(Surface.ROTATION_270)
+        Assert.assertEquals(changedPositions[3], TaskbarPosition.getTaskbarPosition(context))
+        U.getSharedPreferences(context).edit().putBoolean(Constants.PREF_ANCHOR, oldAnchor).apply()
+        U.getSharedPreferences(context).edit().putString(Constants.PREF_POSITION, oldPosition).apply()
+    }
+
+    private fun checkTaskbarPositionGroup(originPosition: String,
+                                          predicate: Predicate<Context?>,
+                                          expectedResult: Boolean) {
+        val oldPosition = U.getSharedPreferences(context).getString(Constants.PREF_POSITION, Constants.POSITION_BOTTOM_LEFT)
+        val oldAnchor = U.getSharedPreferences(context).getBoolean(Constants.PREF_ANCHOR, false)
+        initializeTaskbarPosition(originPosition)
+        Assert.assertEquals(expectedResult, predicate.test(context))
+        U.getSharedPreferences(context).edit().putBoolean(Constants.PREF_ANCHOR, oldAnchor).apply()
+        U.getSharedPreferences(context).edit().putString(Constants.PREF_POSITION, oldPosition).apply()
+    }
+
+    private fun initializeTaskbarPosition(position: String) {
+        U.getSharedPreferences(context).edit().putBoolean(Constants.PREF_ANCHOR, true).apply()
+        U.getSharedPreferences(context).edit().putString(Constants.PREF_POSITION, position).apply()
+    }
+
+    private fun initializeRotation(rotation: Int) {
+        val windowManager = context!!.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+        val display = windowManager.defaultDisplay
+        val shadowDisplay = Shadows.shadowOf(display)
+        shadowDisplay.setRotation(rotation)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/ToastFrameworkImplTest.java b/app/src/test/java/com/farmerbb/taskbar/util/ToastFrameworkImplTest.java
deleted file mode 100644 (file)
index dca3497..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-import android.view.Gravity;
-import android.widget.Toast;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowToast;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class ToastFrameworkImplTest {
-    private Context context;
-    private ToastFrameworkImpl impl;
-    private String message = "test-message";
-    private int length = Toast.LENGTH_LONG;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        impl = new ToastFrameworkImpl(context, message, length);
-    }
-
-    @Test
-    public void testShow() {
-        impl.show();
-        assertEquals(message, ShadowToast.getTextOfLatestToast());
-        Toast toast = ShadowToast.getLatestToast();
-        assertEquals(length, toast.getDuration());
-        assertEquals(Gravity.BOTTOM | Gravity.CENTER_VERTICAL, toast.getGravity());
-        assertEquals(0, toast.getXOffset());
-        assertEquals(
-                context.getResources().getDimensionPixelSize(R.dimen.tb_toast_y_offset),
-                toast.getYOffset()
-        );
-    }
-
-    @Test
-    public void testCancel() {
-        impl.show();
-        ShadowToast toast = Shadows.shadowOf(ShadowToast.getLatestToast());
-        assertFalse(toast.isCancelled());
-        impl.cancel();
-        assertTrue(toast.isCancelled());
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/ToastFrameworkImplTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/ToastFrameworkImplTest.kt
new file mode 100644 (file)
index 0000000..110fca3
--- /dev/null
@@ -0,0 +1,51 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import android.view.Gravity
+import android.widget.Toast
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.R
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.shadows.ShadowToast
+
+@RunWith(RobolectricTestRunner::class)
+class ToastFrameworkImplTest {
+    private var context: Context? = null
+    private var impl: ToastFrameworkImpl? = null
+    private val message = "test-message"
+    private val length = Toast.LENGTH_LONG
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        impl = ToastFrameworkImpl(context, message, length)
+    }
+
+    @Test
+    fun testShow() {
+        impl!!.show()
+        Assert.assertEquals(message, ShadowToast.getTextOfLatestToast())
+        val toast = ShadowToast.getLatestToast()
+        Assert.assertEquals(length.toLong(), toast.duration.toLong())
+        Assert.assertEquals((Gravity.BOTTOM or Gravity.CENTER_VERTICAL).toLong(), toast.gravity.toLong())
+        Assert.assertEquals(0, toast.xOffset.toLong())
+        Assert.assertEquals(
+                context!!.resources.getDimensionPixelSize(R.dimen.tb_toast_y_offset).toLong(),
+                toast.yOffset
+                        .toLong())
+    }
+
+    @Test
+    fun testCancel() {
+        impl!!.show()
+        val toast = Shadows.shadowOf(ShadowToast.getLatestToast())
+        Assert.assertFalse(toast.isCancelled)
+        impl!!.cancel()
+        Assert.assertTrue(toast.isCancelled)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/TopAppsTest.java b/app/src/test/java/com/farmerbb/taskbar/util/TopAppsTest.java
deleted file mode 100644 (file)
index fcdcbb0..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(RobolectricTestRunner.class)
-public class TopAppsTest {
-    private Context context;
-    private TopApps topApps;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        topApps = TopApps.getInstance(context);
-    }
-
-    @Test
-    public void testGetInstance() {
-        assertNotNull(topApps);
-        for (int i = 1; i <= 20; i++) {
-            assertEquals(topApps, TopApps.getInstance(context));
-        }
-    }
-
-    @Test
-    public void testIsTopApp() {
-        assertFalse(topApps.isTopApp(context.getPackageName()));
-        addCurrentPackageToTopApps();
-        assertTrue(topApps.isTopApp(context.getPackageName()));
-        topApps.removeTopApp(context, context.getPackageName());
-    }
-
-    @Test
-    public void testRemoveTopApp() {
-        addCurrentPackageToTopApps();
-        assertTrue(topApps.isTopApp(context.getPackageName()));
-        topApps.removeTopApp(context, context.getPackageName());
-        assertFalse(topApps.isTopApp(context.getPackageName()));
-    }
-
-    private void addCurrentPackageToTopApps() {
-        String packageName = context.getPackageName();
-        BlacklistEntry entry = new BlacklistEntry(packageName, packageName);
-        topApps.addTopApp(context, entry);
-    }
-}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/TopAppsTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/TopAppsTest.kt
new file mode 100644 (file)
index 0000000..55dd07f
--- /dev/null
@@ -0,0 +1,51 @@
+package com.farmerbb.taskbar.util
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class TopAppsTest {
+    private var context: Context? = null
+    private var topApps: TopApps? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        topApps = TopApps.getInstance(context)
+    }
+
+    @Test
+    fun testGetInstance() {
+        Assert.assertNotNull(topApps)
+        for (i in 1..20) {
+            Assert.assertEquals(topApps, TopApps.getInstance(context))
+        }
+    }
+
+    @Test
+    fun testIsTopApp() {
+        Assert.assertFalse(topApps!!.isTopApp(context!!.packageName))
+        addCurrentPackageToTopApps()
+        Assert.assertTrue(topApps!!.isTopApp(context!!.packageName))
+        topApps!!.removeTopApp(context, context!!.packageName)
+    }
+
+    @Test
+    fun testRemoveTopApp() {
+        addCurrentPackageToTopApps()
+        Assert.assertTrue(topApps!!.isTopApp(context!!.packageName))
+        topApps!!.removeTopApp(context, context!!.packageName)
+        Assert.assertFalse(topApps!!.isTopApp(context!!.packageName))
+    }
+
+    private fun addCurrentPackageToTopApps() {
+        val packageName = context!!.packageName
+        val entry = BlacklistEntry(packageName, packageName)
+        topApps!!.addTopApp(context, entry)
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/UTest.java b/app/src/test/java/com/farmerbb/taskbar/util/UTest.java
deleted file mode 100644 (file)
index 67f5027..0000000
+++ /dev/null
@@ -1,989 +0,0 @@
-package com.farmerbb.taskbar.util;
-
-import android.Manifest;
-import android.accessibilityservice.AccessibilityService;
-import android.app.ActivityOptions;
-import android.app.AlertDialog;
-import android.app.Application;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.graphics.Color;
-import android.provider.Settings;
-import android.view.WindowManager;
-import android.widget.Button;
-import android.widget.Toast;
-
-import androidx.appcompat.view.ContextThemeWrapper;
-import androidx.localbroadcastmanager.content.LocalBroadcastManager;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.helper.FreeformHackHelper;
-import com.farmerbb.taskbar.mockito.BooleanAnswer;
-import com.farmerbb.taskbar.mockito.IntAnswer;
-import com.farmerbb.taskbar.service.PowerMenuService;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.rule.PowerMockRule;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.LooperMode;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.shadows.ShadowBuild;
-import org.robolectric.shadows.ShadowLooper;
-import org.robolectric.shadows.ShadowPackageManager;
-import org.robolectric.shadows.ShadowSettings;
-import org.robolectric.shadows.ShadowToast;
-import org.robolectric.util.ReflectionHelpers;
-
-import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.powermock.api.mockito.PowerMockito.when;
-import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
-
-import static com.farmerbb.taskbar.util.Constants.*;
-
-@RunWith(RobolectricTestRunner.class)
-@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*"})
-@PrepareForTest(U.class)
-@LooperMode(LooperMode.Mode.LEGACY)
-public class UTest {
-    @Rule
-    public PowerMockRule rule = new PowerMockRule();
-
-    private Context context;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        assertNotNull(context);
-    }
-
-    @Test
-    public void testShowPermissionDialogWithAndroidTVSettings() throws Exception {
-        testShowPermissionDialog(
-                true,
-                context.getResources().getString(R.string.tb_permission_dialog_message, U.getAppName(context))
-                        + context.getResources().getString(R.string.tb_permission_dialog_instructions_tv, U.getAppName(context)),
-                R.string.tb_action_open_settings
-        );
-    }
-
-    @Test
-    public void testShowPermissionDialogNormal() throws Exception {
-        testShowPermissionDialog(
-                false,
-                context.getResources().getString(R.string.tb_permission_dialog_message, U.getAppName(context))
-                        + context.getResources().getString(R.string.tb_permission_dialog_instructions_phone),
-                R.string.tb_action_grant_permission
-        );
-    }
-
-    private void testShowPermissionDialog(boolean hasAndroidTVSettings,
-                                          String message,
-                                          int buttonTextResId) throws Exception {
-        RunnableHooker onError = new RunnableHooker();
-        RunnableHooker onFinish = new RunnableHooker();
-        PowerMockito.spy(U.class);
-        when(U.class, "hasAndroidTVSettings", context).thenReturn(hasAndroidTVSettings);
-        AlertDialog dialog = U.showPermissionDialog(context, new Callbacks(onError, onFinish));
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
-        Resources resources = context.getResources();
-        assertEquals(
-                resources.getString(R.string.tb_permission_dialog_title),
-                shadowDialog.getTitle()
-        );
-        assertEquals(message, shadowDialog.getMessage());
-        Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
-        assertEquals(resources.getString(buttonTextResId), positiveButton.getText());
-        assertFalse(shadowDialog.isCancelable());
-        positiveButton.performClick();
-        assertTrue(onFinish.hasRun());
-        assertFalse(onError.hasRun());
-    }
-
-    @Test
-    public void testShowErrorDialog() {
-        RunnableHooker onFinish = new RunnableHooker();
-        String appOpCommand = "app-op-command";
-        AlertDialog dialog =
-                ReflectionHelpers.callStaticMethod(
-                        U.class,
-                        "showErrorDialog",
-                        from(Context.class, context),
-                        from(String.class, appOpCommand),
-                        from(Callbacks.class, new Callbacks(null, onFinish))
-                );
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
-        Resources resources = context.getResources();
-        assertEquals(
-                resources.getString(R.string.tb_error_dialog_title),
-                shadowDialog.getTitle()
-        );
-        assertEquals(
-                resources.getString(
-                        R.string.tb_error_dialog_message,
-                        context.getPackageName(),
-                        appOpCommand
-                ),
-                shadowDialog.getMessage()
-        );
-        Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
-        assertEquals(resources.getString(R.string.tb_action_ok), button.getText());
-        assertFalse(shadowDialog.isCancelable());
-        button.performClick();
-        assertTrue(onFinish.hasRun());
-    }
-
-    @Test
-    public void testSendAccessibilityActionWithServiceNotEnabledAndGrantedPermission() {
-        testSendAccessibilityAction(false, true, true);
-    }
-
-    @Test
-    public void testSendAccessibilityActionWithServiceEnabled() {
-        testSendAccessibilityAction(true, false, true);
-    }
-
-    @Test
-    public void testSendAccessibilityActionWithServiceNotEnabledAndWithoutPermission() {
-        testSendAccessibilityAction(false, false, false);
-    }
-
-    private void testSendAccessibilityAction(boolean serviceEnabled,
-                                             boolean hasPermission,
-                                             boolean hasRun) {
-        PowerMockito.spy(U.class);
-        when(U.isAccessibilityServiceEnabled(context)).thenReturn(serviceEnabled);
-        when(U.hasWriteSecureSettingsPermission(context)).thenReturn(hasPermission);
-        RunnableHooker onComplete = new RunnableHooker();
-        U.sendAccessibilityAction(
-                context, AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN, onComplete
-        );
-        // Run all delayed message.
-        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
-        assertEquals(hasRun, onComplete.hasRun());
-    }
-
-    @Test
-    public void testIsAccessibilityServiceEnabled() {
-        String enabledServices =
-                Settings.Secure.getString(
-                        context.getContentResolver(),
-                        Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
-                );
-        ComponentName componentName = new ComponentName(context, PowerMenuService.class);
-        String flattenString = componentName.flattenToString();
-        String flattenShortString = componentName.flattenToShortString();
-        String newEnabledService =
-                enabledServices == null ?
-                        "" :
-                        enabledServices
-                                .replaceAll(":" + flattenString, "")
-                                .replaceAll(":" + flattenShortString, "")
-                                .replaceAll(flattenString, "")
-                                .replaceAll(flattenShortString, "");
-        Settings.Secure.putString(
-                context.getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
-                newEnabledService
-        );
-        assertFalse(U.isAccessibilityServiceEnabled(context));
-        Settings.Secure.putString(
-                context.getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
-                newEnabledService + ":" + flattenString
-        );
-        assertTrue(U.isAccessibilityServiceEnabled(context));
-        Settings.Secure.putString(
-                context.getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
-                newEnabledService + ":" + flattenShortString
-        );
-        assertTrue(U.isAccessibilityServiceEnabled(context));
-        Settings.Secure.putString(
-                context.getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
-                enabledServices
-        );
-    }
-
-    @Test
-    public void testHasWriteSecureSettingsPermissionForMarshmallowAndAboveVersion() {
-        assertFalse(U.hasWriteSecureSettingsPermission(context));
-        Application application = ApplicationProvider.getApplicationContext();
-        ShadowApplication shadowApplication = Shadows.shadowOf(application);
-        shadowApplication.grantPermissions(Manifest.permission.WRITE_SECURE_SETTINGS);
-        assertTrue(U.hasWriteSecureSettingsPermission(context));
-    }
-
-    @Test
-    @Config(sdk = 21)
-    public void testHasWriteSecureSettingsPermissionVersionBelowMarshmallow() {
-        Application application = ApplicationProvider.getApplicationContext();
-        ShadowApplication shadowApplication = Shadows.shadowOf(application);
-        shadowApplication.grantPermissions(Manifest.permission.WRITE_SECURE_SETTINGS);
-        assertFalse(U.hasWriteSecureSettingsPermission(context));
-    }
-
-    @Test
-    public void testShowToast() {
-        U.showToast(context, R.string.tb_pin_shortcut_not_supported);
-        Toast toast = ShadowToast.getLatestToast();
-        assertEquals(Toast.LENGTH_SHORT, toast.getDuration());
-        assertEquals(
-                context.getResources().getString(R.string.tb_pin_shortcut_not_supported),
-                ShadowToast.getTextOfLatestToast()
-        );
-    }
-
-    @Test
-    public void testShowLongToast() {
-        U.showToastLong(context, R.string.tb_pin_shortcut_not_supported);
-        Toast toast = ShadowToast.getLatestToast();
-        assertEquals(Toast.LENGTH_LONG, toast.getDuration());
-        assertEquals(
-                context.getResources().getString(R.string.tb_pin_shortcut_not_supported),
-                ShadowToast.getTextOfLatestToast()
-        );
-    }
-
-    @Test
-    public void testCancelToast() {
-        U.showToastLong(context, R.string.tb_pin_shortcut_not_supported);
-        ShadowToast shadowToast = Shadows.shadowOf(ShadowToast.getLatestToast());
-        assertFalse(shadowToast.isCancelled());
-        U.cancelToast();
-        assertTrue(shadowToast.isCancelled());
-    }
-
-    @Test
-    public void testCanEnableFreeformWithNougatAndAboveVersion() {
-        assertTrue(U.canEnableFreeform());
-    }
-
-    @Test
-    @Config(sdk = 23)
-    public void testCanEnableFreeformWithMarshmallowAndBelowVersion() {
-        assertFalse(U.canEnableFreeform());
-    }
-
-    @Test
-    public void testHasFreeformSupportWithoutFreeformEnabled() {
-        PowerMockito.spy(U.class);
-        when(U.canEnableFreeform()).thenReturn(false);
-        assertFalse(U.canEnableFreeform());
-    }
-
-    @Test
-    public void testHasFreeformSupportWithFreeformEnabledAndNMR1AboveVersion() {
-        PowerMockito.spy(U.class);
-        when(U.canEnableFreeform()).thenReturn(true);
-        assertFalse(U.hasFreeformSupport(context));
-        // Case 1, system has feature freeform.
-        PackageManager packageManager = context.getPackageManager();
-        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(packageManager);
-        shadowPackageManager
-                .setSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT, true);
-        assertTrue(U.hasFreeformSupport(context));
-        shadowPackageManager
-                .setSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT, false);
-        // Case 2, enable_freeform_support in Settings.Global is not 0
-        Settings.Global.putInt(context.getContentResolver(), "enable_freeform_support", 1);
-        assertTrue(U.hasFreeformSupport(context));
-        Settings.Global.putInt(context.getContentResolver(), "enable_freeform_support", 0);
-    }
-
-    @Test
-    @Config(sdk = 25)
-    public void testHasFreeformSupportWithFreeformEnabledAndNMR1AndBelowVersion() {
-        PowerMockito.spy(U.class);
-        when(U.canEnableFreeform()).thenReturn(true);
-        assertFalse(U.hasFreeformSupport(context));
-        // Case 3, version is less than or equal to N_MRI, and force_resizable_activities
-        // in Settings.Global is not 0
-        Settings.Global.putInt(context.getContentResolver(), "force_resizable_activities", 1);
-        assertTrue(U.hasFreeformSupport(context));
-        Settings.Global.putInt(context.getContentResolver(), "force_resizable_activities", 0);
-    }
-
-    @Test
-    public void testCanBootToFreeform() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer hasFreeformSupportAnswer = new BooleanAnswer();
-        BooleanAnswer isOverridingFreeformHackAnswer = new BooleanAnswer();
-        when(U.hasFreeformSupport(context)).thenAnswer(hasFreeformSupportAnswer);
-        when(U.isOverridingFreeformHack(context, true)).thenAnswer(isOverridingFreeformHackAnswer);
-        // Case 1, all return true
-        hasFreeformSupportAnswer.answer = true;
-        isOverridingFreeformHackAnswer.answer = true;
-        assertFalse(U.canBootToFreeform(context));
-        // Case 2, true, false
-        hasFreeformSupportAnswer.answer = true;
-        isOverridingFreeformHackAnswer.answer = false;
-        assertTrue(U.canBootToFreeform(context));
-        // Case 3, false, true
-        hasFreeformSupportAnswer.answer = false;
-        isOverridingFreeformHackAnswer.answer = true;
-        assertFalse(U.canBootToFreeform(context));
-        // Case 4, false, false
-        hasFreeformSupportAnswer.answer = false;
-        isOverridingFreeformHackAnswer.answer = false;
-        assertFalse(U.canBootToFreeform(context));
-    }
-
-    @Test
-    public void testIsSamsungDevice() {
-        ShadowBuild.setManufacturer("Samsung");
-        assertTrue(U.isSamsungDevice());
-        ShadowBuild.setManufacturer("samsung");
-        assertTrue(U.isSamsungDevice());
-        ShadowBuild.setManufacturer("UnSamsung");
-        assertFalse(U.isSamsungDevice());
-    }
-
-    @Test
-    public void testGetBackgroundTint() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit()
-                .putInt(PREF_BACKGROUND_TINT, Color.GREEN)
-                .putBoolean(PREF_SHOW_BACKGROUND, false)
-                .apply();
-        // If the SHOW_BACKGROUND is false, it use transparent to replace origin tint.
-        assertEquals(Color.TRANSPARENT, U.getBackgroundTint(context));
-        prefs.edit()
-                .putInt(PREF_BACKGROUND_TINT, Color.GREEN)
-                .apply();
-        assertEquals(Color.GREEN, U.getBackgroundTint(context));
-        prefs.edit().remove(PREF_BACKGROUND_TINT).apply();
-        assertEquals(
-                context.getResources().getInteger(R.integer.tb_translucent_gray),
-                U.getBackgroundTint(context)
-        );
-    }
-
-    @Test
-    public void testAccentColor() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().remove(PREF_ACCENT_COLOR).apply();
-        assertEquals(
-                context.getResources().getInteger(R.integer.tb_translucent_white),
-                U.getAccentColor(context)
-        );
-        prefs.edit().putInt(PREF_ACCENT_COLOR, Color.GREEN).apply();
-        assertEquals(Color.GREEN, U.getAccentColor(context));
-    }
-
-    @Test
-    public void testCanDrawOverlaysWithMarshmallowAndAboveVersion() {
-        ShadowSettings.setCanDrawOverlays(true);
-        assertTrue(U.canDrawOverlays(context));
-        ShadowSettings.setCanDrawOverlays(false);
-        assertFalse(U.canDrawOverlays(context));
-    }
-
-    @Test
-    @Config(sdk = 22)
-    public void testCanDrawOverlaysWithMarshmallowBelowVersion() {
-        assertTrue(U.canDrawOverlays(context));
-    }
-
-    @Test
-    public void testIsGame() {
-        // We only test for un-support launching games fullscreen, because of
-        // we don't have a good method to test code with ApplicationInfo.
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_LAUNCH_GAMES_FULLSCREEN, false).apply();
-        assertFalse(U.isGame(context, context.getPackageName()));
-        prefs.edit().putBoolean(PREF_LAUNCH_GAMES_FULLSCREEN, true).apply();
-        assertFalse(U.isGame(context, context.getPackageName()));
-        assertFalse(U.isGame(context, context.getPackageName() + "un-exist-package"));
-    }
-
-    @Test
-    public void testGetActivityOptionsWithPAndAboveVersion() {
-        testGetActivityOptions(0, 5, 1);
-    }
-
-    @Test
-    @Config(sdk = 27)
-    public void testGetActivityOptionsWithPBelowVersion() {
-        testGetActivityOptions(-1, 2, -1);
-    }
-
-    private void testGetActivityOptions(int defaultStackId,
-                                        int freeformStackId,
-                                        int stackIdWithoutBrokenApi) {
-        PowerMockito.spy(U.class);
-        BooleanAnswer hasBrokenSetLaunchBoundsApiAnswer = new BooleanAnswer();
-        BooleanAnswer isChromeOsAnswer = new BooleanAnswer();
-        when(U.hasBrokenSetLaunchBoundsApi()).thenAnswer(hasBrokenSetLaunchBoundsApiAnswer);
-        when(U.isChromeOs(context)).thenAnswer(isChromeOsAnswer);
-        boolean originFreeformHackActive = FreeformHackHelper.getInstance().isFreeformHackActive();
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, null, false, defaultStackId
-        );
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, ApplicationType.APP_PORTRAIT, false, 1
-        );
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, ApplicationType.APP_PORTRAIT, true, freeformStackId
-        );
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, ApplicationType.APP_LANDSCAPE, false, 1
-        );
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, ApplicationType.APP_LANDSCAPE, true, freeformStackId
-        );
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, ApplicationType.APP_FULLSCREEN, false, 1
-        );
-        checkActivityOptionsStackIdForNonContextMenu(
-                context, ApplicationType.FREEFORM_HACK, false, freeformStackId
-        );
-        FreeformHackHelper.getInstance().setFreeformHackActive(originFreeformHackActive);
-        hasBrokenSetLaunchBoundsApiAnswer.answer = true;
-        checkActivityOptionsStackIdForContextMenu(context, 1);
-        hasBrokenSetLaunchBoundsApiAnswer.answer = false;
-        isChromeOsAnswer.answer = false;
-        checkActivityOptionsStackIdForContextMenu(context, stackIdWithoutBrokenApi);
-        isChromeOsAnswer.answer = true;
-        checkActivityOptionsStackIdForContextMenu(context, -1);
-    }
-
-    private void checkActivityOptionsStackIdForContextMenu(Context context,
-                                                           int stackId) {
-        ActivityOptions options = U.getActivityOptions(context, ApplicationType.CONTEXT_MENU, null);
-        assertEquals(stackId, getActivityOptionsStackId(options));
-    }
-
-    private void checkActivityOptionsStackIdForNonContextMenu(Context context,
-                                                              ApplicationType applicationType,
-                                                              boolean isFreeformHackActive,
-                                                              int stackId) {
-        FreeformHackHelper.getInstance().setFreeformHackActive(isFreeformHackActive);
-        ActivityOptions options = U.getActivityOptions(context, applicationType, null);
-        assertEquals(stackId, getActivityOptionsStackId(options));
-    }
-
-    private int getActivityOptionsStackId(ActivityOptions options) {
-        String methodName;
-        if (U.getCurrentApiVersion() >= 28.0f) {
-            methodName = "getLaunchWindowingMode";
-        } else {
-            methodName = "getLaunchStackId";
-        }
-        return ReflectionHelpers.callInstanceMethod(options, methodName);
-    }
-
-    @Test
-    public void testIsChromeOs() {
-        PackageManager packageManager = context.getPackageManager();
-        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(packageManager);
-        shadowPackageManager.setSystemFeature("org.chromium.arc", true);
-        assertTrue(U.isChromeOs(context));
-        shadowPackageManager.setSystemFeature("org.chromium.arc", false);
-        assertFalse(U.isChromeOs(context));
-    }
-
-    @Test
-    @Config(qualifiers = "sw720dp")
-    public void testGetBaseTaskbarSizeWithSW720dp() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer isSystemTrayEnabledAnswer = new BooleanAnswer();
-        when(U.isSystemTrayEnabled(context)).thenAnswer(isSystemTrayEnabledAnswer);
-        isSystemTrayEnabledAnswer.answer = false;
-        // The only difference of the different screen size, is the initial taskbar size.
-        // So we only test the different in this test method.
-        float initialSize = context.getResources().getDimension(R.dimen.tb_base_size_start_plus_divider);
-        initialSize += context.getResources().getDimension(R.dimen.tb_base_size_collapse_button);
-        initialSize += context.getResources().getDimension(R.dimen.tb_dashboard_button_size);
-        assertEquals(initialSize, U.getBaseTaskbarSize(context), 0);
-    }
-
-    @Test
-    public void testGetBaseTaskbarSizeWithNormalDimension() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer isSystemTrayEnabledAnswer = new BooleanAnswer();
-        when(U.isSystemTrayEnabled(context)).thenAnswer(isSystemTrayEnabledAnswer);
-        isSystemTrayEnabledAnswer.answer = false;
-        float initialSize = context.getResources().getDimension(R.dimen.tb_base_size_start_plus_divider);
-        initialSize += context.getResources().getDimension(R.dimen.tb_base_size_collapse_button);
-        assertEquals(initialSize, U.getBaseTaskbarSize(context), 0);
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_DASHBOARD, true).apply();
-        float dashboardButtonSize =
-                context.getResources().getDimension(R.dimen.tb_dashboard_button_size);
-        assertEquals(initialSize + dashboardButtonSize, U.getBaseTaskbarSize(context), 0);
-        prefs.edit().remove(PREF_DASHBOARD).apply();
-        float navbarButtonsMargin =
-                context.getResources().getDimension(R.dimen.tb_navbar_buttons_margin);
-        float iconSize =
-                context.getResources().getDimension(R.dimen.tb_icon_size);
-        prefs.edit().putBoolean(PREF_BUTTON_BACK, true).apply();
-        assertEquals(
-                initialSize + navbarButtonsMargin + iconSize,
-                U.getBaseTaskbarSize(context),
-                0
-        );
-        prefs.edit().remove(PREF_BUTTON_BACK).apply();
-        prefs.edit().putBoolean(PREF_BUTTON_HOME, true).apply();
-        assertEquals(
-                initialSize + navbarButtonsMargin + iconSize,
-                U.getBaseTaskbarSize(context),
-                0
-        );
-        prefs.edit().remove(PREF_BUTTON_HOME).apply();
-        prefs.edit().putBoolean(PREF_BUTTON_RECENTS, true).apply();
-        assertEquals(
-                initialSize + navbarButtonsMargin + iconSize,
-                U.getBaseTaskbarSize(context),
-                0
-        );
-        prefs.edit().remove(PREF_BUTTON_RECENTS).apply();
-        isSystemTrayEnabledAnswer.answer = true;
-        float systemTraySize = context.getResources().getDimension(R.dimen.tb_systray_size);
-        assertEquals(initialSize + systemTraySize, U.getBaseTaskbarSize(context), 0);
-    }
-
-    @Test
-    public void testInitPrefsForBlissOS() {
-        PowerMockito.spy(U.class);
-        when(U.isBlissOs(any(Context.class))).thenReturn(true);
-        assertTrue(U.isBlissOs(context));
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        assertFalse(prefs.getBoolean(PREF_BLISS_OS_PREFS, false));
-        U.initPrefs(context);
-        assertEquals(
-                PREF_RECENTS_AMOUNT_RUNNING_APPS_ONLY,
-                prefs.getString(PREF_RECENTS_AMOUNT, "")
-        );
-        assertEquals("0", prefs.getString(PREF_REFRESH_FREQUENCY, ""));
-        assertEquals("2147483647", prefs.getString(PREF_MAX_NUM_OF_RECENTS, ""));
-        assertEquals("true", prefs.getString(PREF_SORT_ORDER, ""));
-        assertEquals(
-                PREF_START_BUTTON_IMAGE_APP_LOGO,
-                prefs.getString(PREF_START_BUTTON_IMAGE, "")
-        );
-        assertTrue(prefs.getBoolean(PREF_BUTTON_BACK, false));
-        assertTrue(prefs.getBoolean(PREF_BUTTON_HOME, false));
-        assertTrue(prefs.getBoolean(PREF_BUTTON_RECENTS, false));
-        assertTrue(prefs.getBoolean(PREF_AUTO_HIDE_NAVBAR, false));
-        assertFalse(prefs.getBoolean(PREF_SHORTCUT_ICON, true));
-        assertTrue(prefs.getBoolean(PREF_BLISS_OS_PREFS, false));
-        prefs.edit().putBoolean(PREF_BLISS_OS_PREFS, false);
-    }
-
-    @Test
-    public void testInitPrefsForNormalWithCanEnableFreeformAndHackOverrideFalse() {
-        PowerMockito.spy(U.class);
-        when(U.canEnableFreeform()).thenReturn(true);
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK_OVERRIDE, false).apply();
-        U.initPrefs(context);
-        assertEquals(
-                U.hasFreeformSupport(context) && !U.isSamsungDevice(),
-                prefs.getBoolean(PREF_FREEFORM_HACK, false)
-        );
-        assertFalse(prefs.getBoolean(PREF_SAVE_WINDOW_SIZES, true));
-        assertTrue(prefs.getBoolean(PREF_FREEFORM_HACK_OVERRIDE, false));
-    }
-
-    @Test
-    public void testInitPrefsForNormalWithCanEnableFreeformAndHackOverrideTrueButNoSupport() {
-        PowerMockito.spy(U.class);
-        when(U.canEnableFreeform()).thenReturn(true);
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK_OVERRIDE, true).apply();
-        when(U.hasFreeformSupport(context)).thenReturn(false);
-        U.initPrefs(context);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, false));
-    }
-
-    @Test
-    public void testInitPrefsForNormalWithCantEnableFreeform() {
-        PowerMockito.spy(U.class);
-        when(U.canEnableFreeform()).thenReturn(false);
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        U.initPrefs(context);
-        assertFalse(prefs.getBoolean(PREF_FREEFORM_HACK, false));
-        prefs.edit()
-                .putBoolean(PREF_FREEFORM_HACK, false)
-                .putBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false)
-                .apply();
-        U.initPrefs(context);
-        assertFalse(prefs.getBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false));
-        prefs.edit()
-                .putBoolean(PREF_FREEFORM_HACK, true)
-                .putBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false)
-                .apply();
-        U.initPrefs(context);
-        assertTrue(prefs.getBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false));
-        prefs.edit()
-                .putBoolean(PREF_FREEFORM_HACK, false)
-                .putBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, true)
-                .apply();
-        U.initPrefs(context);
-        assertTrue(prefs.getBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false));
-        prefs.edit()
-                .putBoolean(PREF_FREEFORM_HACK, true)
-                .putBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, true)
-                .apply();
-        U.initPrefs(context);
-        assertTrue(prefs.getBoolean(PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false));
-    }
-
-    @Test
-    public void testIsOverridingFreeformHackForPAndAboveVersion() {
-        PowerMockito.spy(U.class);
-        when(U.isChromeOs(context)).thenReturn(false);
-        // Check preferences
-        assertFalse(U.isOverridingFreeformHack(context, true));
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        assertTrue(U.isOverridingFreeformHack(context, true));
-        prefs.edit().remove(PREF_FREEFORM_HACK).apply();
-
-        // Don't check preferences
-        assertTrue(U.isOverridingFreeformHack(context, false));
-    }
-
-    @Test
-    @Config(sdk = 27)
-    public void testIsOverridingFreeformHackForPBelowVersion() {
-        PowerMockito.spy(U.class);
-        when(U.isChromeOs(context)).thenReturn(false);
-        // Check preferences
-        assertFalse(U.isOverridingFreeformHack(context, true));
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        assertFalse(U.isOverridingFreeformHack(context, true));
-        prefs.edit().remove(PREF_FREEFORM_HACK).apply();
-
-        // Don't check preferences
-        assertFalse(U.isOverridingFreeformHack(context, false));
-    }
-
-    @Test
-    public void testIsOverridingFreeformHackForChromeOS() {
-        PowerMockito.spy(U.class);
-        when(U.isChromeOs(context)).thenReturn(true);
-        // Check preferences
-        assertFalse(U.isOverridingFreeformHack(context, true));
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_FREEFORM_HACK, true).apply();
-        // The default PREF_CHROME_OS_CONTEXT_MENU_FIX is true
-        assertTrue(U.isOverridingFreeformHack(context, true));
-        prefs.edit().putBoolean(PREF_CHROME_OS_CONTEXT_MENU_FIX, false).apply();
-        assertFalse(U.isOverridingFreeformHack(context, true));
-        prefs.edit().putBoolean(PREF_CHROME_OS_CONTEXT_MENU_FIX, true).apply();
-        assertTrue(U.isOverridingFreeformHack(context, true));
-        prefs.edit().remove(PREF_FREEFORM_HACK).apply();
-        prefs.edit().remove(PREF_CHROME_OS_CONTEXT_MENU_FIX).apply();
-
-        // Don't check preferences
-        assertTrue(U.isOverridingFreeformHack(context, false));
-        prefs.edit().putBoolean(PREF_CHROME_OS_CONTEXT_MENU_FIX, false).apply();
-        assertFalse(U.isOverridingFreeformHack(context, false));
-        prefs.edit().putBoolean(PREF_CHROME_OS_CONTEXT_MENU_FIX, true).apply();
-        assertTrue(U.isOverridingFreeformHack(context, false));
-        prefs.edit().remove(PREF_CHROME_OS_CONTEXT_MENU_FIX).apply();
-    }
-
-    @Test
-    @Config(sdk = 25)
-    public void testHasBrokenSetLaunchBoundsApiForApi25() {
-        assertFalse(U.hasBrokenSetLaunchBoundsApi());
-    }
-
-    @Test
-    @Config(sdk = 26)
-    public void testHasBrokenSetLaunchBoundsApiForApi26() throws Exception {
-        testHasBrokenSetLaunchBoundsApiWithValidApiVersion();
-    }
-
-    @Test
-    @Config(sdk = 27)
-    public void testHasBrokenSetLaunchBoundsApiForApi27() throws Exception {
-        testHasBrokenSetLaunchBoundsApiWithValidApiVersion();
-        testHasBrokenSetLaunchBoundsApiWithValidApiVersion();
-    }
-
-    @Test
-    @Config(sdk = 28)
-    public void testHasBrokenSetLaunchBoundsApiForApi28() {
-        assertFalse(U.hasBrokenSetLaunchBoundsApi());
-    }
-
-    private void testHasBrokenSetLaunchBoundsApiWithValidApiVersion() throws Exception {
-        PowerMockito.spy(U.class);
-        BooleanAnswer isSamsungDeviceAnswer = new BooleanAnswer();
-        BooleanAnswer isNvidiaDevice = new BooleanAnswer();
-        when(U.isSamsungDevice()).thenAnswer(isSamsungDeviceAnswer);
-        when(U.class, "isNvidiaDevice").thenAnswer(isNvidiaDevice);
-        isSamsungDeviceAnswer.answer = false;
-        isNvidiaDevice.answer = false;
-        assertTrue(U.hasBrokenSetLaunchBoundsApi());
-        isSamsungDeviceAnswer.answer = false;
-        isNvidiaDevice.answer = true;
-        assertFalse(U.hasBrokenSetLaunchBoundsApi());
-        isSamsungDeviceAnswer.answer = true;
-        isNvidiaDevice.answer = false;
-        assertFalse(U.hasBrokenSetLaunchBoundsApi());
-        isSamsungDeviceAnswer.answer = true;
-        isNvidiaDevice.answer = true;
-        assertFalse(U.hasBrokenSetLaunchBoundsApi());
-    }
-
-    @Test
-    public void testWrapContext() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putString(PREF_THEME, "light").apply();
-        Context newContext = U.wrapContext(context);
-        Integer themeResource = ReflectionHelpers.getField(newContext, "mThemeResource");
-        assertNotNull(themeResource);
-        assertEquals(R.style.Taskbar, (int) themeResource);
-        prefs.edit().putString(PREF_THEME, "dark").apply();
-        newContext = U.wrapContext(context);
-        themeResource = ReflectionHelpers.getField(newContext, "mThemeResource");
-        assertNotNull(themeResource);
-        assertEquals(R.style.Taskbar_Dark, (int) themeResource);
-        prefs.edit().putString(PREF_THEME, "non-support").apply();
-        newContext = U.wrapContext(context);
-        assertTrue(newContext instanceof ContextThemeWrapper);
-        prefs.edit().remove(PREF_THEME).apply();
-        newContext = U.wrapContext(context);
-        themeResource = ReflectionHelpers.getField(newContext, "mThemeResource");
-        assertNotNull(themeResource);
-        assertEquals(R.style.Taskbar, (int) themeResource);
-    }
-
-    @Test
-    public void testEnableFreeformModeShortcut() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer canEnableFreeformAnswer = new BooleanAnswer();
-        BooleanAnswer isOverridingFreeformHackAnswer = new BooleanAnswer();
-        BooleanAnswer isChromeOsAnswer = new BooleanAnswer();
-        when(U.canEnableFreeform()).thenAnswer(canEnableFreeformAnswer);
-        when(U.isOverridingFreeformHack(context, false))
-                .thenAnswer(isOverridingFreeformHackAnswer);
-        when(U.isChromeOs(context)).thenAnswer(isChromeOsAnswer);
-
-        canEnableFreeformAnswer.answer = false;
-        isOverridingFreeformHackAnswer.answer = false;
-        isChromeOsAnswer.answer = false;
-        assertFalse(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = false;
-        isOverridingFreeformHackAnswer.answer = false;
-        isChromeOsAnswer.answer = true;
-        assertFalse(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = false;
-        isOverridingFreeformHackAnswer.answer = true;
-        isChromeOsAnswer.answer = false;
-        assertFalse(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = false;
-        isOverridingFreeformHackAnswer.answer = true;
-        isChromeOsAnswer.answer = true;
-        assertFalse(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = true;
-        isOverridingFreeformHackAnswer.answer = false;
-        isChromeOsAnswer.answer = false;
-        assertTrue(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = true;
-        isOverridingFreeformHackAnswer.answer = false;
-        isChromeOsAnswer.answer = true;
-        assertFalse(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = true;
-        isOverridingFreeformHackAnswer.answer = true;
-        isChromeOsAnswer.answer = false;
-        assertFalse(U.enableFreeformModeShortcut(context));
-
-        canEnableFreeformAnswer.answer = true;
-        isOverridingFreeformHackAnswer.answer = true;
-        isChromeOsAnswer.answer = true;
-        assertFalse(U.enableFreeformModeShortcut(context));
-    }
-
-    @Test
-    @Config(sdk = 26)
-    public void testGetOverlayTypeForOAndAboveVersion() {
-        assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, U.getOverlayType());
-    }
-
-    @Test
-    @Config(sdk = 25)
-    public void testGetOverlayTypeForOBelowVersion() {
-        assertEquals(WindowManager.LayoutParams.TYPE_PHONE, U.getOverlayType());
-    }
-
-    @Test
-    public void testGetDefaultStartButtonImage() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit().putBoolean(PREF_APP_DRAWER_ICON, true).apply();
-        assertEquals(PREF_START_BUTTON_IMAGE_APP_LOGO, U.getDefaultStartButtonImage(context));
-        prefs.edit().putBoolean(PREF_APP_DRAWER_ICON, false).apply();
-        assertEquals(PREF_START_BUTTON_IMAGE_DEFAULT, U.getDefaultStartButtonImage(context));
-        prefs.edit().remove(PREF_APP_DRAWER_ICON).apply();
-        assertEquals(PREF_START_BUTTON_IMAGE_DEFAULT, U.getDefaultStartButtonImage(context));
-    }
-
-    @Test
-    public void testIsDesktopIconEnabled() throws Exception {
-        PowerMockito.spy(U.class);
-        BooleanAnswer canBootToFreeformAnswer = new BooleanAnswer();
-        BooleanAnswer shouldLaunchTouchAbsorberAnswer = new BooleanAnswer();
-        when(U.class, "canBootToFreeform", context, false)
-                .thenAnswer(canBootToFreeformAnswer);
-        when(U.class, "shouldLaunchTouchAbsorber", context)
-                .thenAnswer(shouldLaunchTouchAbsorberAnswer);
-
-        canBootToFreeformAnswer.answer = false;
-        shouldLaunchTouchAbsorberAnswer.answer = false;
-        assertTrue(U.isDesktopIconsEnabled(context));
-
-        canBootToFreeformAnswer.answer = false;
-        shouldLaunchTouchAbsorberAnswer.answer = true;
-        assertFalse(U.isDesktopIconsEnabled(context));
-
-        canBootToFreeformAnswer.answer = true;
-        shouldLaunchTouchAbsorberAnswer.answer = false;
-        assertFalse(U.isDesktopIconsEnabled(context));
-
-        canBootToFreeformAnswer.answer = true;
-        shouldLaunchTouchAbsorberAnswer.answer = true;
-        assertFalse(U.isDesktopIconsEnabled(context));
-    }
-
-    @Test
-    @Config(sdk = 22)
-    public void testIsSystemTrayEnabledForMBelowVersion() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        prefs.edit()
-                .putBoolean(PREF_SYS_TRAY, true)
-                .putBoolean(PREF_FULL_LENGTH, true)
-                .apply();
-        assertFalse(U.isSystemTrayEnabled(context));
-        prefs.edit().remove(PREF_SYS_TRAY).remove(PREF_FULL_LENGTH).apply();
-    }
-
-    @Test
-    public void testIsSystemTrayEnabledForMAndAboveVersion() {
-        SharedPreferences prefs = U.getSharedPreferences(context);
-        assertFalse(U.isSystemTrayEnabled(context));
-        prefs.edit().putBoolean(PREF_SYS_TRAY, true).apply();
-        assertTrue(U.isSystemTrayEnabled(context));
-        prefs.edit().putBoolean(PREF_FULL_LENGTH, false).apply();
-        assertFalse(U.isSystemTrayEnabled(context));
-        prefs.edit().putBoolean(PREF_FULL_LENGTH, true).apply();
-        assertTrue(U.isSystemTrayEnabled(context));
-        prefs.edit()
-                .putString(PREF_POSITION, POSITION_BOTTOM_VERTICAL_LEFT)
-                .putBoolean(PREF_ANCHOR, false)
-                .apply();
-        assertFalse(U.isSystemTrayEnabled(context));
-        prefs.edit().remove(PREF_POSITION).remove(PREF_ANCHOR).apply();
-    }
-
-    @Test
-    public void testApplyDisplayCutoutModeToWithPAndAboveVersion() {
-        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
-        assertTrue(U.applyDisplayCutoutModeTo(layoutParams));
-        assertEquals(
-                LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,
-                layoutParams.layoutInDisplayCutoutMode
-        );
-    }
-
-    @Test
-    @Config(sdk = 27)
-    public void testApplyDisplayCutoutModeToWithBelowVersion() {
-        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
-        assertFalse(U.applyDisplayCutoutModeTo(layoutParams));
-    }
-
-    @Test
-    public void testIsDesktopModeActive() {
-        PowerMockito.spy(U.class);
-        BooleanAnswer isDesktopModeSupportedAnswer = new BooleanAnswer();
-        IntAnswer getExternalDisplayIdAnswer = new IntAnswer();
-        BooleanAnswer hasFreeformSupportAnswer = new BooleanAnswer();
-        when(U.isDesktopModeSupported(context)).thenAnswer(isDesktopModeSupportedAnswer);
-        when(U.getExternalDisplayID(context)).thenAnswer(getExternalDisplayIdAnswer);
-        when(U.hasFreeformSupport(context)).thenAnswer(hasFreeformSupportAnswer);
-
-        isDesktopModeSupportedAnswer.answer = false;
-        assertFalse(U.isDesktopModeActive(context));
-
-        isDesktopModeSupportedAnswer.answer = true;
-        Settings.Global.putInt(
-                context.getContentResolver(),
-                "force_desktop_mode_on_external_displays",
-                0
-        );
-        assertFalse(U.isDesktopModeActive(context));
-        Settings.Global.putInt(
-                context.getContentResolver(),
-                "force_desktop_mode_on_external_displays",
-                1
-        );
-        assertFalse(U.isDesktopModeActive(context));
-        getExternalDisplayIdAnswer.answer = 1;
-        assertFalse(U.isDesktopModeActive(context));
-        hasFreeformSupportAnswer.answer = true;
-        assertTrue(U.isDesktopModeActive(context));
-        Settings.Global.putInt(
-                context.getContentResolver(),
-                "force_desktop_mode_on_external_displays",
-                0
-        );
-    }
-
-    @Test
-    public void testSendBroadcast() {
-        TestBroadcastReceiver receiver = new TestBroadcastReceiver();
-        IntentFilter filter = new IntentFilter(TestBroadcastReceiver.ACTION);
-        LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter);
-        U.sendBroadcast(context, TestBroadcastReceiver.ACTION);
-        assertTrue(receiver.onReceived);
-        receiver.onReceived = false;
-        U.sendBroadcast(context, new Intent(TestBroadcastReceiver.ACTION));
-        assertTrue(receiver.onReceived);
-    }
-
-    private static final class TestBroadcastReceiver extends BroadcastReceiver {
-        private static final String ACTION = "test-broadcast-receiver-action";
-        private boolean onReceived;
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent == null || !ACTION.equals(intent.getAction())) {
-                return;
-            }
-            onReceived = true;
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/util/UTest.kt b/app/src/test/java/com/farmerbb/taskbar/util/UTest.kt
new file mode 100644 (file)
index 0000000..0ab7cb7
--- /dev/null
@@ -0,0 +1,942 @@
+package com.farmerbb.taskbar.util
+
+import android.Manifest
+import android.accessibilityservice.AccessibilityService
+import android.app.ActivityOptions
+import android.app.AlertDialog
+import android.app.Application
+import android.content.*
+import android.content.pm.PackageManager
+import android.graphics.Color
+import android.provider.Settings
+import android.view.WindowManager
+import android.widget.Toast
+import androidx.appcompat.view.ContextThemeWrapper
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.R
+import com.farmerbb.taskbar.helper.FreeformHackHelper
+import com.farmerbb.taskbar.mockito.BooleanAnswer
+import com.farmerbb.taskbar.mockito.IntAnswer
+import com.farmerbb.taskbar.service.PowerMenuService
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers
+import org.powermock.api.mockito.PowerMockito
+import org.powermock.core.classloader.annotations.PowerMockIgnore
+import org.powermock.core.classloader.annotations.PrepareForTest
+import org.powermock.modules.junit4.rule.PowerMockRule
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.LooperMode
+import org.robolectric.shadows.ShadowBuild
+import org.robolectric.shadows.ShadowLooper
+import org.robolectric.shadows.ShadowSettings
+import org.robolectric.shadows.ShadowToast
+import org.robolectric.util.ReflectionHelpers
+import org.robolectric.util.ReflectionHelpers.ClassParameter
+
+@RunWith(RobolectricTestRunner::class)
+@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
+@PrepareForTest(U::class)
+@LooperMode(LooperMode.Mode.LEGACY)
+class UTest {
+    @get:Rule
+    var rule = PowerMockRule()
+    private var context: Context? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        Assert.assertNotNull(context)
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testShowPermissionDialogWithAndroidTVSettings() {
+        testShowPermissionDialog(
+                true, context!!.resources.getString(R.string.tb_permission_dialog_message, U.getAppName(context))
+                + context!!.resources.getString(R.string.tb_permission_dialog_instructions_tv, U.getAppName(context)),
+                R.string.tb_action_open_settings
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testShowPermissionDialogNormal() {
+        testShowPermissionDialog(
+                false, context!!.resources.getString(R.string.tb_permission_dialog_message, U.getAppName(context))
+                + context!!.resources.getString(R.string.tb_permission_dialog_instructions_phone),
+                R.string.tb_action_grant_permission
+        )
+    }
+
+    @Throws(Exception::class)
+    private fun testShowPermissionDialog(hasAndroidTVSettings: Boolean,
+                                         message: String,
+                                         buttonTextResId: Int) {
+        val onError = RunnableHooker()
+        val onFinish = RunnableHooker()
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`<Any>(U::class.java, "hasAndroidTVSettings", context).thenReturn(hasAndroidTVSettings)
+        val dialog = U.showPermissionDialog(context, Callbacks(onError, onFinish))
+        val shadowDialog = Shadows.shadowOf(dialog)
+        val resources = context!!.resources
+        Assert.assertEquals(
+                resources.getString(R.string.tb_permission_dialog_title),
+                shadowDialog.title
+        )
+        Assert.assertEquals(message, shadowDialog.message)
+        val positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
+        Assert.assertEquals(resources.getString(buttonTextResId), positiveButton.text)
+        Assert.assertFalse(shadowDialog.isCancelable)
+        positiveButton.performClick()
+        Assert.assertTrue(onFinish.hasRun())
+        Assert.assertFalse(onError.hasRun())
+    }
+
+    @Test
+    fun testShowErrorDialog() {
+        val onFinish = RunnableHooker()
+        val appOpCommand = "app-op-command"
+        val dialog = ReflectionHelpers.callStaticMethod<AlertDialog>(
+                U::class.java,
+                "showErrorDialog",
+                ClassParameter.from(Context::class.java, context),
+                ClassParameter.from(String::class.java, appOpCommand),
+                ClassParameter.from(Callbacks::class.java, Callbacks(null, onFinish))
+        )
+        val shadowDialog = Shadows.shadowOf(dialog)
+        val resources = context!!.resources
+        Assert.assertEquals(
+                resources.getString(R.string.tb_error_dialog_title),
+                shadowDialog.title
+        )
+        Assert.assertEquals(
+                resources.getString(
+                        R.string.tb_error_dialog_message,
+                        context!!.packageName,
+                        appOpCommand
+                ),
+                shadowDialog.message
+        )
+        val button = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
+        Assert.assertEquals(resources.getString(R.string.tb_action_ok), button.text)
+        Assert.assertFalse(shadowDialog.isCancelable)
+        button.performClick()
+        Assert.assertTrue(onFinish.hasRun())
+    }
+
+    @Test
+    fun testSendAccessibilityActionWithServiceNotEnabledAndGrantedPermission() {
+        testSendAccessibilityAction(false, true, true)
+    }
+
+    @Test
+    fun testSendAccessibilityActionWithServiceEnabled() {
+        testSendAccessibilityAction(true, false, true)
+    }
+
+    @Test
+    fun testSendAccessibilityActionWithServiceNotEnabledAndWithoutPermission() {
+        testSendAccessibilityAction(false, false, false)
+    }
+
+    private fun testSendAccessibilityAction(serviceEnabled: Boolean,
+                                            hasPermission: Boolean,
+                                            hasRun: Boolean) {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.isAccessibilityServiceEnabled(context)).thenReturn(serviceEnabled)
+        PowerMockito.`when`(U.hasWriteSecureSettingsPermission(context)).thenReturn(hasPermission)
+        val onComplete = RunnableHooker()
+        U.sendAccessibilityAction(
+                context, AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN, onComplete
+        )
+        // Run all delayed message.
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks()
+        Assert.assertEquals(hasRun, onComplete.hasRun())
+    }
+
+    @Test
+    fun testIsAccessibilityServiceEnabled() {
+        val enabledServices = Settings.Secure.getString(
+                context!!.contentResolver,
+                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
+        )
+        val componentName = ComponentName(context!!, PowerMenuService::class.java)
+        val flattenString = componentName.flattenToString()
+        val flattenShortString = componentName.flattenToShortString()
+        val newEnabledService = enabledServices?.replace(":" + flattenString.toRegex(), "")?.replace(":" + flattenShortString.toRegex(), "")?.replace(flattenString.toRegex(), "")?.replace(flattenShortString.toRegex(), "")
+                ?: ""
+        Settings.Secure.putString(
+                context!!.contentResolver,
+                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+                newEnabledService
+        )
+        Assert.assertFalse(U.isAccessibilityServiceEnabled(context))
+        Settings.Secure.putString(
+                context!!.contentResolver,
+                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+                "$newEnabledService:$flattenString"
+        )
+        Assert.assertTrue(U.isAccessibilityServiceEnabled(context))
+        Settings.Secure.putString(
+                context!!.contentResolver,
+                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+                "$newEnabledService:$flattenShortString"
+        )
+        Assert.assertTrue(U.isAccessibilityServiceEnabled(context))
+        Settings.Secure.putString(
+                context!!.contentResolver,
+                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+                enabledServices
+        )
+    }
+
+    @Test
+    fun testHasWriteSecureSettingsPermissionForMarshmallowAndAboveVersion() {
+        Assert.assertFalse(U.hasWriteSecureSettingsPermission(context))
+        val application = ApplicationProvider.getApplicationContext<Application>()
+        val shadowApplication = Shadows.shadowOf(application)
+        shadowApplication.grantPermissions(Manifest.permission.WRITE_SECURE_SETTINGS)
+        Assert.assertTrue(U.hasWriteSecureSettingsPermission(context))
+    }
+
+    @Test
+    @Config(sdk = [21])
+    fun testHasWriteSecureSettingsPermissionVersionBelowMarshmallow() {
+        val application = ApplicationProvider.getApplicationContext<Application>()
+        val shadowApplication = Shadows.shadowOf(application)
+        shadowApplication.grantPermissions(Manifest.permission.WRITE_SECURE_SETTINGS)
+        Assert.assertFalse(U.hasWriteSecureSettingsPermission(context))
+    }
+
+    @Test
+    fun testShowToast() {
+        U.showToast(context, R.string.tb_pin_shortcut_not_supported)
+        val toast = ShadowToast.getLatestToast()
+        Assert.assertEquals(Toast.LENGTH_SHORT.toLong(), toast.duration.toLong())
+        Assert.assertEquals(
+                context!!.resources.getString(R.string.tb_pin_shortcut_not_supported),
+                ShadowToast.getTextOfLatestToast()
+        )
+    }
+
+    @Test
+    fun testShowLongToast() {
+        U.showToastLong(context, R.string.tb_pin_shortcut_not_supported)
+        val toast = ShadowToast.getLatestToast()
+        Assert.assertEquals(Toast.LENGTH_LONG.toLong(), toast.duration.toLong())
+        Assert.assertEquals(
+                context!!.resources.getString(R.string.tb_pin_shortcut_not_supported),
+                ShadowToast.getTextOfLatestToast()
+        )
+    }
+
+    @Test
+    fun testCancelToast() {
+        U.showToastLong(context, R.string.tb_pin_shortcut_not_supported)
+        val shadowToast = Shadows.shadowOf(ShadowToast.getLatestToast())
+        Assert.assertFalse(shadowToast.isCancelled)
+        U.cancelToast()
+        Assert.assertTrue(shadowToast.isCancelled)
+    }
+
+    @Test
+    fun testCanEnableFreeformWithNougatAndAboveVersion() {
+        Assert.assertTrue(U.canEnableFreeform())
+    }
+
+    @Test
+    @Config(sdk = [23])
+    fun testCanEnableFreeformWithMarshmallowAndBelowVersion() {
+        Assert.assertFalse(U.canEnableFreeform())
+    }
+
+    @Test
+    fun testHasFreeformSupportWithoutFreeformEnabled() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(false)
+        Assert.assertFalse(U.canEnableFreeform())
+    }
+
+    @Test
+    fun testHasFreeformSupportWithFreeformEnabledAndNMR1AboveVersion() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(true)
+        Assert.assertFalse(U.hasFreeformSupport(context))
+        // Case 1, system has feature freeform.
+        val packageManager = context!!.packageManager
+        val shadowPackageManager = Shadows.shadowOf(packageManager)
+        shadowPackageManager
+                .setSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT, true)
+        Assert.assertTrue(U.hasFreeformSupport(context))
+        shadowPackageManager
+                .setSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT, false)
+        // Case 2, enable_freeform_support in Settings.Global is not 0
+        Settings.Global.putInt(context!!.contentResolver, "enable_freeform_support", 1)
+        Assert.assertTrue(U.hasFreeformSupport(context))
+        Settings.Global.putInt(context!!.contentResolver, "enable_freeform_support", 0)
+    }
+
+    @Test
+    @Config(sdk = [25])
+    fun testHasFreeformSupportWithFreeformEnabledAndNMR1AndBelowVersion() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(true)
+        Assert.assertFalse(U.hasFreeformSupport(context))
+        // Case 3, version is less than or equal to N_MRI, and force_resizable_activities
+        // in Settings.Global is not 0
+        Settings.Global.putInt(context!!.contentResolver, "force_resizable_activities", 1)
+        Assert.assertTrue(U.hasFreeformSupport(context))
+        Settings.Global.putInt(context!!.contentResolver, "force_resizable_activities", 0)
+    }
+
+    @Test
+    fun testCanBootToFreeform() {
+        PowerMockito.spy(U::class.java)
+        val hasFreeformSupportAnswer = BooleanAnswer()
+        val isOverridingFreeformHackAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.hasFreeformSupport(context)).thenAnswer(hasFreeformSupportAnswer)
+        PowerMockito.`when`(U.isOverridingFreeformHack(context, true)).thenAnswer(isOverridingFreeformHackAnswer)
+        // Case 1, all return true
+        hasFreeformSupportAnswer.answer = true
+        isOverridingFreeformHackAnswer.answer = true
+        Assert.assertFalse(U.canBootToFreeform(context))
+        // Case 2, true, false
+        hasFreeformSupportAnswer.answer = true
+        isOverridingFreeformHackAnswer.answer = false
+        Assert.assertTrue(U.canBootToFreeform(context))
+        // Case 3, false, true
+        hasFreeformSupportAnswer.answer = false
+        isOverridingFreeformHackAnswer.answer = true
+        Assert.assertFalse(U.canBootToFreeform(context))
+        // Case 4, false, false
+        hasFreeformSupportAnswer.answer = false
+        isOverridingFreeformHackAnswer.answer = false
+        Assert.assertFalse(U.canBootToFreeform(context))
+    }
+
+    @Test
+    fun testIsSamsungDevice() {
+        ShadowBuild.setManufacturer("Samsung")
+        Assert.assertTrue(U.isSamsungDevice())
+        ShadowBuild.setManufacturer("samsung")
+        Assert.assertTrue(U.isSamsungDevice())
+        ShadowBuild.setManufacturer("UnSamsung")
+        Assert.assertFalse(U.isSamsungDevice())
+    }
+
+    @Test
+    fun testGetBackgroundTint() {
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit()
+                .putInt(Constants.PREF_BACKGROUND_TINT, Color.GREEN)
+                .putBoolean(Constants.PREF_SHOW_BACKGROUND, false)
+                .apply()
+        // If the SHOW_BACKGROUND is false, it use transparent to replace origin tint.
+        Assert.assertEquals(Color.TRANSPARENT.toLong(), U.getBackgroundTint(context).toLong())
+        prefs.edit()
+                .putInt(Constants.PREF_BACKGROUND_TINT, Color.GREEN)
+                .apply()
+        Assert.assertEquals(Color.GREEN.toLong(), U.getBackgroundTint(context).toLong())
+        prefs.edit().remove(Constants.PREF_BACKGROUND_TINT).apply()
+        Assert.assertEquals(
+                context!!.resources.getInteger(R.integer.tb_translucent_gray).toLong(),
+                U.getBackgroundTint(context)
+                        .toLong())
+    }
+
+    @Test
+    fun testAccentColor() {
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().remove(Constants.PREF_ACCENT_COLOR).apply()
+        Assert.assertEquals(
+                context!!.resources.getInteger(R.integer.tb_translucent_white).toLong(),
+                U.getAccentColor(context)
+                        .toLong())
+        prefs.edit().putInt(Constants.PREF_ACCENT_COLOR, Color.GREEN).apply()
+        Assert.assertEquals(Color.GREEN.toLong(), U.getAccentColor(context).toLong())
+    }
+
+    @Test
+    fun testCanDrawOverlaysWithMarshmallowAndAboveVersion() {
+        ShadowSettings.setCanDrawOverlays(true)
+        Assert.assertTrue(U.canDrawOverlays(context))
+        ShadowSettings.setCanDrawOverlays(false)
+        Assert.assertFalse(U.canDrawOverlays(context))
+    }
+
+    @Test
+    @Config(sdk = [22])
+    fun testCanDrawOverlaysWithMarshmallowBelowVersion() {
+        Assert.assertTrue(U.canDrawOverlays(context))
+    }
+
+    @Test
+    fun testIsGame() {
+        // We only test for un-support launching games fullscreen, because of
+        // we don't have a good method to test code with ApplicationInfo.
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_LAUNCH_GAMES_FULLSCREEN, false).apply()
+        Assert.assertFalse(U.isGame(context, context!!.packageName))
+        prefs.edit().putBoolean(Constants.PREF_LAUNCH_GAMES_FULLSCREEN, true).apply()
+        Assert.assertFalse(U.isGame(context, context!!.packageName))
+        Assert.assertFalse(U.isGame(context, context!!.packageName + "un-exist-package"))
+    }
+
+    @Test
+    fun testGetActivityOptionsWithPAndAboveVersion() {
+        testGetActivityOptions(0, 5, 1)
+    }
+
+    @Test
+    @Config(sdk = [27])
+    fun testGetActivityOptionsWithPBelowVersion() {
+        testGetActivityOptions(-1, 2, -1)
+    }
+
+    private fun testGetActivityOptions(defaultStackId: Int,
+                                       freeformStackId: Int,
+                                       stackIdWithoutBrokenApi: Int) {
+        PowerMockito.spy(U::class.java)
+        val hasBrokenSetLaunchBoundsApiAnswer = BooleanAnswer()
+        val isChromeOsAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.hasBrokenSetLaunchBoundsApi()).thenAnswer(hasBrokenSetLaunchBoundsApiAnswer)
+        PowerMockito.`when`(U.isChromeOs(context)).thenAnswer(isChromeOsAnswer)
+        val originFreeformHackActive = FreeformHackHelper.getInstance().isFreeformHackActive
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, null, false, defaultStackId
+        )
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, ApplicationType.APP_PORTRAIT, false, 1
+        )
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, ApplicationType.APP_PORTRAIT, true, freeformStackId
+        )
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, ApplicationType.APP_LANDSCAPE, false, 1
+        )
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, ApplicationType.APP_LANDSCAPE, true, freeformStackId
+        )
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, ApplicationType.APP_FULLSCREEN, false, 1
+        )
+        checkActivityOptionsStackIdForNonContextMenu(
+                context, ApplicationType.FREEFORM_HACK, false, freeformStackId
+        )
+        FreeformHackHelper.getInstance().isFreeformHackActive = originFreeformHackActive
+        hasBrokenSetLaunchBoundsApiAnswer.answer = true
+        checkActivityOptionsStackIdForContextMenu(context, 1)
+        hasBrokenSetLaunchBoundsApiAnswer.answer = false
+        isChromeOsAnswer.answer = false
+        checkActivityOptionsStackIdForContextMenu(context, stackIdWithoutBrokenApi)
+        isChromeOsAnswer.answer = true
+        checkActivityOptionsStackIdForContextMenu(context, -1)
+    }
+
+    private fun checkActivityOptionsStackIdForContextMenu(context: Context?,
+                                                          stackId: Int) {
+        val options = U.getActivityOptions(context, ApplicationType.CONTEXT_MENU, null)
+        Assert.assertEquals(stackId.toLong(), getActivityOptionsStackId(options).toLong())
+    }
+
+    private fun checkActivityOptionsStackIdForNonContextMenu(context: Context?,
+                                                             applicationType: ApplicationType?,
+                                                             isFreeformHackActive: Boolean,
+                                                             stackId: Int) {
+        FreeformHackHelper.getInstance().isFreeformHackActive = isFreeformHackActive
+        val options = U.getActivityOptions(context, applicationType, null)
+        Assert.assertEquals(stackId.toLong(), getActivityOptionsStackId(options).toLong())
+    }
+
+    private fun getActivityOptionsStackId(options: ActivityOptions): Int {
+        val methodName: String
+        methodName = if (U.getCurrentApiVersion() >= 28.0f) {
+            "getLaunchWindowingMode"
+        } else {
+            "getLaunchStackId"
+        }
+        return ReflectionHelpers.callInstanceMethod(options, methodName)
+    }
+
+    @Test
+    fun testIsChromeOs() {
+        val packageManager = context!!.packageManager
+        val shadowPackageManager = Shadows.shadowOf(packageManager)
+        shadowPackageManager.setSystemFeature("org.chromium.arc", true)
+        Assert.assertTrue(U.isChromeOs(context))
+        shadowPackageManager.setSystemFeature("org.chromium.arc", false)
+        Assert.assertFalse(U.isChromeOs(context))
+    }
+
+    @Test
+    @Config(qualifiers = "sw720dp")
+    fun testGetBaseTaskbarSizeWithSW720dp() {
+        PowerMockito.spy(U::class.java)
+        val isSystemTrayEnabledAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.isSystemTrayEnabled(context)).thenAnswer(isSystemTrayEnabledAnswer)
+        isSystemTrayEnabledAnswer.answer = false
+        // The only difference of the different screen size, is the initial taskbar size.
+        // So we only test the different in this test method.
+        var initialSize = context!!.resources.getDimension(R.dimen.tb_base_size_start_plus_divider)
+        initialSize += context!!.resources.getDimension(R.dimen.tb_base_size_collapse_button)
+        initialSize += context!!.resources.getDimension(R.dimen.tb_dashboard_button_size)
+        Assert.assertEquals(initialSize, U.getBaseTaskbarSize(context), 0f)
+    }
+
+    @Test
+    fun testGetBaseTaskbarSizeWithNormalDimension() {
+        PowerMockito.spy(U::class.java)
+        val isSystemTrayEnabledAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.isSystemTrayEnabled(context)).thenAnswer(isSystemTrayEnabledAnswer)
+        isSystemTrayEnabledAnswer.answer = false
+        var initialSize = context!!.resources.getDimension(R.dimen.tb_base_size_start_plus_divider)
+        initialSize += context!!.resources.getDimension(R.dimen.tb_base_size_collapse_button)
+        Assert.assertEquals(initialSize, U.getBaseTaskbarSize(context), 0f)
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_DASHBOARD, true).apply()
+        val dashboardButtonSize = context!!.resources.getDimension(R.dimen.tb_dashboard_button_size)
+        Assert.assertEquals(initialSize + dashboardButtonSize, U.getBaseTaskbarSize(context), 0f)
+        prefs.edit().remove(Constants.PREF_DASHBOARD).apply()
+        val navbarButtonsMargin = context!!.resources.getDimension(R.dimen.tb_navbar_buttons_margin)
+        val iconSize = context!!.resources.getDimension(R.dimen.tb_icon_size)
+        prefs.edit().putBoolean(Constants.PREF_BUTTON_BACK, true).apply()
+        Assert.assertEquals(
+                initialSize + navbarButtonsMargin + iconSize,
+                U.getBaseTaskbarSize(context), 0f)
+        prefs.edit().remove(Constants.PREF_BUTTON_BACK).apply()
+        prefs.edit().putBoolean(Constants.PREF_BUTTON_HOME, true).apply()
+        Assert.assertEquals(
+                initialSize + navbarButtonsMargin + iconSize,
+                U.getBaseTaskbarSize(context), 0f)
+        prefs.edit().remove(Constants.PREF_BUTTON_HOME).apply()
+        prefs.edit().putBoolean(Constants.PREF_BUTTON_RECENTS, true).apply()
+        Assert.assertEquals(
+                initialSize + navbarButtonsMargin + iconSize,
+                U.getBaseTaskbarSize(context), 0f)
+        prefs.edit().remove(Constants.PREF_BUTTON_RECENTS).apply()
+        isSystemTrayEnabledAnswer.answer = true
+        val systemTraySize = context!!.resources.getDimension(R.dimen.tb_systray_size)
+        Assert.assertEquals(initialSize + systemTraySize, U.getBaseTaskbarSize(context), 0f)
+    }
+
+    @Test
+    fun testInitPrefsForBlissOS() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.isBlissOs(ArgumentMatchers.any(Context::class.java))).thenReturn(true)
+        Assert.assertTrue(U.isBlissOs(context))
+        val prefs = U.getSharedPreferences(context)
+        Assert.assertFalse(prefs.getBoolean(Constants.PREF_BLISS_OS_PREFS, false))
+        U.initPrefs(context)
+        Assert.assertEquals(
+                Constants.PREF_RECENTS_AMOUNT_RUNNING_APPS_ONLY,
+                prefs.getString(Constants.PREF_RECENTS_AMOUNT, "")
+        )
+        Assert.assertEquals("0", prefs.getString(Constants.PREF_REFRESH_FREQUENCY, ""))
+        Assert.assertEquals("2147483647", prefs.getString(Constants.PREF_MAX_NUM_OF_RECENTS, ""))
+        Assert.assertEquals("true", prefs.getString(Constants.PREF_SORT_ORDER, ""))
+        Assert.assertEquals(
+                Constants.PREF_START_BUTTON_IMAGE_APP_LOGO,
+                prefs.getString(Constants.PREF_START_BUTTON_IMAGE, "")
+        )
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_BUTTON_BACK, false))
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_BUTTON_HOME, false))
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_BUTTON_RECENTS, false))
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_AUTO_HIDE_NAVBAR, false))
+        Assert.assertFalse(prefs.getBoolean(Constants.PREF_SHORTCUT_ICON, true))
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_BLISS_OS_PREFS, false))
+        prefs.edit().putBoolean(Constants.PREF_BLISS_OS_PREFS, false)
+    }
+
+    @Test
+    fun testInitPrefsForNormalWithCanEnableFreeformAndHackOverrideFalse() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(true)
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_FREEFORM_HACK_OVERRIDE, false).apply()
+        U.initPrefs(context)
+        Assert.assertEquals(
+                U.hasFreeformSupport(context) && !U.isSamsungDevice(),
+                prefs.getBoolean(Constants.PREF_FREEFORM_HACK, false)
+        )
+        Assert.assertFalse(prefs.getBoolean(Constants.PREF_SAVE_WINDOW_SIZES, true))
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_FREEFORM_HACK_OVERRIDE, false))
+    }
+
+    @Test
+    fun testInitPrefsForNormalWithCanEnableFreeformAndHackOverrideTrueButNoSupport() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(true)
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_FREEFORM_HACK_OVERRIDE, true).apply()
+        PowerMockito.`when`(U.hasFreeformSupport(context)).thenReturn(false)
+        U.initPrefs(context)
+        Assert.assertFalse(prefs.getBoolean(Constants.PREF_FREEFORM_HACK, false))
+    }
+
+    @Test
+    fun testInitPrefsForNormalWithCantEnableFreeform() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.canEnableFreeform()).thenReturn(false)
+        val prefs = U.getSharedPreferences(context)
+        U.initPrefs(context)
+        Assert.assertFalse(prefs.getBoolean(Constants.PREF_FREEFORM_HACK, false))
+        prefs.edit()
+                .putBoolean(Constants.PREF_FREEFORM_HACK, false)
+                .putBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false)
+                .apply()
+        U.initPrefs(context)
+        Assert.assertFalse(prefs.getBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false))
+        prefs.edit()
+                .putBoolean(Constants.PREF_FREEFORM_HACK, true)
+                .putBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false)
+                .apply()
+        U.initPrefs(context)
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false))
+        prefs.edit()
+                .putBoolean(Constants.PREF_FREEFORM_HACK, false)
+                .putBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, true)
+                .apply()
+        U.initPrefs(context)
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false))
+        prefs.edit()
+                .putBoolean(Constants.PREF_FREEFORM_HACK, true)
+                .putBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, true)
+                .apply()
+        U.initPrefs(context)
+        Assert.assertTrue(prefs.getBoolean(Constants.PREF_SHOW_FREEFORM_DISABLED_MESSAGE, false))
+    }
+
+    @Test
+    fun testIsOverridingFreeformHackForPAndAboveVersion() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.isChromeOs(context)).thenReturn(false)
+        // Check preferences
+        Assert.assertFalse(U.isOverridingFreeformHack(context, true))
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        Assert.assertTrue(U.isOverridingFreeformHack(context, true))
+        prefs.edit().remove(Constants.PREF_FREEFORM_HACK).apply()
+
+        // Don't check preferences
+        Assert.assertTrue(U.isOverridingFreeformHack(context, false))
+    }
+
+    @Test
+    @Config(sdk = [27])
+    fun testIsOverridingFreeformHackForPBelowVersion() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.isChromeOs(context)).thenReturn(false)
+        // Check preferences
+        Assert.assertFalse(U.isOverridingFreeformHack(context, true))
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        Assert.assertFalse(U.isOverridingFreeformHack(context, true))
+        prefs.edit().remove(Constants.PREF_FREEFORM_HACK).apply()
+
+        // Don't check preferences
+        Assert.assertFalse(U.isOverridingFreeformHack(context, false))
+    }
+
+    @Test
+    fun testIsOverridingFreeformHackForChromeOS() {
+        PowerMockito.spy(U::class.java)
+        PowerMockito.`when`(U.isChromeOs(context)).thenReturn(true)
+        // Check preferences
+        Assert.assertFalse(U.isOverridingFreeformHack(context, true))
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_FREEFORM_HACK, true).apply()
+        // The default PREF_CHROME_OS_CONTEXT_MENU_FIX is true
+        Assert.assertTrue(U.isOverridingFreeformHack(context, true))
+        prefs.edit().putBoolean(Constants.PREF_CHROME_OS_CONTEXT_MENU_FIX, false).apply()
+        Assert.assertFalse(U.isOverridingFreeformHack(context, true))
+        prefs.edit().putBoolean(Constants.PREF_CHROME_OS_CONTEXT_MENU_FIX, true).apply()
+        Assert.assertTrue(U.isOverridingFreeformHack(context, true))
+        prefs.edit().remove(Constants.PREF_FREEFORM_HACK).apply()
+        prefs.edit().remove(Constants.PREF_CHROME_OS_CONTEXT_MENU_FIX).apply()
+
+        // Don't check preferences
+        Assert.assertTrue(U.isOverridingFreeformHack(context, false))
+        prefs.edit().putBoolean(Constants.PREF_CHROME_OS_CONTEXT_MENU_FIX, false).apply()
+        Assert.assertFalse(U.isOverridingFreeformHack(context, false))
+        prefs.edit().putBoolean(Constants.PREF_CHROME_OS_CONTEXT_MENU_FIX, true).apply()
+        Assert.assertTrue(U.isOverridingFreeformHack(context, false))
+        prefs.edit().remove(Constants.PREF_CHROME_OS_CONTEXT_MENU_FIX).apply()
+    }
+
+    @Test
+    @Config(sdk = [25])
+    fun testHasBrokenSetLaunchBoundsApiForApi25() {
+        Assert.assertFalse(U.hasBrokenSetLaunchBoundsApi())
+    }
+
+    @Test
+    @Config(sdk = [26])
+    @Throws(Exception::class)
+    fun testHasBrokenSetLaunchBoundsApiForApi26() {
+        testHasBrokenSetLaunchBoundsApiWithValidApiVersion()
+    }
+
+    @Test
+    @Config(sdk = [27])
+    @Throws(Exception::class)
+    fun testHasBrokenSetLaunchBoundsApiForApi27() {
+        testHasBrokenSetLaunchBoundsApiWithValidApiVersion()
+        testHasBrokenSetLaunchBoundsApiWithValidApiVersion()
+    }
+
+    @Test
+    @Config(sdk = [28])
+    fun testHasBrokenSetLaunchBoundsApiForApi28() {
+        Assert.assertFalse(U.hasBrokenSetLaunchBoundsApi())
+    }
+
+    @Throws(Exception::class)
+    private fun testHasBrokenSetLaunchBoundsApiWithValidApiVersion() {
+        PowerMockito.spy(U::class.java)
+        val isSamsungDeviceAnswer = BooleanAnswer()
+        val isNvidiaDevice = BooleanAnswer()
+        PowerMockito.`when`(U.isSamsungDevice()).thenAnswer(isSamsungDeviceAnswer)
+        PowerMockito.`when`<Any>(U::class.java, "isNvidiaDevice").thenAnswer(isNvidiaDevice)
+        isSamsungDeviceAnswer.answer = false
+        isNvidiaDevice.answer = false
+        Assert.assertTrue(U.hasBrokenSetLaunchBoundsApi())
+        isSamsungDeviceAnswer.answer = false
+        isNvidiaDevice.answer = true
+        Assert.assertFalse(U.hasBrokenSetLaunchBoundsApi())
+        isSamsungDeviceAnswer.answer = true
+        isNvidiaDevice.answer = false
+        Assert.assertFalse(U.hasBrokenSetLaunchBoundsApi())
+        isSamsungDeviceAnswer.answer = true
+        isNvidiaDevice.answer = true
+        Assert.assertFalse(U.hasBrokenSetLaunchBoundsApi())
+    }
+
+    @Test
+    fun testWrapContext() {
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putString(Constants.PREF_THEME, "light").apply()
+        var newContext = U.wrapContext(context)
+        var themeResource = ReflectionHelpers.getField<Int>(newContext, "mThemeResource")
+        Assert.assertNotNull(themeResource)
+        Assert.assertEquals(R.style.Taskbar.toLong(), (themeResource as Int).toLong())
+        prefs.edit().putString(Constants.PREF_THEME, "dark").apply()
+        newContext = U.wrapContext(context)
+        themeResource = ReflectionHelpers.getField(newContext, "mThemeResource")
+        Assert.assertNotNull(themeResource)
+        Assert.assertEquals(R.style.Taskbar_Dark.toLong(), (themeResource as Int).toLong())
+        prefs.edit().putString(Constants.PREF_THEME, "non-support").apply()
+        newContext = U.wrapContext(context)
+        Assert.assertTrue(newContext is ContextThemeWrapper)
+        prefs.edit().remove(Constants.PREF_THEME).apply()
+        newContext = U.wrapContext(context)
+        themeResource = ReflectionHelpers.getField(newContext, "mThemeResource")
+        Assert.assertNotNull(themeResource)
+        Assert.assertEquals(R.style.Taskbar.toLong(), (themeResource as Int).toLong())
+    }
+
+    @Test
+    fun testEnableFreeformModeShortcut() {
+        PowerMockito.spy(U::class.java)
+        val canEnableFreeformAnswer = BooleanAnswer()
+        val isOverridingFreeformHackAnswer = BooleanAnswer()
+        val isChromeOsAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.canEnableFreeform()).thenAnswer(canEnableFreeformAnswer)
+        PowerMockito.`when`(U.isOverridingFreeformHack(context, false))
+                .thenAnswer(isOverridingFreeformHackAnswer)
+        PowerMockito.`when`(U.isChromeOs(context)).thenAnswer(isChromeOsAnswer)
+        canEnableFreeformAnswer.answer = false
+        isOverridingFreeformHackAnswer.answer = false
+        isChromeOsAnswer.answer = false
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = false
+        isOverridingFreeformHackAnswer.answer = false
+        isChromeOsAnswer.answer = true
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = false
+        isOverridingFreeformHackAnswer.answer = true
+        isChromeOsAnswer.answer = false
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = false
+        isOverridingFreeformHackAnswer.answer = true
+        isChromeOsAnswer.answer = true
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = true
+        isOverridingFreeformHackAnswer.answer = false
+        isChromeOsAnswer.answer = false
+        Assert.assertTrue(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = true
+        isOverridingFreeformHackAnswer.answer = false
+        isChromeOsAnswer.answer = true
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = true
+        isOverridingFreeformHackAnswer.answer = true
+        isChromeOsAnswer.answer = false
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+        canEnableFreeformAnswer.answer = true
+        isOverridingFreeformHackAnswer.answer = true
+        isChromeOsAnswer.answer = true
+        Assert.assertFalse(U.enableFreeformModeShortcut(context))
+    }
+
+    @Test
+    @Config(sdk = [26])
+    fun testGetOverlayTypeForOAndAboveVersion() {
+        Assert.assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY.toLong(), U.getOverlayType().toLong())
+    }
+
+    @Test
+    @Config(sdk = [25])
+    fun testGetOverlayTypeForOBelowVersion() {
+        Assert.assertEquals(WindowManager.LayoutParams.TYPE_PHONE.toLong(), U.getOverlayType().toLong())
+    }
+
+    @Test
+    fun testGetDefaultStartButtonImage() {
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit().putBoolean(Constants.PREF_APP_DRAWER_ICON, true).apply()
+        Assert.assertEquals(Constants.PREF_START_BUTTON_IMAGE_APP_LOGO, U.getDefaultStartButtonImage(context))
+        prefs.edit().putBoolean(Constants.PREF_APP_DRAWER_ICON, false).apply()
+        Assert.assertEquals(Constants.PREF_START_BUTTON_IMAGE_DEFAULT, U.getDefaultStartButtonImage(context))
+        prefs.edit().remove(Constants.PREF_APP_DRAWER_ICON).apply()
+        Assert.assertEquals(Constants.PREF_START_BUTTON_IMAGE_DEFAULT, U.getDefaultStartButtonImage(context))
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testIsDesktopIconEnabled() {
+        PowerMockito.spy(U::class.java)
+        val canBootToFreeformAnswer = BooleanAnswer()
+        val shouldLaunchTouchAbsorberAnswer = BooleanAnswer()
+        PowerMockito.`when`<Any>(U::class.java, "canBootToFreeform", context, false)
+                .thenAnswer(canBootToFreeformAnswer)
+        PowerMockito.`when`<Any>(U::class.java, "shouldLaunchTouchAbsorber", context)
+                .thenAnswer(shouldLaunchTouchAbsorberAnswer)
+        canBootToFreeformAnswer.answer = false
+        shouldLaunchTouchAbsorberAnswer.answer = false
+        Assert.assertTrue(U.isDesktopIconsEnabled(context))
+        canBootToFreeformAnswer.answer = false
+        shouldLaunchTouchAbsorberAnswer.answer = true
+        Assert.assertFalse(U.isDesktopIconsEnabled(context))
+        canBootToFreeformAnswer.answer = true
+        shouldLaunchTouchAbsorberAnswer.answer = false
+        Assert.assertFalse(U.isDesktopIconsEnabled(context))
+        canBootToFreeformAnswer.answer = true
+        shouldLaunchTouchAbsorberAnswer.answer = true
+        Assert.assertFalse(U.isDesktopIconsEnabled(context))
+    }
+
+    @Test
+    @Config(sdk = [22])
+    fun testIsSystemTrayEnabledForMBelowVersion() {
+        val prefs = U.getSharedPreferences(context)
+        prefs.edit()
+                .putBoolean(Constants.PREF_SYS_TRAY, true)
+                .putBoolean(Constants.PREF_FULL_LENGTH, true)
+                .apply()
+        Assert.assertFalse(U.isSystemTrayEnabled(context))
+        prefs.edit().remove(Constants.PREF_SYS_TRAY).remove(Constants.PREF_FULL_LENGTH).apply()
+    }
+
+    @Test
+    fun testIsSystemTrayEnabledForMAndAboveVersion() {
+        val prefs = U.getSharedPreferences(context)
+        Assert.assertFalse(U.isSystemTrayEnabled(context))
+        prefs.edit().putBoolean(Constants.PREF_SYS_TRAY, true).apply()
+        Assert.assertTrue(U.isSystemTrayEnabled(context))
+        prefs.edit().putBoolean(Constants.PREF_FULL_LENGTH, false).apply()
+        Assert.assertFalse(U.isSystemTrayEnabled(context))
+        prefs.edit().putBoolean(Constants.PREF_FULL_LENGTH, true).apply()
+        Assert.assertTrue(U.isSystemTrayEnabled(context))
+        prefs.edit()
+                .putString(Constants.PREF_POSITION, Constants.POSITION_BOTTOM_VERTICAL_LEFT)
+                .putBoolean(Constants.PREF_ANCHOR, false)
+                .apply()
+        Assert.assertFalse(U.isSystemTrayEnabled(context))
+        prefs.edit().remove(Constants.PREF_POSITION).remove(Constants.PREF_ANCHOR).apply()
+    }
+
+    @Test
+    fun testApplyDisplayCutoutModeToWithPAndAboveVersion() {
+        val layoutParams = WindowManager.LayoutParams()
+        Assert.assertTrue(U.applyDisplayCutoutModeTo(layoutParams))
+        Assert.assertEquals(
+                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES.toLong(),
+                layoutParams.layoutInDisplayCutoutMode
+                        .toLong())
+    }
+
+    @Test
+    @Config(sdk = [27])
+    fun testApplyDisplayCutoutModeToWithBelowVersion() {
+        val layoutParams = WindowManager.LayoutParams()
+        Assert.assertFalse(U.applyDisplayCutoutModeTo(layoutParams))
+    }
+
+    @Test
+    fun testIsDesktopModeActive() {
+        PowerMockito.spy(U::class.java)
+        val isDesktopModeSupportedAnswer = BooleanAnswer()
+        val getExternalDisplayIdAnswer = IntAnswer()
+        val hasFreeformSupportAnswer = BooleanAnswer()
+        PowerMockito.`when`(U.isDesktopModeSupported(context)).thenAnswer(isDesktopModeSupportedAnswer)
+        PowerMockito.`when`(U.getExternalDisplayID(context)).thenAnswer(getExternalDisplayIdAnswer)
+        PowerMockito.`when`(U.hasFreeformSupport(context)).thenAnswer(hasFreeformSupportAnswer)
+        isDesktopModeSupportedAnswer.answer = false
+        Assert.assertFalse(U.isDesktopModeActive(context))
+        isDesktopModeSupportedAnswer.answer = true
+        Settings.Global.putInt(
+                context!!.contentResolver,
+                "force_desktop_mode_on_external_displays",
+                0
+        )
+        Assert.assertFalse(U.isDesktopModeActive(context))
+        Settings.Global.putInt(
+                context!!.contentResolver,
+                "force_desktop_mode_on_external_displays",
+                1
+        )
+        Assert.assertFalse(U.isDesktopModeActive(context))
+        getExternalDisplayIdAnswer.answer = 1
+        Assert.assertFalse(U.isDesktopModeActive(context))
+        hasFreeformSupportAnswer.answer = true
+        Assert.assertTrue(U.isDesktopModeActive(context))
+        Settings.Global.putInt(
+                context!!.contentResolver,
+                "force_desktop_mode_on_external_displays",
+                0
+        )
+    }
+
+    @Test
+    fun testSendBroadcast() {
+        val receiver = TestBroadcastReceiver()
+        val filter = IntentFilter(TestBroadcastReceiver.ACTION)
+        LocalBroadcastManager.getInstance(context!!).registerReceiver(receiver, filter)
+        U.sendBroadcast(context, TestBroadcastReceiver.ACTION)
+        Assert.assertTrue(receiver.onReceived)
+        receiver.onReceived = false
+        U.sendBroadcast(context, Intent(TestBroadcastReceiver.ACTION))
+        Assert.assertTrue(receiver.onReceived)
+    }
+
+    private class TestBroadcastReceiver : BroadcastReceiver() {
+        var onReceived = false
+        override fun onReceive(context: Context, intent: Intent) {
+            if (intent == null || ACTION != intent.action) {
+                return
+            }
+            onReceived = true
+        }
+
+        companion object {
+            const val ACTION = "test-broadcast-receiver-action"
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/widget/DashboardCellTest.java b/app/src/test/java/com/farmerbb/taskbar/widget/DashboardCellTest.java
deleted file mode 100644 (file)
index de74a17..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.farmerbb.taskbar.widget;
-
-import android.content.Context;
-import android.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.ViewConfiguration;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.farmerbb.taskbar.widget.DashboardCell.OnInterceptedLongPressListener;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-@RunWith(RobolectricTestRunner.class)
-public class DashboardCellTest {
-    private DashboardCell cell;
-    private Context context;
-    private TestOnInterceptedLongPressListener listener;
-    private int longPressTimeout;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        cell = new DashboardCell(context);
-        listener = new TestOnInterceptedLongPressListener();
-        cell.setOnInterceptedLongPressListener(listener);
-        longPressTimeout = ViewConfiguration.getLongPressTimeout();
-    }
-
-    @Test
-    public void testOnInterceptTouchEvent() {
-        long downTime = SystemClock.uptimeMillis();
-        dispatchTouchEvent(downTime, MotionEvent.ACTION_DOWN);
-        dispatchTouchEvent(downTime + longPressTimeout - 1, MotionEvent.ACTION_UP);
-        assertNull(listener.longPressedCell);
-        downTime = SystemClock.uptimeMillis();
-        dispatchTouchEvent(downTime, MotionEvent.ACTION_DOWN);
-        dispatchTouchEvent(downTime + longPressTimeout, MotionEvent.ACTION_UP);
-        assertNull(listener.longPressedCell);
-        downTime = SystemClock.uptimeMillis();
-        dispatchTouchEvent(downTime, MotionEvent.ACTION_DOWN);
-        dispatchTouchEvent(downTime + longPressTimeout + 1, MotionEvent.ACTION_UP);
-        assertNotNull(listener.longPressedCell);
-        assertSame(cell, listener.longPressedCell);
-    }
-
-    private void dispatchTouchEvent(long downTime, int event) {
-        float x = 0.0f;
-        float y = 0.0f;
-        int metaState = 0;
-        MotionEvent motionEvent = MotionEvent.obtain(downTime, downTime, event, x, y, metaState);
-        cell.onInterceptTouchEvent(motionEvent);
-    }
-
-    private static class TestOnInterceptedLongPressListener
-            implements OnInterceptedLongPressListener {
-        private DashboardCell longPressedCell;
-
-        @Override
-        public void onInterceptedLongPress(DashboardCell cell) {
-            longPressedCell = cell;
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/widget/DashboardCellTest.kt b/app/src/test/java/com/farmerbb/taskbar/widget/DashboardCellTest.kt
new file mode 100644 (file)
index 0000000..6ee594f
--- /dev/null
@@ -0,0 +1,62 @@
+package com.farmerbb.taskbar.widget
+
+import android.content.Context
+import android.os.SystemClock
+import android.view.MotionEvent
+import android.view.ViewConfiguration
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.widget.DashboardCell.OnInterceptedLongPressListener
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class DashboardCellTest {
+    private var cell: DashboardCell? = null
+    private var context: Context? = null
+    private var listener: TestOnInterceptedLongPressListener? = null
+    private var longPressTimeout = 0
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        cell = DashboardCell(context)
+        listener = TestOnInterceptedLongPressListener()
+        cell!!.setOnInterceptedLongPressListener(listener)
+        longPressTimeout = ViewConfiguration.getLongPressTimeout()
+    }
+
+    @Test
+    fun testOnInterceptTouchEvent() {
+        var downTime = SystemClock.uptimeMillis()
+        dispatchTouchEvent(downTime, MotionEvent.ACTION_DOWN)
+        dispatchTouchEvent(downTime + longPressTimeout - 1, MotionEvent.ACTION_UP)
+        Assert.assertNull(listener!!.longPressedCell)
+        downTime = SystemClock.uptimeMillis()
+        dispatchTouchEvent(downTime, MotionEvent.ACTION_DOWN)
+        dispatchTouchEvent(downTime + longPressTimeout, MotionEvent.ACTION_UP)
+        Assert.assertNull(listener!!.longPressedCell)
+        downTime = SystemClock.uptimeMillis()
+        dispatchTouchEvent(downTime, MotionEvent.ACTION_DOWN)
+        dispatchTouchEvent(downTime + longPressTimeout + 1, MotionEvent.ACTION_UP)
+        Assert.assertNotNull(listener!!.longPressedCell)
+        Assert.assertSame(cell, listener!!.longPressedCell)
+    }
+
+    private fun dispatchTouchEvent(downTime: Long, event: Int) {
+        val x = 0.0f
+        val y = 0.0f
+        val metaState = 0
+        val motionEvent = MotionEvent.obtain(downTime, downTime, event, x, y, metaState)
+        cell!!.onInterceptTouchEvent(motionEvent)
+    }
+
+    private class TestOnInterceptedLongPressListener : OnInterceptedLongPressListener {
+        var longPressedCell: DashboardCell? = null
+        override fun onInterceptedLongPress(cell: DashboardCell) {
+            longPressedCell = cell
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/farmerbb/taskbar/widget/StartMenuLayoutTest.java b/app/src/test/java/com/farmerbb/taskbar/widget/StartMenuLayoutTest.java
deleted file mode 100644 (file)
index 2fdf9d1..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.farmerbb.taskbar.widget;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.view.KeyEvent;
-
-import androidx.localbroadcastmanager.content.LocalBroadcastManager;
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.LooperMode;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import static com.farmerbb.taskbar.util.Constants.*;
-
-@RunWith(RobolectricTestRunner.class)
-@LooperMode(LooperMode.Mode.LEGACY)
-public class StartMenuLayoutTest {
-    private Context context;
-    private StartMenuLayout layout;
-
-    @Before
-    public void setUp() {
-        context = ApplicationProvider.getApplicationContext();
-        layout = new StartMenuLayout(context);
-    }
-
-    @Test
-    public void testDispatchKeyEvent() {
-        IntentFilter filter = new IntentFilter(ACTION_HIDE_START_MENU);
-        TestBroadcastReceiver receiver = new TestBroadcastReceiver();
-        LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter);
-        KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
-        layout.dispatchKeyEvent(keyEvent);
-        assertFalse(receiver.onReceived);
-        layout.viewHandlesBackButton();
-        layout.dispatchKeyEvent(keyEvent);
-        assertTrue(receiver.onReceived);
-    }
-
-    private static class TestBroadcastReceiver extends BroadcastReceiver {
-        private boolean onReceived;
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent == null || !ACTION_HIDE_START_MENU.equals(intent.getAction())) {
-                return;
-            }
-            onReceived = true;
-        }
-    }
-}
diff --git a/app/src/test/java/com/farmerbb/taskbar/widget/StartMenuLayoutTest.kt b/app/src/test/java/com/farmerbb/taskbar/widget/StartMenuLayoutTest.kt
new file mode 100644 (file)
index 0000000..3d589ec
--- /dev/null
@@ -0,0 +1,52 @@
+package com.farmerbb.taskbar.widget
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.view.KeyEvent
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import androidx.test.core.app.ApplicationProvider
+import com.farmerbb.taskbar.util.Constants
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.LooperMode
+
+@RunWith(RobolectricTestRunner::class)
+@LooperMode(LooperMode.Mode.LEGACY)
+class StartMenuLayoutTest {
+    private var context: Context? = null
+    private var layout: StartMenuLayout? = null
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        layout = StartMenuLayout(context)
+    }
+
+    @Test
+    fun testDispatchKeyEvent() {
+        val filter = IntentFilter(Constants.ACTION_HIDE_START_MENU)
+        val receiver = TestBroadcastReceiver()
+        LocalBroadcastManager.getInstance(context!!).registerReceiver(receiver, filter)
+        val keyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)
+        layout!!.dispatchKeyEvent(keyEvent)
+        Assert.assertFalse(receiver.onReceived)
+        layout!!.viewHandlesBackButton()
+        layout!!.dispatchKeyEvent(keyEvent)
+        Assert.assertTrue(receiver.onReceived)
+    }
+
+    private class TestBroadcastReceiver : BroadcastReceiver() {
+        var onReceived = false
+        override fun onReceive(context: Context, intent: Intent) {
+            if (intent == null || Constants.ACTION_HIDE_START_MENU != intent.action) {
+                return
+            }
+            onReceived = true
+        }
+    }
+}
\ No newline at end of file
index 7de5171..7ae176c 100644 (file)
@@ -4,11 +4,13 @@ buildscript {
     repositories {
         google()
         jcenter()
+        mavenCentral()
         maven { url 'https://jitpack.io' }
     }
 
     dependencies {
         classpath "com.android.tools.build:gradle:${AGP_VERSION}"
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTILN_VERSION"
     }
 }
 
@@ -25,6 +27,7 @@ allprojects {
     repositories {
         jcenter()
         google()
+        mavenCentral()
     }
 }
 
index 853ebc4..b8a288f 100644 (file)
@@ -17,5 +17,7 @@ allprojects {
         MATERIAL_VERSION = "1.2.1"
         POWERMOCK_VERSION = "2.0.9"
         AGP_VERSION = "4.1.2"
+
+        KOTILN_VERSION = "1.3.72"
     }
 }