1 package com.android.launcher3
2 
3 import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED
4 import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED
5 import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS
6 import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS
7 import android.appwidget.AppWidgetManager.EXTRA_HOST_ID
8 import android.content.Intent
9 import android.platform.uiautomator_helpers.DeviceHelpers
10 import androidx.test.ext.junit.runners.AndroidJUnit4
11 import androidx.test.filters.SmallTest
12 import com.android.launcher3.LauncherPrefs.Companion.APP_WIDGET_IDS
13 import com.android.launcher3.LauncherPrefs.Companion.OLD_APP_WIDGET_IDS
14 import com.android.launcher3.util.IntArray
15 import com.android.launcher3.util.LauncherModelHelper.TEST_PACKAGE
16 import com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID
17 import com.google.common.truth.Truth.assertThat
18 import org.junit.After
19 import org.junit.Before
20 import org.junit.Test
21 import org.junit.runner.RunWith
22 
23 /** Tests for [AppWidgetsRestoredReceiver] */
24 @SmallTest
25 @RunWith(AndroidJUnit4::class)
26 class AppWidgetsRestoredReceiverTest {
27     private lateinit var launcherPrefs: LauncherPrefs
28     private lateinit var receiverUnderTest: AppWidgetsRestoredReceiver
29 
30     @Before
setupnull31     fun setup() {
32         launcherPrefs = LauncherPrefs(DeviceHelpers.context)
33         receiverUnderTest = AppWidgetsRestoredReceiver()
34     }
35 
36     @After
tearDownnull37     fun tearDown() {
38         launcherPrefs.remove(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)
39     }
40 
41     @Test
When AppWidgetsRestoredReceiver gets valid broadcast it sets old and new app widget idsnull42     fun `When AppWidgetsRestoredReceiver gets valid broadcast it sets old and new app widget ids`() {
43         // Given
44         val oldIds = intArrayOf(1, 2, 10)
45         val newIds = intArrayOf(10, 11, 12)
46         val expectedOldIds = IntArray.wrap(*oldIds).toConcatString()
47         val expectedNewIds = IntArray.wrap(*newIds).toConcatString()
48         val intent =
49             Intent().apply {
50                 component = null
51                 `package` = TEST_PACKAGE
52                 action = ACTION_APPWIDGET_HOST_RESTORED
53                 putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
54                 putExtra(EXTRA_APPWIDGET_IDS, newIds)
55                 putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
56             }
57 
58         // When
59         receiverUnderTest.onReceive(DeviceHelpers.context, intent)
60 
61         // Then
62         assertThat(launcherPrefs.get(OLD_APP_WIDGET_IDS)).isEqualTo(expectedOldIds)
63         assertThat(launcherPrefs.get(APP_WIDGET_IDS)).isEqualTo(expectedNewIds)
64     }
65 
66     @Test
AppWidgetsRestoredReceiver does not set widget ids when Intent action is invalidnull67     fun `AppWidgetsRestoredReceiver does not set widget ids when Intent action is invalid`() {
68         // Given
69         val oldIds = intArrayOf(1, 2, 10)
70         val newIds = intArrayOf(10, 11, 12)
71         val intent =
72             Intent().apply {
73                 component = null
74                 `package` = TEST_PACKAGE
75                 action = ACTION_APPWIDGET_DELETED
76                 putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
77                 putExtra(EXTRA_APPWIDGET_IDS, newIds)
78                 putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
79             }
80 
81         // When
82         receiverUnderTest.onReceive(DeviceHelpers.context, intent)
83 
84         // Then
85         assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
86     }
87 
88     @Test
AppWidgetsRestoredReceiver does not set widget ids when Intent host id is not Launchernull89     fun `AppWidgetsRestoredReceiver does not set widget ids when Intent host id is not Launcher`() {
90         // Given
91         val oldIds = intArrayOf(1, 2, 10)
92         val newIds = intArrayOf(10, 11, 12)
93         val intent =
94             Intent().apply {
95                 component = null
96                 `package` = TEST_PACKAGE
97                 action = ACTION_APPWIDGET_HOST_RESTORED
98                 putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
99                 putExtra(EXTRA_APPWIDGET_IDS, newIds)
100                 putExtra(EXTRA_HOST_ID, 999999999)
101             }
102 
103         // When
104         receiverUnderTest.onReceive(DeviceHelpers.context, intent)
105 
106         // Then
107         assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
108     }
109 
110     @Test
AppWidgetsRestoredReceiver does not set ids when new and old ids differ in lengthnull111     fun `AppWidgetsRestoredReceiver does not set ids when new and old ids differ in length`() {
112         // Given
113         val oldIds = intArrayOf(10)
114         val newIds = intArrayOf(10, 11, 12)
115         val intent =
116             Intent().apply {
117                 component = null
118                 `package` = TEST_PACKAGE
119                 action = ACTION_APPWIDGET_HOST_RESTORED
120                 putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
121                 putExtra(EXTRA_APPWIDGET_IDS, newIds)
122                 putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
123             }
124 
125         // When
126         receiverUnderTest.onReceive(DeviceHelpers.context, intent)
127 
128         // Then
129         assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
130     }
131 
132     @Test
AppWidgetsRestoredReceiver does not set widget ids when old ids not setnull133     fun `AppWidgetsRestoredReceiver does not set widget ids when old ids not set`() {
134         // Given
135         val newIds = intArrayOf(10, 11, 12)
136         val intent =
137             Intent().apply {
138                 component = null
139                 `package` = TEST_PACKAGE
140                 action = ACTION_APPWIDGET_HOST_RESTORED
141                 putExtra(EXTRA_APPWIDGET_IDS, newIds)
142                 putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
143             }
144 
145         // When
146         receiverUnderTest.onReceive(DeviceHelpers.context, intent)
147 
148         // Then
149         assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
150     }
151 
152     @Test
AppWidgetsRestoredReceiver does not set widget ids when new ids not setnull153     fun `AppWidgetsRestoredReceiver does not set widget ids when new ids not set`() {
154         // Given
155         val oldIds = intArrayOf(10, 11, 12)
156         val intent =
157             Intent().apply {
158                 component = null
159                 `package` = TEST_PACKAGE
160                 action = ACTION_APPWIDGET_HOST_RESTORED
161                 putExtra(EXTRA_APPWIDGET_OLD_IDS, oldIds)
162                 putExtra(EXTRA_HOST_ID, APPWIDGET_HOST_ID)
163             }
164 
165         // When
166         receiverUnderTest.onReceive(DeviceHelpers.context, intent)
167 
168         // Then
169         assertThat(launcherPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse()
170     }
171 }
172