summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
author Govinda Wasserman <gwasserman@google.com> 2023-03-23 15:21:52 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-23 15:21:52 +0000
commitd600faec9328df33c867cfb64f0e8aa2c852bc0b (patch)
treea989fdbeab1a2ec9e875ebf6325934017842a087 /java
parente8ec1c134a6cbba0ff995a948cddaad0825f5569 (diff)
parent9f90b598713528b5a216c771acee7753ab10d953 (diff)
Merge "Adds a reciever for pin migration data" into udc-dev
Diffstat (limited to 'java')
-rw-r--r--java/src/com/android/intentresolver/ChooserPinMigrationReceiver.kt55
-rw-r--r--java/tests/src/com/android/intentresolver/ChooserPinMigrationReceiverTest.kt78
2 files changed, 133 insertions, 0 deletions
diff --git a/java/src/com/android/intentresolver/ChooserPinMigrationReceiver.kt b/java/src/com/android/intentresolver/ChooserPinMigrationReceiver.kt
new file mode 100644
index 00000000..a3ba2192
--- /dev/null
+++ b/java/src/com/android/intentresolver/ChooserPinMigrationReceiver.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import android.util.Log
+
+/**
+ * Broadcast receiver for receiving Chooser pin data from the legacy chooser.
+ *
+ * Unions the legacy pins with any existing pins. This receiver is protected by the ADD_CHOOSER_PINS
+ * permission. The receiver is required to have the RECEIVE_CHOOSER_PIN_MIGRATION to receive the
+ * broadcast.
+ */
+class ChooserPinMigrationReceiver(
+ private val pinnedSharedPrefsProvider: (Context) -> SharedPreferences =
+ { context -> ChooserActivity.getPinnedSharedPrefs(context) },
+) : BroadcastReceiver() {
+
+ override fun onReceive(context: Context, intent: Intent) {
+ val bundle = intent.extras ?: return
+ Log.i(TAG, "Starting migration")
+
+ val prefsEditor = pinnedSharedPrefsProvider.invoke(context).edit()
+ bundle.keySet().forEach { key ->
+ if(bundle.getBoolean(key)) {
+ prefsEditor.putBoolean(key, true)
+ }
+ }
+ prefsEditor.apply()
+
+ Log.i(TAG, "Migration complete")
+ }
+
+ companion object {
+ private const val TAG = "ChooserPinMigrationReceiver"
+ }
+} \ No newline at end of file
diff --git a/java/tests/src/com/android/intentresolver/ChooserPinMigrationReceiverTest.kt b/java/tests/src/com/android/intentresolver/ChooserPinMigrationReceiverTest.kt
new file mode 100644
index 00000000..1daee137
--- /dev/null
+++ b/java/tests/src/com/android/intentresolver/ChooserPinMigrationReceiverTest.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver
+
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@RunWith(AndroidJUnit4::class)
+class ChooserPinMigrationReceiverTest {
+
+ private lateinit var chooserPinMigrationReceiver: ChooserPinMigrationReceiver
+
+ @Mock private lateinit var mockContext: Context
+ @Mock private lateinit var mockSharedPreferences: SharedPreferences
+ @Mock private lateinit var mockSharedPreferencesEditor: SharedPreferences.Editor
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+
+ whenever(mockSharedPreferences.edit()).thenReturn(mockSharedPreferencesEditor)
+
+ chooserPinMigrationReceiver = ChooserPinMigrationReceiver { mockSharedPreferences }
+ }
+
+ @Test
+ fun onReceive_addsReceivedPins() {
+ // Arrange
+ val intent = Intent().apply {
+ putExtra("TestPackage/TestClass", true)
+ }
+
+ // Act
+ chooserPinMigrationReceiver.onReceive(mockContext, intent)
+
+ // Assert
+ verify(mockSharedPreferencesEditor).putBoolean(eq("TestPackage/TestClass"), eq(true))
+ verify(mockSharedPreferencesEditor).apply()
+ }
+
+ @Test
+ fun onReceive_ignoresUnpinnedEntries() {
+ // Arrange
+ val intent = Intent().apply {
+ putExtra("TestPackage/TestClass", false)
+ }
+
+ // Act
+ chooserPinMigrationReceiver.onReceive(mockContext, intent)
+
+ // Assert
+ verify(mockSharedPreferencesEditor).apply()
+ verifyNoMoreInteractions(mockSharedPreferencesEditor)
+ }
+} \ No newline at end of file