diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index 55b8fcc230..641fd834e2 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 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { 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 10005e5dfa..dbd13b38ad 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -529,13 +529,6 @@ public class RestoreDbTask { } } - 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 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 0000000000..21abab4d49 --- /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 a21c9b9693..10d9133902 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.LauncherPrefs; 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 @@ public class RestoreDbTaskTest { mPrefs.remove(RESTORE_DEVICE); // When - RestoreDbTask.setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds); + setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds); mTask.restoreAppWidgetIdsIfExists(mContext, mMockController); // Then @@ -255,7 +256,7 @@ public class RestoreDbTaskTest { RestoreDbTask.setPending(mContext); // When - RestoreDbTask.setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds); + setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds); mTask.restoreAppWidgetIdsIfExists(mContext, mMockController); // Then @@ -283,7 +284,7 @@ public class RestoreDbTaskTest { RestoreDbTask.setPending(mContext); // When - RestoreDbTask.setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds); + setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds); mTask.restoreAppWidgetIdsIfExists(mContext, mMockController); // Then @@ -402,4 +403,10 @@ public class RestoreDbTaskTest { 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())); + } }