Merge "Adds unit tests for AppWidgetsRestoredReceiver" into main
diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java
index 55b8fcc..641fd83 100644
--- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java
+++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java
@@ -1,17 +1,20 @@
 package com.android.launcher3;
 
+import static com.android.launcher3.LauncherPrefs.APP_WIDGET_IDS;
+import static com.android.launcher3.LauncherPrefs.OLD_APP_WIDGET_IDS;
+
 import android.appwidget.AppWidgetManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.util.Log;
 
-import com.android.launcher3.provider.RestoreDbTask;
+import com.android.launcher3.util.IntArray;
 import com.android.launcher3.widget.LauncherWidgetHolder;
 
 public class AppWidgetsRestoredReceiver extends BroadcastReceiver {
 
-    private static final String TAG = "AWRestoredReceiver";
+    private static final String TAG = "AppWidgetsRestoredReceiver";
 
     @Override
     public void onReceive(final Context context, Intent intent) {
@@ -25,7 +28,9 @@
             final int[] oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS);
             final int[] newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
             if (oldIds != null && newIds != null && oldIds.length == newIds.length) {
-                RestoreDbTask.setRestoredAppWidgetIds(context, oldIds, newIds);
+                LauncherPrefs.get(context).putSync(
+                        OLD_APP_WIDGET_IDS.to(IntArray.wrap(oldIds).toConcatString()),
+                        APP_WIDGET_IDS.to(IntArray.wrap(newIds).toConcatString()));
             } else {
                 Log.e(TAG, "Invalid host restored received");
             }
diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java
index 10005e5..dbd13b3 100644
--- a/src/com/android/launcher3/provider/RestoreDbTask.java
+++ b/src/com/android/launcher3/provider/RestoreDbTask.java
@@ -529,13 +529,6 @@
         }
     }
 
-    public static void setRestoredAppWidgetIds(Context context, @NonNull int[] oldIds,
-            @NonNull int[] newIds) {
-        LauncherPrefs.get(context).putSync(
-                OLD_APP_WIDGET_IDS.to(IntArray.wrap(oldIds).toConcatString()),
-                APP_WIDGET_IDS.to(IntArray.wrap(newIds).toConcatString()));
-    }
-
     protected static void maybeOverrideShortcuts(Context context, ModelDbController controller,
             SQLiteDatabase db, long currentUser) {
         Map<String, LauncherActivityInfo> activityOverrides = ApiWrapper.getActivityOverrides(
diff --git a/tests/src/com/android/launcher3/AppWidgetsRestoredReceiverTest.kt b/tests/src/com/android/launcher3/AppWidgetsRestoredReceiverTest.kt
new file mode 100644
index 0000000..21abab4
--- /dev/null
+++ b/tests/src/com/android/launcher3/AppWidgetsRestoredReceiverTest.kt
@@ -0,0 +1,171 @@
+package com.android.launcher3
+
+import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED
+import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED
+import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS
+import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS
+import android.appwidget.AppWidgetManager.EXTRA_HOST_ID
+import android.content.Intent
+import android.platform.uiautomator_helpers.DeviceHelpers
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.LauncherPrefs.Companion.APP_WIDGET_IDS
+import com.android.launcher3.LauncherPrefs.Companion.OLD_APP_WIDGET_IDS
+import com.android.launcher3.util.IntArray
+import com.android.launcher3.util.LauncherModelHelper.TEST_PACKAGE
+import com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [AppWidgetsRestoredReceiver] */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class AppWidgetsRestoredReceiverTest {
+    private lateinit var launcherPrefs: LauncherPrefs
+    private lateinit var receiverUnderTest: AppWidgetsRestoredReceiver
+
+    @Before
+    fun setup() {
+        launcherPrefs = LauncherPrefs(DeviceHelpers.context)
+        receiverUnderTest = AppWidgetsRestoredReceiver()
+    }
+
+    @After
+    fun tearDown() {
+        launcherPrefs.remove(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)
+    }
+
+    @Test
+    fun `When AppWidgetsRestoredReceiver gets valid broadcast it sets old and new app widget ids`() {
+        // Given
+        val oldIds = intArrayOf(1, 2, 10)
+        val newIds = intArrayOf(10, 11, 12)
+        val expectedOldIds = IntArray.wrap(*oldIds).toConcatString()
+        val expectedNewIds = IntArray.wrap(*newIds).toConcatString()
+        val intent =
+            Intent().apply {
+                component = null
+                `package` = TEST_PACKAGE
+                action = ACTION_APPWIDGET_HOST_RESTORED
+                putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
+                putExtra(EXTRA_APPWIDGET_IDS, newIds)
+                putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
+            }
+
+        // When
+        receiverUnderTest.onReceive(DeviceHelpers.context, intent)
+
+        // Then
+        assertThat(launcherPrefs.get(OLD_APP_WIDGET_IDS)).isEqualTo(expectedOldIds)
+        assertThat(launcherPrefs.get(APP_WIDGET_IDS)).isEqualTo(expectedNewIds)
+    }
+
+    @Test
+    fun `AppWidgetsRestoredReceiver does not set widget ids when Intent action is invalid`() {
+        // Given
+        val oldIds = intArrayOf(1, 2, 10)
+        val newIds = intArrayOf(10, 11, 12)
+        val intent =
+            Intent().apply {
+                component = null
+                `package` = TEST_PACKAGE
+                action = ACTION_APPWIDGET_DELETED
+                putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
+                putExtra(EXTRA_APPWIDGET_IDS, newIds)
+                putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
+            }
+
+        // When
+        receiverUnderTest.onReceive(DeviceHelpers.context, intent)
+
+        // Then
+        assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
+    }
+
+    @Test
+    fun `AppWidgetsRestoredReceiver does not set widget ids when Intent host id is not Launcher`() {
+        // Given
+        val oldIds = intArrayOf(1, 2, 10)
+        val newIds = intArrayOf(10, 11, 12)
+        val intent =
+            Intent().apply {
+                component = null
+                `package` = TEST_PACKAGE
+                action = ACTION_APPWIDGET_HOST_RESTORED
+                putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
+                putExtra(EXTRA_APPWIDGET_IDS, newIds)
+                putExtra(EXTRA_HOST_ID, 999999999)
+            }
+
+        // When
+        receiverUnderTest.onReceive(DeviceHelpers.context, intent)
+
+        // Then
+        assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
+    }
+
+    @Test
+    fun `AppWidgetsRestoredReceiver does not set ids when new and old ids differ in length`() {
+        // Given
+        val oldIds = intArrayOf(10)
+        val newIds = intArrayOf(10, 11, 12)
+        val intent =
+            Intent().apply {
+                component = null
+                `package` = TEST_PACKAGE
+                action = ACTION_APPWIDGET_HOST_RESTORED
+                putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
+                putExtra(EXTRA_APPWIDGET_IDS, newIds)
+                putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
+            }
+
+        // When
+        receiverUnderTest.onReceive(DeviceHelpers.context, intent)
+
+        // Then
+        assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
+    }
+
+    @Test
+    fun `AppWidgetsRestoredReceiver does not set widget ids when old ids not set`() {
+        // Given
+        val newIds = intArrayOf(10, 11, 12)
+        val intent =
+            Intent().apply {
+                component = null
+                `package` = TEST_PACKAGE
+                action = ACTION_APPWIDGET_HOST_RESTORED
+                putExtra(EXTRA_APPWIDGET_IDS, newIds)
+                putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
+            }
+
+        // When
+        receiverUnderTest.onReceive(DeviceHelpers.context, intent)
+
+        // Then
+        assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
+    }
+
+    @Test
+    fun `AppWidgetsRestoredReceiver does not set widget ids when new ids not set`() {
+        // Given
+        val oldIds = intArrayOf(10, 11, 12)
+        val intent =
+            Intent().apply {
+                component = null
+                `package` = TEST_PACKAGE
+                action = ACTION_APPWIDGET_HOST_RESTORED
+                putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
+                putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
+            }
+
+        // When
+        receiverUnderTest.onReceive(DeviceHelpers.context, intent)
+
+        // Then
+        assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
+    }
+}
diff --git a/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java b/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
index a21c9b9..10d9133 100644
--- a/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
+++ b/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
@@ -60,6 +60,7 @@
 import com.android.launcher3.LauncherSettings;
 import com.android.launcher3.LauncherSettings.Favorites;
 import com.android.launcher3.model.ModelDbController;
+import com.android.launcher3.util.IntArray;
 import com.android.launcher3.util.LauncherModelHelper;
 
 import org.junit.After;
@@ -233,7 +234,7 @@
         mPrefs.remove(RESTORE_DEVICE);
 
         // When
-        RestoreDbTask.setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
+        setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
         mTask.restoreAppWidgetIdsIfExists(mContext, mMockController);
 
         // Then
@@ -255,7 +256,7 @@
         RestoreDbTask.setPending(mContext);
 
         // When
-        RestoreDbTask.setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
+        setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
         mTask.restoreAppWidgetIdsIfExists(mContext, mMockController);
 
         // Then
@@ -283,7 +284,7 @@
         RestoreDbTask.setPending(mContext);
 
         // When
-        RestoreDbTask.setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
+        setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
         mTask.restoreAppWidgetIdsIfExists(mContext, mMockController);
 
         // Then
@@ -402,4 +403,10 @@
             return index >= 0 ? users.keyAt(index) : -1;
         }
     }
+
+    private void setRestoredAppWidgetIds(Context context, int[] oldIds, int[] newIds) {
+        LauncherPrefs.get(context).putSync(
+                OLD_APP_WIDGET_IDS.to(IntArray.wrap(oldIds).toConcatString()),
+                APP_WIDGET_IDS.to(IntArray.wrap(newIds).toConcatString()));
+    }
 }