OSDN Git Service

Extract method DashboardController#showPlaceholderToast
authorutzcoz <utzcoz@outlook.com>
Sat, 15 Aug 2020 07:43:07 +0000 (15:43 +0800)
committerutzcoz <utzcoz@outlook.com>
Sat, 15 Aug 2020 07:43:07 +0000 (15:43 +0800)
Test: ./gradlew test

Signed-off-by: utzcoz <utzcoz@outlook.com>
app/src/main/java/com/farmerbb/taskbar/ui/DashboardController.java
app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowAppWidgetManager.java [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowAppWidgetProviderInfo.java [new file with mode: 0644]
app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowLauncherApps.java
app/src/test/java/com/farmerbb/taskbar/ui/DashboardControllerTest.java

index 6069d77..f4972b5 100644 (file)
@@ -469,20 +469,8 @@ public class DashboardController extends UIController {
             intent.putExtra(EXTRA_CELL_ID, cellId);
             U.sendBroadcast(context, intent);
 
-            if(shouldShowPlaceholder) {
-                String providerName =
-                        pref.getString(generateProviderPrefKey(cellId), PREF_DEFAULT_NULL);
-                if(!providerName.equals(PREF_DEFAULT_NULL)) {
-                    ComponentName componentName = ComponentName.unflattenFromString(providerName);
-
-                    List<AppWidgetProviderInfo> providerInfoList = appWidgetManager.getInstalledProvidersForProfile(Process.myUserHandle());
-                    for(AppWidgetProviderInfo info : providerInfoList) {
-                        if(info.provider.equals(componentName)) {
-                            U.showToast(context, context.getString(R.string.tb_widget_restore_toast, info.loadLabel(context.getPackageManager())), Toast.LENGTH_SHORT);
-                            break;
-                        }
-                    }
-                }
+            if (shouldShowPlaceholder) {
+                showPlaceholderToast(context, appWidgetManager, cellId, pref);
             }
 
             previouslySelectedCell = -1;
@@ -506,6 +494,31 @@ public class DashboardController extends UIController {
         return PREF_DASHBOARD_WIDGET_PREFIX + cellId + PREF_DASHBOARD_WIDGET_PLACEHOLDER_SUFFIX;
     }
 
+    @VisibleForTesting
+    void showPlaceholderToast(Context context,
+                              AppWidgetManager appWidgetManager,
+                              int cellId,
+                              SharedPreferences pref) {
+        String providerName = pref.getString(generateProviderPrefKey(cellId), PREF_DEFAULT_NULL);
+        if (providerName != null && !PREF_DEFAULT_NULL.equals(providerName)) {
+            ComponentName componentName = ComponentName.unflattenFromString(providerName);
+
+            List<AppWidgetProviderInfo> providerInfoList =
+                    appWidgetManager.getInstalledProvidersForProfile(Process.myUserHandle());
+            for (AppWidgetProviderInfo info : providerInfoList) {
+                if (info.provider.equals(componentName)) {
+                    String text =
+                            context.getString(
+                                    R.string.tb_widget_restore_toast,
+                                    info.loadLabel(context.getPackageManager())
+                            );
+                    U.showToast(context, text, Toast.LENGTH_SHORT);
+                    break;
+                }
+            }
+        }
+    }
+
     private void cellLongClick(View view) {
         fadeOut(false);
 
diff --git a/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowAppWidgetManager.java b/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowAppWidgetManager.java
new file mode 100644 (file)
index 0000000..e20b0d1
--- /dev/null
@@ -0,0 +1,31 @@
+package com.farmerbb.taskbar.shadow;
+
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.os.UserHandle;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowAppWidgetManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Implements(AppWidgetManager.class)
+public class TaskbarShadowAppWidgetManager extends ShadowAppWidgetManager {
+    private Multimap<UserHandle, AppWidgetProviderInfo> installedProvidersForProfile =
+            HashMultimap.create();
+
+    public void addInstalledProvidersForProfile(UserHandle userHandle,
+                                                AppWidgetProviderInfo appWidgetProviderInfo) {
+        installedProvidersForProfile.put(userHandle, appWidgetProviderInfo);
+    }
+
+    @Implementation
+    protected List<AppWidgetProviderInfo> getInstalledProvidersForProfile(UserHandle profile) {
+        return new ArrayList<>(installedProvidersForProfile.get(profile));
+    }
+}
diff --git a/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowAppWidgetProviderInfo.java b/app/src/test/java/com/farmerbb/taskbar/shadow/TaskbarShadowAppWidgetProviderInfo.java
new file mode 100644 (file)
index 0000000..f1cac45
--- /dev/null
@@ -0,0 +1,17 @@
+package com.farmerbb.taskbar.shadow;
+
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.pm.PackageManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(AppWidgetProviderInfo.class)
+public class TaskbarShadowAppWidgetProviderInfo {
+    public String label = "";
+
+    @Implementation
+    protected final String loadLabel(PackageManager packageManager) {
+        return label;
+    }
+}
index 89619fe..8cc1ae2 100644 (file)
@@ -83,7 +83,7 @@ public class TaskbarShadowLauncherApps extends ShadowLauncherApps {
     }
 
     @Implementation
-    public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) {
+    protected List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) {
         List<LauncherActivityInfo> activityInfoList = activityList.get(user);
         if (activityInfoList == null || packageName == null) {
             return Collections.emptyList();
index ee3e59c..3fe1c0a 100644 (file)
@@ -1,9 +1,11 @@
 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.os.Process;
 import android.view.View;
 import android.widget.LinearLayout;
 
@@ -13,6 +15,8 @@ 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.shadow.TaskbarShadowAppWidgetManager;
+import com.farmerbb.taskbar.shadow.TaskbarShadowAppWidgetProviderInfo;
 import com.farmerbb.taskbar.util.TaskbarPosition;
 import com.farmerbb.taskbar.util.U;
 
@@ -26,11 +30,15 @@ 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.shadow.api.Shadow;
 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;
@@ -43,13 +51,15 @@ 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.mockito.ArgumentMatchers.any;
 import static org.powermock.api.mockito.PowerMockito.when;
+import static org.robolectric.Shadows.shadowOf;
 
 @RunWith(RobolectricTestRunner.class)
 @PowerMockIgnore({"org.mockito.*", "org.robolectric.*",
@@ -148,12 +158,7 @@ public class DashboardControllerTest {
         info.provider = new ComponentName(TEST_PACKAGE, TEST_NAME);
         int cellId = DEFAULT_TEST_CELL_ID;
         int appWidgetId = 100;
-        prefs.edit().putString(
-                PREF_DASHBOARD_WIDGET_PREFIX
-                        + cellId
-                        + PREF_DASHBOARD_WIDGET_PLACEHOLDER_SUFFIX,
-                ""
-        );
+        prefs.edit().putString(uiController.generateProviderPlaceholderPrefKey(cellId), "").apply();
         uiController.saveWidgetInfo(context, info, cellId, appWidgetId);
         assertEquals(
                 appWidgetId,
@@ -199,6 +204,46 @@ public class DashboardControllerTest {
         );
     }
 
+    @Test
+    @Config(shadows = {TaskbarShadowAppWidgetManager.class,
+            TaskbarShadowAppWidgetProviderInfo.class})
+    public void testShowPlaceholderToast() {
+        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+        int cellId = DEFAULT_TEST_CELL_ID;
+        String providerPrefKey = uiController.generateProviderPrefKey(cellId);
+
+        TaskbarShadowAppWidgetManager shadowAppWidgetManager =
+                (TaskbarShadowAppWidgetManager) shadowOf(appWidgetManager);
+        AppWidgetProviderInfo info = new AppWidgetProviderInfo();
+        info.provider = new ComponentName(TEST_PACKAGE, TEST_NAME);
+        TaskbarShadowAppWidgetProviderInfo shadowAppWidgetProviderInfo =
+                (TaskbarShadowAppWidgetProviderInfo) Shadow.extract(info);
+        shadowAppWidgetProviderInfo.label = TEST_LABEL;
+        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());